Changeset 1020 for TI07-MOLES/trunk


Ignore:
Timestamp:
25/05/06 16:42:02 (13 years ago)
Author:
lawrence
Message:

More discovery (from browse) related improvments

Location:
TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/DIF.py

    r1006 r1020  
    1717        self.metadataType='DIF' 
    1818        self.xml=xml 
    19         self.elem=ET.fromstring(xml) 
     19        try: 
     20            self.elem=ET.fromstring(xml) 
     21        except: 
     22            # for some reason we can't parse the document ... 
     23            self.elem=None 
     24            return 
    2025        self.renderMethod=renderMethod 
    2126        self.type='DIF' 
     27        self.entryID=wrapGetText(self.elem,'Entry_ID') 
    2228         
    2329        self.abstract=wrapGetText(self.elem,'Summary') 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/DiscoveryWS.py

    r1006 r1020  
    99 
    1010DEBUG=1 
     11 
     12class DiscoveryState: 
     13    ''' This class holds the state associated with presenting multiple slices 
     14    of a large result set ''' 
     15    def __init__(self,sessionID,queryURL,hits,stride=10): 
     16        ''' On instantiation, provide 
     17                the backend sessionID 
     18                the application URL that produced this query 
     19                the stride through the result set ''' 
     20        self.queryURL=queryURL 
     21        self.sessionID=sessionID 
     22        self.hits=hits 
     23        self.offset=1 
     24        self.stride=10 
    1125 
    1226class DiscoveryWS: 
     
    4054        self.result=result['fullTextReturn'] 
    4155        if DEBUG: self.__performance() 
    42          
    43          
    44      
    45          
     56        return self.result['hits'] 
     57 
    4658    def Xquery(self,query): 
    4759        ''' Create a result set based on an xquery over the database ''' 
    4860        #this doesn't work properly ... 
    4961        result=self.srv.xquery(in0=query,in1=self.sessID) 
    50          
     62 
    5163    def SearchBoundingBox(self,bbox): 
    5264        ''' Obtain a result set from a spatial search using a bounding box ''' 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/People.py

    r1006 r1020  
    3535                    return '<a href="%s">%s</a>'%(r,n) 
    3636                else: return n 
    37             html='<p>'+prefix 
     37            html=prefix #para start? 
    3838            if self.data['personName']!='': 
    3939                if self.data['personEmail']!='': 
     
    4141                if self.data['personPhone']!='': html+='<br/>Phone: %s'%self.data['personPhone'] 
    4242            br='' 
    43             if html!='<p>': br='<br/>' #only need a linebreak if there is already content ... 
     43            if html!='': br='<br/>' #only need a linebreak if there is already content ... or '<p> 
    4444            if self.data['orgName']!='': 
    4545                    html+=br+makelink(self.data['orgURL'],self.data['orgName']) 
    4646            if self.data['searchlink']!='': html+='<br/>'+self.data['searchlink'] 
    47             html+='</p>' 
     47            html+='' # para end? 
    4848            return html 
    4949         
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/Utilities.py

    r963 r1020  
    6868        else: return rr[0]  
    6969 
    70  
     70def getURLdict(cgiFieldStorage): 
     71    ''' takes a cgi field storage object and converts it to a dictionary ''' 
     72    result={} 
     73    for item in cgiFieldStorage: 
     74        result[item]=cgiFieldStorage[item].value 
     75    return result 
    7176         
    7277 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browse.config

    r980 r1020  
    1414key:            /layout/key.gif 
    1515keyGrey:        /layout/keyG.gif 
     16selectI:        /layout/tick.png 
    1617 
    1718ndgLink:        http://ndg.nerc.ac.uk/ 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browseCGI.py

    r1006 r1020  
    1616from renderPage import renderPage 
    1717from renderDiscoverySet import renderDiscoverySet 
     18from htmlUtilities import selector,hyperlink 
    1819from Utilities import * 
    1920from ETxmlView import * 
     
    3536                self.cookie=Cookie.SimpleCookie(cookie) 
    3637                self.history=RingBuffer(10) 
    37                 self.__loadBrowseHistory() 
    38          
     38                self.selected=RingBuffer(5) 
     39               
     40                self.__load() 
     41                         
    3942        def __toXML(self): 
    40                 ''' Used to serialise the history into a cookie string ''' 
    41                 xml='<BH>' 
     43                ''' Used to serialise the session into a cookie string ''' 
     44                xml='<ndgCookie><bh>' 
    4245                for uri,name in self.getHistory(): 
    4346                        xml+='<i><u>%s</u><n>%s</n></i>'%(uri,name) 
    44                 xml+='</BH>' 
     47                xml+='</bh><sh>' 
     48                for uri,name in self.getSelected(): 
     49                    xml+='<i><u>%s</u><n>%s</n></i>'%(uri,name) 
     50                xml+='</sh></ndgCookie>' 
    4551                return xml 
    46                                  
    47         def __loadBrowseHistory(self): 
    48                 ''' get the string of URI values out of the cookie (if it's there)''' 
    49                 try: 
    50                         self.tree=ET.fromstring(self.cookie['BrowseHistory'].value) 
    51                         for item in self.tree: 
    52                                 self.addToHistory(item.find('u').text,item.find('n').text,ignore=True) 
    53                 except: 
    54                         pass 
     52                 
     53        def __load(self): 
     54            ''' get lists of URI values out of a cookie ''' 
     55            try: 
     56                e=ET.fromstring(self.cookie['history']) 
     57                for se in e: 
     58                    for item in se: 
     59                        uri,name=item.find('u'),item.find('n') 
     60                        self.__addTo(uri,name,se.tag) 
     61            except: 
     62                pass 
     63                         
     64        def __addTo(self,uri,name,tag,ignore=False): 
     65            d={'bh':self.history,'sh':self.selected} 
     66            current=d[tag].tolist() 
     67            if (uri,name) not in current or ignore: 
     68                d[tag].append((uri,name)) 
     69                         
    5570        def addToHistory(self,uri,name,ignore=False): 
    56                 ''' Add a URI to the session history''' 
    57                 if not ignore: 
    58                         current=self.getHistory() 
    59                         if (uri,name) not in current: 
    60                                 self.history.append((uri,name)) 
    61                 else: 
    62                         self.history.append((uri,name)) 
     71           ''' Add a URI to the session history''' 
     72           self.__addTo(uri,name,'bh',ignore) 
     73                         
    6374        def getHistory(self): 
    64                 ''' Return a list of the items in the history ''' 
    65                 return self.history.tolist() 
     75           ''' Return a list of the items in the history ''' 
     76           return self.history.tolist() 
     77         
     78        def addToSelected(self,uri,name,ignore=False): 
     79            ''' Add a URI to the selected items ''' 
     80            self.__addTo(uri,name,'sh',ignore) 
     81            self.__addTo(uri,name,'bh',ignore) 
     82                     
     83        def getSelected(self): 
     84            ''' Return a list of selected items '''      
     85            return self.selected.tolist()         
     86         
    6687        def makeCookie(self,ndgSec=None): 
    6788                ''' Create a local cookie ''' 
     
    7394                cookie=Cookie.SimpleCookie() 
    7495                cookie['session']=base64.encodestring(m.digest())[:-3].replace("/", "$") 
    75                 cookie['BrowseHistory']=self.__toXML() 
     96                cookie['history']=self.__toXML() 
    7697                return cookie 
    7798         
     
    83104                self.env=os.environ 
    84105                self.path=self.env.get('PATH_INFO','/') 
    85                 self.FieldStorage=cgi.FieldStorage() 
     106                self.FieldStorage=getURLdict(cgi.FieldStorage()) 
    86107                self.config=config 
    87108                self.response=Response() 
    88109                self.requestURL=self.env.get('SCRIPT_NAME')+'?'+self.env.get('QUERY_STRING') 
     110                self.selector=selector(self.requestURL,config.get('layout','selectI')) 
    89111                 
    90112        
     
    106128                #this will do for the moment, although I'd rather the whole 
    107129                #URI was self consistent ... 
    108                  
     130                 
     131                if 'select' in self.FieldStorage: 
     132                    #need to sort out the name issue ... 
     133                    self.session.addToSelected(self.FieldStorage['select'],'dif') 
     134                    #we also need to trim the selector off the current requestURL 
     135                    self.requestURL=self.requestURL[0:self.requestURL.find('&select')] 
     136                    self.selector.baseURL=self.requestURL 
     137                 
    109138                #use name as an error return as well in the following calls ... 
    110                 if self.FieldStorage.has_key('uri'): 
    111                         self.uri=self.FieldStorage['uri'].value 
    112                         content,name=self.__browse() 
    113                 elif self.FieldStorage.has_key('search'): 
    114                         self.searchType=self.FieldStorage['search'].value 
    115                         content,name=self.__search() 
     139                if 'uri' in self.FieldStorage: 
     140                    self.uri=self.FieldStorage['uri'] 
     141                    content,name=self.__browse() 
     142                elif 'search' in self.FieldStorage: 
     143                    self.searchType=self.FieldStorage['search'] 
     144                    content,name=self.__search() 
    116145                else:  
    117                         self.response.content=self.error('No valid URI') 
     146                    content,name=self.error('No valid URI'),'Error' 
     147                         
     148                 
    118149                         
    119150                if not self.ViewTextOnly: 
    120151                    historyHTML='<p>' 
    121152                    for item in self.session.getHistory(): 
    122                         historyHTML+='<a href="%s">%s</a><br/>'%item 
     153                        historyHTML+=hyperlink(item[1],item[0]) 
    123154                    historyHTML+='</p>' 
     155                    selectHTML='<p>' 
     156                    for item in self.session.getSelected(): 
     157                        selectHTML+=hyperlink(item[1],item[0]) 
     158                    selectHTML+='</p>' 
    124159                    self.response.content=renderPage( 
    125                         content,historyHTML,historyHTML,name,self.config) 
     160                        content,historyHTML,selectHTML,name,self.config) 
    126161                else: 
    127162                    self.response.content=content 
     
    181216        def __search(self): 
    182217            ''' Handle simple searching within the context of the browse ''' 
    183             if self.FieldStorage.has_key('SEARCHSTRING'): 
    184                 searchString=self.FieldStorage['SEARCHSTRING'].value 
     218            if 'SEARCHSTRING' in self.FieldStorage: 
     219                searchString=self.FieldStorage['SEARCHSTRING'] 
    185220                try: 
    186221                    ws=DiscoveryWS() 
    187222                except Exception, e: 
    188223                    return self.error('<p>%s<br/>%s'%(e,'Unable to connect to Search BackEnd')),'Error' 
    189                 ws.SearchFullText(searchString) 
    190                 results=ws.GetResults(number=5) 
     224                hits=ws.SearchFullText(searchString) 
     225                state=DiscoveryState(ws.sessID,self.requestURL,hits,stride=10) 
     226                results=ws.GetResults(offset=state.offset,number=state.stride) 
    191227                difs=[] 
    192228                for result in results: 
    193229                    difs.append(xmlCleanup(result)) 
    194                 html=renderDiscoverySet(difs,summary=1,spatial=1,temporal=1,services=1) 
     230                html=renderDiscoverySet(difs,state,selector=self.selector, 
     231                               summary=1,spatial=1,temporal=1,services=1) 
    195232                title='Search for '+searchString 
    196233                return html,title 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/renderDiscoverySet.py

    r1006 r1020  
    1 from DiscoveryWS import DiscoveryWS 
     1from DiscoveryWS import DiscoveryWS,DiscoveryState 
    22from DIF import DIF 
     3from htmlUtilities import * 
    34 
    4 def renderDiscoverySet(difSet,summary=0,services=0,spatial=0,temporal=0, 
     5def renderDiscoverySet(difSet,state,selector=None,summary=0,services=0,spatial=0,temporal=0, 
    56    linkto='NDG_B_SERVICE'): 
    6     '''Takes a set of xml DIFS from a discovery search and renders a list of responses as a table, 
    7     with layout depending on a set of keywords: 
     7    '''Takes a set of xml DIFS from a discovery search (difSet) and renders a  
     8    list of responses as a table, with layout depending on a set of keywords: 
    89            summary (boolean) - show the abstract, 
    910            services (boolean) - show the service list, 
    1011            spatial (boolean) - show the bounding box, 
    1112            temporal (boolean) - show the date range, 
    12             linkto (string) - clicking on the name should go to a service binding to this url 
    13             ''' 
     13            linkto (string) - clicking on the select widget should add the url for 
     14                              this service to the selected list 
     15     Note that state is a DiscoveryState instance containing the sessionID from the search, 
     16     and the offset, stride, and total number of results ...selector is a class for adding 
     17     particular datasets to a selection dataset (and cookie). 
     18     ''' 
     19             
    1420    # 
    1521    # List of methods which deal with the actual row content ... 
    1622    #    
    17     def span(x,id): 
    18         return '<span class="%s">%s</span>'%(id,x) 
    19      
    20     def hyperlink(n,u): 
    21         return '<a href="%s">%s</a>'%(u,n) 
    2223     
    2324    def row(rowList,bgcolor='rbgWhite'): 
     
    3738    
    3839    def serviceList(d): 
    39         ll='<br/>Services: '+hyperlink('Full Record','url') 
     40        ll=span(' Links: ','ndgem')+hyperlink('Full Record','url') 
     41        ndg=0 
    4042        for item in d.services: 
    4143            ll+=', ' 
    4244            if item == 'NDG_A_SERVICE':  
    4345                ll+=hyperlink('data',d.services[item].url) 
     46                ndg=1 
    4447            elif item == 'NDG_B_SERVICE': 
    4548                ll+=hyperlink('metadata',d.services[item].url) 
    4649            else: 
    4750                ll+=hyperlink(item,d.services[item].url) 
    48         return ll 
    49      
    50     def abbreviate(string,newlen): 
    51         ''' We want to ensure that a particular block of text does not exceed 
    52         a specific length - and finishes on a word boundary. ''' 
    53         if len(string)< newlen: 
    54             return string 
    55         else: 
    56             r='' 
    57             for w in string[0:newlen].split(' ')[:-1]:r+='%s '%w 
    58             r+=' ...' 
    59             return r 
     51        return ndg,ll 
     52 
    6053     
    6154    # ################################## 
     
    6558    # depending on keyword options, provide column headings 
    6659    # 
    67     columns=['Dataset','Repository']    
    68     if spatial: columns.insert(-1,'Location') 
     60     
     61    columns=['Dataset',]    
     62    if spatial: columns.append('Location') 
    6963    if temporal:  
    7064        #two columns for temporal but put a column header across both columns 
    71         header='''<table><tbody><tr><td colspan="2" align="center">Temporal Coverage</td></tr><tr> 
    72         <td align="center">Start Date</td><td align="center"> End Date</td></tr></tbody></table>''' 
    73         columns.insert(-1,(header,2)) 
     65        header='''<table><tbody><tr><td colspan="2" align="center">Time&nbsp;Coverage</td></tr><tr> 
     66        <td align="center">Start</td><td align="center"> End</td></tr></tbody></table>''' 
     67        columns.append((header,2)) 
    7468    html='<div class="ListOfResults"><table><tbody>'+row(columns,bgcolor="rbgBeige") 
    7569     
     
    8074        bgc={1:'rbgWhite',-1:'rbgGrey'}[i] 
    8175        i=-1*i 
    82         rlist=[abbreviate(d.name,60),d.centre.toHTML()] 
    83         if summary: 
    84             rlist[0]='Name: %s'%rlist[0] 
    85             rlist[0]+='<br/>Summary: %s'%abbreviate(d.abstract,200) 
    86         if services: 
    87             rlist[0]+=serviceList(d) 
    88         if spatial: rlist.insert(-1,spatialBox(d)) 
    89         if temporal:  
    90             rlist.insert(-1,d.timeCoverage[0]) 
    91             rlist.insert(-1,d.timeCoverage[1]) 
    92          
    93          
    94         html+=row(rlist,bgcolor=bgc) 
     76        ndg,slist=serviceList(d) 
     77        if d.elem is None: 
     78            html+='<tr class="%s"><td colspan="%s"> Unparseable record </td></tr>'%(bgc,len(columns)) 
     79        else: 
     80            rlist=[abbreviate(d.name,60),] 
     81            if summary: 
     82                rlist[0]='%s: %s'%(span('Name','ndgem'),rlist[0]) 
     83                rlist[0]+='<br/>%s: %s'%(span('Summary','ndgem'),abbreviate(d.abstract,200)) 
     84            rlist[0]+='<br/>%s: %s.'%(span('Repository','ndgem'),d.centre.toHTML()) 
     85            if services:rlist[0]+=slist 
     86            rlist[0]+=',&nbsp;'+selector.target(d.entryID) 
     87            if spatial: rlist.append(spatialBox(d)) 
     88            if temporal:  
     89                rlist.append(htmlTime(d.timeCoverage[0])) 
     90                rlist.append(htmlTime(d.timeCoverage[1])) 
     91            html+=row(rlist,bgcolor=bgc) 
    9592 
    96     html+='</tbody></table></div>' 
     93    html+='</tbody></table>' 
     94    html+='<p>Results %s to %s of %s</p>'%(state.offset,state.offset+state.stride-1,state.hits) 
     95    html+='</div>' 
    9796    return html 
    9897 
     
    101100    from ETxmlView import xmlCleanup 
    102101    ws=DiscoveryWS() 
    103     ws.SearchFullText('acsoe') 
    104     results=ws.GetResults(number=5) 
     102    r=ws.SearchFullText('acsoe') 
     103    hits,time=r['hits'],r['queryTime'] 
     104    results=ws.GetResults(offset=1,number=5) 
    105105    difs=[] 
     106    querystring='dummyUrl' 
     107    state=Discovery(ws.sessionID,queryString,hits,stride=5) 
    106108    #g=file('log.xml','w') 
    107109    for result in results: 
    108110        #g.write(xmlCleanup(result)+'\n') 
    109111        difs.append(xmlCleanup(result)) 
    110     html=renderDiscoverySet(difs,summary=1,spatial=1,temporal=1) 
     112    html=renderDiscoverySet(difs,state,summary=1,spatial=1,temporal=1) 
    111113    f=file('output.html','wb') 
    112114    f.write(html) 
  • TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/renderPage.py

    r1006 r1020  
    2626            <table border="0" cellspacing="0" cellpadding="1"> 
    2727            <tbody> 
    28               <tr><td align="center">Discovery Search</td></tr> 
    29               <tr><td align="middle"><input class="text" name="SEARCHSTRING"/></td></tr> 
    30               <tr><td><input class="Button" type="submit" value="GO" name="Submit"/></td></tr> 
     28              <tr><td align="center"><b>Discovery Search</b></td></tr> 
     29              <tr><td align="center"><input class="text" size="18" name="SEARCHSTRING"/></td></tr> 
     30              <tr><td align="center"><input class="Button" type="submit" value="GO" name="Submit"/></td></tr> 
    3131            </tbody> 
    3232            </table> 
Note: See TracChangeset for help on using the changeset viewer.