Changeset 1577 for TI07-MOLES


Ignore:
Timestamp:
11/10/06 16:57:36 (13 years ago)
Author:
lawrence
Message:

Browse now modified to use Matt's backend ...

Location:
TI07-MOLES/trunk/PythonCode/browse/portal/cgi
Files:
12 added
8 edited

Legend:

Unmodified
Added
Removed
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse.py

    r1164 r1577  
    1 #!/usr/bin/env python 
     1#!/usr/bin/python 
    22import cgitb; cgitb.enable() 
    33import sys 
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/DIF.py

    r1525 r1577  
    1111from ETxmlView import loadET, nsdumb 
    1212 
     13 
    1314class DIF: 
    1415    ''' Supports the NASA GCMD DIF format for python operations, 
    1516    note ... not a complete implementation, currently minimum to 
    1617    show a reasonable piece of content ''' 
    17     def __init__(self,xml,serviceFile='serviceMap.config'): 
    18         '''Initialise a python dif instance based on an xml document ''' 
     18    def __init__(self,xml,serviceFile='serviceMap.config',et=0): 
     19        '''Initialise a python dif instance based on an xml document (expected 
     20        to be an input string if et=0, otherwise an ElementTree instance) ''' 
    1921        self.metadataType='DIF' 
    20         try: 
    21             self.tree=loadET(xml) 
    22             self.xml=xml 
    23         except: 
    24             # for some reason we can't parse the document ... 
    25             self.tree=None 
     22        self.debug=1 
     23        if et: 
     24            self.tree=xml 
     25            self.xml=ET.tostring(xml) 
     26        else: 
     27            try: 
     28                self.tree=loadET(xml) 
     29                self.xml=xml 
     30            except: 
     31                # for some reason we can't parse the document ... 
     32                self.tree=None 
     33                self.xml=None 
    2634             
    2735        if self.tree is None: return None 
     
    3947        self.constraints=AccessControl(None) 
    4048         
    41         #need entity.parameters, entity.bbox, entity.timeCoverage, entity.curator, entity.creators ... 
    42          
    43         #load up all the information about parameters 
    44         self.categories=[] 
    45         self.topics=[] 
    46         self.terms=[] 
    47         self.variables=[] 
     49        #need entity.parameters, entity.bbox, entity.timeCoverage, entity.curator, entity.creators 
     50 
    4851        self.parameters=[] 
    49          
    50         match={'Category':self.categories,'Topic':self.topics,'Term':self.terms, 
    51                 'Variable':self.variables,'Detailed_Variable':self.parameters} 
    52                  
    5352        for parameter in helper.findall(self.tree,'Parameters'): 
    5453            name='' 
     
    5655                name+=helper.getText(parameter,level)+'/' 
    5756            self.parameters.append(name.rstrip('/')) 
    58             #values=helper.getText(self.tree,'Parameters/'+level,multiple=1) 
    59             #for value in values:  
    60             #    if value not in match[level]: match[level].append(value) 
    61          
     57             
     58 
    6259        #load up information about spatial bounding box  
    6360        self.bbox=Bounding(self.tree,entity='DIF') 
     
    7269        self.centre=DIFcontact(helper.find(self.tree,'Data_Center'),ctype='centre',helper=helper) 
    7370        self.curator=DIFcontact(self.tree) 
    74         f=open('difs.log','a') 
    75         f.write(self.entryID+'##'+self.centre.toHTML()+'\n'+self.xml+'\n##################################\n') 
    76         f.close() 
    77              
     71 
    7872        #Data Creators 
    7973        self.creators=[] 
    80          
     74 
     75        #services 
    8176        self.services=[] 
    82          
    8377        for item in helper.findall(self.tree,'Related_URL'): 
    8478            n=ServiceBinding(self.name,serviceFile=serviceFile) 
    8579            self.services.append(n.fromRelated(item,self.entryID,helper=helper)) 
     80          
     81        if self.debug: 
     82           f=open('difs.log','a') 
     83           f.write('%s##\n%s\n##################################\n'%(self.entryID,self.xml)) 
     84           f.close() 
     85             
    8686             
    8787    def toHTML(self,config): 
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/DiscoveryWS.py

    r1525 r1577  
    1010DEBUG=0 
    1111 
    12 class 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,offset=1,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.sessID=sessionID 
    22         self.hits=hits 
    23         self.offset=offset 
    24         self.stride=stride 
     12 
    2513 
    2614class DiscoveryWS: 
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/ETxmlView.py

    r1182 r1577  
    66# Code to support xml and elementTree viewing as text and html 
    77 
    8 import ElementTree as ET 
     8try: #python 2.5 
     9    import xml.etree.ElementTree as ET 
     10except: 
     11    import ElementTree as ET 
    912import re 
    1013from sub_orphan import * 
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/Utilities.py

    r1525 r1577  
    11from collections import deque # python 2.4 
    2 import ElementTree as ET 
     2try: #python 2.5 
     3    from xml.etree import ElementTree as ET 
     4except: 
     5    import ElementTree as ET 
    36import ConfigParser 
    47import os 
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/browseCGI.py

    r1525 r1577  
    1919from Utilities import * 
    2020from ETxmlView import * 
    21 from DiscoveryWS import * 
     21#from DiscoveryWS import * 
     22from ndgSearch import ndgSearch 
    2223from DIF import DIF 
    2324import base64 
    24 from eXistInterface import * 
     25#from eXistInterface import * 
     26from DiscoveryState import DiscoveryState 
    2527 
    2628import Cookie 
    2729 
     30 
     31         
    2832class BrowseSession: 
    2933         
     
    232236                xml=insecureGetDoc(self.uri,db=db,format=format,jar=jar,javaBin=javabin, 
    233237                                   passwordFile=passwordFile) 
     238                 
    234239                # this isn't ideal but it'll do for now ... 
    235                 # try again, directly to the exist database 
    236                 if xml is None and format=='DIF': 
    237                     existDB=ndg_eXist(db=db,passwordFile=passwordFile) 
    238                     xml=existDB.getDIF(self.uri) 
    239                  
    240                  
     240                if xml is None:  
     241                    #then it's not an NDG DIF, and we need to go get it, but 
     242                    #unfortunately that requires a search on the entry id, then 
     243                    #a document retrieval 
     244                    ws=ndgSearch() 
     245                    ws.search(self.uri) 
     246                    xml=ws.getDoc(ws.documents[0]) 
     247                    if xml[0:5]=='Error': 
     248                        return self.error('Unable to obtain record [%s] from database'%self.uri),self.uri 
     249         
    241250                #create document instance 
    242251                if format=='NDG-B0': 
     
    246255                 
    247256                if self.b.xml is None: 
    248                     content=self.error('Unable to obtain record [%s] from database'%self.uri) 
     257                    content=self.error('Unable to parse record [%s] from database'%self.uri) 
    249258                    return content,0 
    250259                else: 
     
    287296            if 'SEARCHSTRING' in self.FieldStorage: 
    288297                searchString=self.FieldStorage['SEARCHSTRING'] 
     298                searchSession,start,howmany=None,1,stride 
    289299                if 'searchSession' in self.FieldStorage: 
    290                     searchSession=self.FieldStorage['searchSession'] 
    291                     start=int(self.FieldStorage['start']) 
    292                     howmany=int(self.FieldStorage['howmany']) 
    293                 else: 
    294                     searchSession=None 
    295                     start=1 
    296                     howmany=stride 
     300                      searchSession=self.FieldStorage['searchSession'] 
     301                if 'start' in self.FieldStorage: 
     302                    try: 
     303                        start=int(self.FieldStorage['start']) 
     304                    except: pass 
     305                if 'howmany' in self.FieldStorage: 
     306                    try: 
     307                        stride=int(self.FieldStorage['howmany']) 
     308                    except: pass 
     309 
    297310                title='Search for '+searchString 
    298311                try: 
    299                     #ws=DiscoveryWS(wsdl=self.config.get('services','searchWSDL'), 
    300                     #                sessID=searchSession) 
    301          
    302                     db=self.config.get('db','exist',None) 
    303                     passwordFile=self.config.get('security','passwords','passwords.txt') 
    304                     existDB=ndg_eXist(db=db,passwordFile=passwordFile) 
     312                    ws=ndgSearch() # instantiate 
    305313                except Exception, e: 
    306314                    return self.error('<p>%s<br/>%s'%(e,'Unable to connect to Search BackEnd')),'Error' 
    307                 try: 
    308                     #hits=ws.SearchFullText(searchString) 
    309                     #state=DiscoveryState(ws.sessID,self.requestURL,hits,stride=stride) 
    310                     #results=ws.GetResults(offset=state.offset,number=state.stride) 
    311                     hits=0 
    312                     if searchSession is not None: 
    313                         try: 
    314                             id=searchSession 
    315                             summary=existDB.querySummary(id) 
    316                             print '<p>%s</p>'%string(summary) 
    317                         except: 
    318                             id,summary=existDB.full_text(searchString) 
    319                     else: 
    320                         id,summary=existDB.full_text(searchString) 
    321                     hits=summary['hits'] 
    322                     if hits==0: return self.error('No records found'),title 
    323                     r=1 
    324                     results=[] 
    325                     j=1 
    326                     while r is not None and j <= howmany: 
    327                         j+=1 
    328                         r=existDB.retrieveNext(id,pos=start+j-1) 
    329                         if r is not None: results.append(r) 
    330                     state=DiscoveryState(id,self.requestURL,hits,stride=stride,offset=start) 
    331                 except TypeError: 
    332                     # this is not what these web services should do, they should 
    333                     # return an empty set or something which matches the argument 
    334                     # list, but at least I think this traps the empty set for 
    335                     # marta's code at least 
    336                     return self.error('No records found'),title 
     315 
     316                hits=0 
     317                if searchSession is not None: 
     318                   pass 
     319                   #return self.error('<p>search sessions not yet implemented</p>'),'Error' 
     320                else: 
     321                   pass 
     322                 
     323                documents=ws.search(searchString,start=start,howmany=stride) 
     324                hits=ws.hits 
     325                id=ws.serverSessionID 
     326                 
     327                if hits==0: return self.error('No records found'),title 
     328                state=DiscoveryState(id,self.requestURL,hits,stride=stride,offset=start) 
     329                results=ws.getAllDocsAsElements() 
    337330                difs=[] 
    338                  
    339                 for result in results: difs.append(DIF(result,serviceFile=self.serviceFile)) 
     331                for result in results: difs.append(DIF(result,serviceFile=self.serviceFile,et=1)) 
    340332         
    341333                html=renderDiscoverySet(difs,state,selector=self.selector, 
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/renderDiscoverySet.py

    r1525 r1577  
    1 from DiscoveryWS import DiscoveryWS,DiscoveryState 
     1from DiscoveryState import DiscoveryState 
     2from ndgSearch import ndgSearch 
    23from DIF import DIF 
    34from htmlUtilities import * 
     
    116117            html+=', %s'%hyperlink(s1,nexturl) 
    117118        if state.offset>1: 
    118             last1=state.offset-state.stride 
     119            last1=max(1,state.offset-state.stride) 
    119120            lastNum=min(state.stride,1+state.hits-last1) 
     121            if lastNum<min(20,state.hits): lastNum=20 
    120122            l1='Last %s'%lastNum 
    121123            lasturl='%s&start=%s&howmany=%s&searchSession=%s'%( 
     
    129131if __name__=="__main__": 
    130132 
    131     ws=DiscoveryWS() 
    132     hits=ws.SearchFullText('acsoe') 
    133     results=ws.GetResults(offset=1,number=5) 
     133    ws=ndgSearch() 
     134    ws.search('acsoe',start=1,howmany=5) 
     135    hits=ws.hits 
     136    sessID=ws.serverSessionID 
     137    results=ws.getAllDocs() 
    134138    difs=[] 
    135139    querystring='dummyUrl' 
    136     state=DiscoveryState(ws.sessID,querystring,hits,stride=5) 
     140    state=DiscoveryState(sessID,querystring,hits,stride=5) 
     141    print results[0] 
    137142    for result in results: 
    138         difs.append(DIF(result,serviceFile='serviceMap.config')) 
     143        difs.append(DIF(result[1],serviceFile='serviceMap.config')) 
    139144    html=renderDiscoverySet(difs,state,summary=1,spatial=1,temporal=1) 
    140145    f=file('output.html','wb') 
    141146    f.write(html) 
    142     ws.release() 
     147    
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/renderEntity.py

    r1211 r1577  
    168168                html='' 
    169169        return html 
     170         
     171   
    170172 
    171173if __name__=="__main__": 
Note: See TracChangeset for help on using the changeset viewer.