Changeset 1671 for TI07-MOLES


Ignore:
Timestamp:
07/11/06 08:45:57 (13 years ago)
Author:
lawrence
Message:

New NDG discovery interface, including CSS, still a few
bits to do, but functional as WSGI now.

Location:
TI07-MOLES/trunk/PythonCode/browse/portal/cgi
Files:
6 edited

Legend:

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

    r1644 r1671  
    2626        self.configDir=configDir 
    2727        self.config=myConfig(configDir+'config.test') 
     28        self.logger=self.config.getLog() 
    2829        self.serviceFile=configDir+self.config.get('services','serviceFile') 
    2930         
    3031        #is this simply a blank request for an interface? 
    3132        if self.inputs.keys()==[]: 
     33            self.html+='<div id="superPad">' 
    3234            self.standardInterface() 
     35            self.html+='</div>' 
    3336            return 
    3437        elif self.inputs.keys()==['advanced']: 
     
    4851         
    4952        #the following may also be present 
    50         continuations={'start':1,'howmany':20} 
     53        continuations={'start':1,'howmany':10} 
    5154        for i in continuations: 
    5255            if i not in self.inputs: self.inputs[i]=continuations[i] 
     
    5457        advanced=int(self.inputs['advanced']) 
    5558         
     59        self.html='' 
    5660        if not advanced: 
    5761            self.doText(self.inputs['searchString'],self.inputs['textTarget'], 
     
    103107        start,howmany=int(start),int(howmany)  # url arguments need conversion ... 
    104108         
    105         ws=NS.ndgSearch() 
     109        ws=NS.ndgSearch(logger=self.logger) 
    106110        documents=ws.search(searchString,start=start,howmany=howmany,scope=scope) 
    107111         
     
    110114        state=self.__setState(id,hits,start,howmany) 
    111115        if hits==0:  
    112             self.html='<p> No records found </p>' 
     116            self.html+='<p> No records found </p>' 
    113117        else: 
    114118            results=ws.getAllDocsAsElements() 
    115119            difs=[] 
    116120            for result in results: difs.append(DIF(result,serviceFile=self.serviceFile,et=1)) 
    117             self.html=renderDiscoverySet(difs,state, 
     121            self.html+=renderDiscoverySet(difs,state, 
    118122                               summary=1,spatial=1,temporal=1,services=1) 
    119                  
     123                                
     124        self.standardInterface() 
    120125        return 
    121126     
    122127    def doGeoSpatial(self): 
    123         self.html='Geospatial and Time limiting not yet implemented' 
     128        self.html+='Geospatial and Time limiting not yet implemented' 
    124129        return 
    125130     
     
    132137        except: 
    133138            self.message='Error, invalid configuration for search interface' 
    134             self.html='' 
     139            self.html+='' 
    135140            return 
    136141         
    137         self.html=DiscoveryTemplate.main%locals() 
     142        self.html+=DiscoveryTemplate.main%locals() 
    138143        return 
    139144     
     
    148153            self.html='' 
    149154            return 
    150         self.html=DiscoveryTemplate.advanced%locals() 
     155        advancedSubmit=DiscoveryTemplate.advancedSubmit%locals() 
     156        searchText=DiscoveryTemplate.searchText 
     157        searchTime=DiscoveryTemplate.searchTime 
     158        searchArea=DiscoveryTemplate.searchArea 
     159        searchSource=DiscoveryTemplate.searchSource 
     160        self.html+=DiscoveryTemplate.advanced%locals() 
    151161        return 
    152162     
     
    156166        else: 
    157167            self.standardInterface() 
    158         self.html=DiscoveryTemplate.help+self.html 
     168        self.html+=DiscoveryTemplate.help+self.html 
    159169        return 
    160170         
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/DiscoveryTemplate.py

    r1615 r1671  
    2222main=''' 
    2323<div class="simpleSearch"> 
    24 <form actin="%(discoveryURL)s"> 
    25 <h4> Text Search </h4> 
    26 <table> 
     24<form action="%(discoveryURL)s"> 
     25<center><table> 
    2726<tr> 
    28 <td colspan="3"> 
    29 Search in: <input type="radio" name="textTarget" value="All" checked> Everything 
    30                 <input type="radio" name="textTarget" value="Authors"> Authors 
    31                 <input type="radio" name="textTarget" value="Params"> Parameters 
     27<td colspan="3" align="center"> 
     28New search for text in: <input type="radio" name="textTarget" value="All" checked="checked"/> Everything 
     29                <input type="radio" name="textTarget" value="Authors"/> Authors 
     30                <input type="radio" name="textTarget" value="Params"/> Parameters 
    3231                </td></tr> 
    33 <tr><td colspan="3"><input type="text" size=60 name="searchString"/></td></tr> 
    34 <tr></tr> 
    35 <tr><td><a href="%(helpAddress)s">Help</a><td><input type="submit" value="Run Search"/> 
    36     <td><a href="%(advancedURL)s">Advanced Search</a></td></tr> 
    37 <input type="hidden" value="0" name="advanced"> 
    38 </table></form></div>''' 
     32<tr><td colspan="3" align="center"><input type="text" size="66" name="searchString"/></td></tr> 
     33<tr><td width="30%%"><a href="%(helpAddress)s">Help</a></td><td><input type="submit" value="Run Search"/> 
     34</td><td width="30%%"><a href="%(advancedURL)s">Advanced Search</a></td></tr></table></center> 
     35<input type="hidden" value="0" name="advanced"/> 
     36</form></div>''' 
    3937 
    4038# requires mainLogo, helpAddress, and discoveryURL to be declared in parent 
    41 advanced=''' 
    42 <div class="AdvancedSearch"> 
    43     <form action="%(advancedURL)s"> 
     39 
     40searchArea=''' 
    4441    <div class="searchMethod"> 
    45     <h4> Text Search </h4> 
    46                 Search in: <input type="radio" name="textTarget" value="All" checked> Everything 
    47                 <input type="radio" name="textTarget" value="Authors"> Authors 
    48                 <input type="radio" name="textTarget" value="Params"> Parameters 
    49                 <br/> 
    50             <input type="text" size=60 name="searchString"><br/> 
    51             <input type="hidden" value="1" name="advanced"> 
    52     </div> 
    53     <div class="searchMethod"> 
    54         <h4> Refine by Time </h4> 
    55         <input type="radio" name="timeLimit" value="0" checked> Do not limit by date 
    56         <input type="radio" name="timeLimit" value="1"> Limit by following date range 
    5742        <table> 
    58         <tr>    <td>Start date: </td> 
    59                 <td><input type=text value="1" size="2" name="startDateDay"/></td> 
    60                 <td><select name="startDateMon"> 
    61                     <option value="1"> Jan  
    62                     <option value="2"> Feb 
    63                     <option value="3"> Mar 
    64                     <option value="4"> Apr 
    65                     <option value="5"> May 
    66                     <option value="6"> Jun 
    67                     <option value="7"> Jul 
    68                     <option value="8"> Aug 
    69                     <option value="9"> Sep 
    70                     <option value="10"> Oct 
    71                     <option value="11"> Nov 
    72                     <option value="12"> Dec 
    73                     </select></td> 
    74                  <td><input type=text value="2000" name="startDateYear" size="4"/> 
    75         </tr>       
    76         <tr>    <td>End date: </td> 
    77                 <td><input type=text value="31" size="2" name="endDateDay"/></td> 
    78                 <td><select name="endDateMon"> 
    79                     <option value="1"> Jan  
    80                     <option value="2"> Feb 
    81                     <option value="3"> Mar 
    82                     <option value="4"> Apr 
    83                     <option value="5"> May 
    84                     <option value="6"> Jun 
    85                     <option value="7"> Jul 
    86                     <option value="8"> Aug 
    87                     <option value="9"> Sep 
    88                     <option value="10"> Oct 
    89                     <option value="11"> Nov 
    90                     <option value="12" selected> Dec 
    91                     </select></td> 
    92                  <td><input type=text value="2001" name="endDateYear" size="4"/> 
    93         </tr> 
    94         </table> 
    95     </div> 
    96     <div class="searchMethod"> 
    97         <h4> Refine by Area </h4> 
    98         <input type="radio" name="spaceLimit" value="0" checked> Do not limit by area 
    99         <input type="radio" name="spaceLimit" value="1"> Limit by Bounding Box 
    100         <table> 
     43        <tr><td colspan="3"><span class="searchHdr"> Refine by Area </span><br/></td></tr> 
     44        <tr><td colspan="3">  
     45        <input type="radio" name="spaceLimit" value="0" checked="checked"/> Do not limit by area 
     46        <input type="radio" name="spaceLimit" value="1"/> Limit by Bounding Box</td></tr> 
    10147        <tr><td>Northerly Latitude:</td> 
    10248            <td colspan="2" align="center"> 
     
    10753        <tr><td> Southerly Latitude:</td> 
    10854            <td colspan="2" align="center"> 
    109             <input size="7"value="-90.00" name="bboxS"></td></tr> 
     55            <input size="7"value="-90.00" name="bboxS"/></td></tr> 
    11056        <tr><td colspan="3"> (Units: degrees, north and east positive)</td></tr> 
    11157        </table> 
    11258    </div> 
     59    ''' 
     60searchSource=''' 
     61   <div class="searchMethod">  
     62        <table> 
     63        <tr><td colspan="2"><span class="searchHdr"> Refine by Source Data Centres </span></td></tr> 
     64        <tr><td colspan="2"><input type="radio" name="sourceLimit" value="0" checked="checked"/> All 
     65        <input type="radio" name="sourceLimit" value="1"/> Limit scope</td></tr> 
     66        <tr><td> NERC Data Centres</td><td><input type="checkbox" name="sourceNERC"/></td></tr> 
     67        <tr><td> Marine Data Partnership (MDIP)</td><td><input type="checkbox" name="sourceMDIP"/></td></tr> 
     68        </table> 
     69    </div>  
     70    ''' 
     71searchTime= ''' 
    11372    <div class="searchMethod"> 
    114         <h4> Refine by Source Data Centres </h4> 
    115         <input type="radio" name="sourceLimit" value="0" checked> All 
    116         <input type="radio" name="sourceLimit" value="1"> Limit scope 
    117         <table> 
    118         <tr><td> NERC Data Centres</td><td><input type="checkbox" name="sourceNERC"></td></tr> 
    119         <tr><td> Marine Data Partnership (MDIP)</td><td><input type="checkbox" name="sourceMDIP"></td></tr> 
     73    <table> 
     74        <tr><td colspan="2"> 
     75        <span class="searchHdr"> Refine by Time </span></td></tr> 
     76        <tr><td colspan="2"> 
     77        <input type="radio" name="timeLimit" value="0" checked="checked"/> Do not limit by date 
     78        <input type="radio" name="timeLimit" value="1"/> Limit by following date range 
     79        </td></tr> 
     80        <tr>    <td>Start date: </td> 
     81                <td><input type="text" value="1" size="2" name="startDateDay"/> 
     82                <select name="startDateMon"> 
     83                    <option value="1"> Jan </option> 
     84                    <option value="2"> Feb</option> 
     85                    <option value="3"> Mar</option> 
     86                    <option value="4"> Apr</option> 
     87                    <option value="5"> May</option> 
     88                    <option value="6"> Jun</option> 
     89                    <option value="7"> Jul</option> 
     90                    <option value="8"> Aug</option> 
     91                    <option value="9"> Sep</option> 
     92                    <option value="10"> Oct</option> 
     93                    <option value="11"> Nov</option> 
     94                    <option value="12"> Dec</option> 
     95                    </select> 
     96                 <input type="text" value="2000" name="startDateYear" size="4"/></td> 
     97        </tr>       
     98        <tr>    <td>End date: </td> 
     99                <td><input type="text" value="31" size="2" name="endDateDay"/> 
     100                <select name="endDateMon"> 
     101                    <option value="1"> Jan </option> 
     102                    <option value="2"> Feb</option> 
     103                    <option value="3"> Mar</option> 
     104                    <option value="4"> Apr</option> 
     105                    <option value="5"> May</option> 
     106                    <option value="6"> Jun</option> 
     107                    <option value="7"> Jul</option> 
     108                    <option value="8"> Aug</option> 
     109                    <option value="9"> Sep</option> 
     110                    <option value="10"> Oct</option> 
     111                    <option value="11"> Nov</option> 
     112                    <option value="12" selected="selected"> Dec</option> 
     113                    </select> 
     114                 <input type="text" value="2001" name="endDateYear" size="4"/></td> 
     115        </tr> 
    120116        </table> 
    121117    </div> 
     118    ''' 
     119searchText=''' 
     120    <div class="searchMethod"> 
     121    <span class="searchHdr"> Text Search </span><br/> 
     122                Search in: <input type="radio" name="textTarget" value="All" checked="checked"/> Everything 
     123                <input type="radio" name="textTarget" value="Authors"/> Authors 
     124                <input type="radio" name="textTarget" value="Params"/> Parameters 
     125                <br/> 
     126            <input type="text" size="60" name="searchString"/><br/> 
     127            <input type="hidden" value="1" name="advanced"/> 
     128    </div> 
     129    ''' 
     130advancedSubmit='''<div class="searchMethod"> 
    122131    <input type="submit" value="Run Search"/> 
    123     <a href="%(helpAddress)s">Help</a>,  
    124                 <a href="%(discoveryURL)s"> Simple Search </a> 
     132    <a class="button" href="%(helpAddress)s">Help</a> 
     133                <a class="button" href="%(discoveryURL)s"> Simple Search </a> 
     134    </div>''' 
     135 
     136advanced=''' 
     137<div class="AdvancedSearch"> 
     138    <form action="%(advancedURL)s"> 
     139    <table class="AdvBox"> 
     140    <tr><td>%(searchText)s</td></tr> 
     141    <tr><td>%(searchTime)s</td></tr> 
     142    <tr><td>%(searchArea)s</td></tr> 
     143    <tr><td>%(searchSource)s</td></tr> 
     144    <tr><td>%(advancedSubmit)s</td></tr> 
     145    </table> 
    125146    </form> 
    126147</div>''' 
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/Utilities.py

    r1644 r1671  
    88import re 
    99import urllib 
     10import logging 
     11 
     12__NOCONFIG='Missing Config File' 
    1013 
    1114class myConfig: 
    12         ''' Handle missing sections and variables in a config file a bit gracefully ''' 
    13         def __init__(self,configfile): 
    14                 self.config=ConfigParser.ConfigParser() 
    15                 if not os.path.exists(configfile): 
    16                         raise 'No config file: %s'%configfile 
    17                 self.config.read(configfile) 
    18                 logfile=self.get('logging','debugLog',None) 
    19                 self.logfile=None 
    20                 if logfile is not None: 
    21                         self.logfile=open(logfile,'a') 
    22  
    23         def get(self,section,key,default=None): 
    24                 try: 
    25                         return self.config.get(section,key) 
    26                 except: 
    27                         return default 
     15     
     16   ''' Handle missing sections and variables in a config file a bit gracefully. Also 
     17   instantiates a logger if necessary ''' 
     18    
     19   def __init__(self,configfile,logName='NDGLOG'): 
     20       self.config=ConfigParser.ConfigParser() 
     21       if not os.path.exists(configfile): raise __NOCONFIG, configfile 
     22       self.config.read(configfile) 
     23       logfile=self.get('logging','debugLog',None) 
     24       self.logfile=None #deprecated 
     25       self.logger=None 
     26       if logfile is not None: 
     27           logger=logging.getLogger(logName) 
     28           handler=logging.FileHandler(logfile) 
     29           formatter=logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
     30           handler.setFormatter(formatter) 
     31           logger.addHandler(handler) 
     32           logger.setLevel(logging.INFO) 
     33           self.logger=logger 
    2834         
    29         def log(self,string): 
    30             ''' Log some debug information ''' 
    31             if self.logfile is None: return 
    32             if string is not None: 
    33                 self.logfile.write('%s\n'%string) 
    34             else: 
    35                 self.logfile.write('empty log entry\n') 
    36                  
     35   def get(self,section,key,default=None): 
     36       ''' Return a config file value for key frm section ''' 
     37       try: 
     38           return self.config.get(section,key) 
     39       except: 
     40           return default 
     41         
     42   def log(self,string): 
     43       ''' Log some debug information ''' 
     44       if self.logger is None: return 
     45       if string is not None: 
     46          self.logger.info(string) 
     47       else: 
     48          self.logger.info('empty log entry') 
     49           
     50   def getLog(self): 
     51       return self.logger 
     52 
    3753class Request: 
    3854    ''' Holds the request URL etc ''' 
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/config.test

    r1645 r1671  
    99#serviceFile:    /var/www/cgi-bin/browse/serviceMap.config 
    1010serviceFile:     serviceMap.config 
     11 
     12[logging] 
     13debuglog:        discovery.log 
     14 
     15[layout] 
     16localLink:      http://ndg.nerc.ac.uk/ 
     17localImage:     /layout/ndg_logo.gif 
     18localAlt:       visit badc 
     19key:            /layout/keySm.gif 
     20keyGrey:        /layout/keyG.gif 
     21selectI:        /layout/tick.png 
     22Xicon:          /layout/X.gif 
     23printer:        /layout/printer.gif 
     24ndgLink:        http://ndg.nerc.ac.uk/ 
     25ndgImage:       /layout/ndg_logo.gif 
     26ndgAlt:         visit ndg 
     27pageLogo:       /layout/browse_header4.gif 
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/browse/ndgSearch.py

    r1615 r1671  
    44 
    55#normal imports 
    6 import sys 
     6import sys, time 
    77try: #python 2.5 
    88    import xml.etree.ElementTree as ET 
     
    1212from ETxmlView import loadET,et2text 
    1313 
     14from xml.dom import expatbuilder 
     15class ExpatReaderClass: 
     16      fromString = staticmethod(expatbuilder.parseString) 
     17      fromStream = staticmethod(expatbuilder.parse) 
     18  
     19 
    1420class ndgSearch: 
    1521    ''' Proivdes a client to the NDG discovery services methods exposed by the Discovery.wsdl ''' 
    1622     
    17     def __init__(self): 
     23    def __init__(self,logger=None): 
    1824        '''get an instance of the service''' 
    1925        #how do we get a different backend provider? 
    2026        loc=DiscoveryServiceLocator() 
    21         self.server=loc.getDiscovery()#tracefile=sys.stdout) 
     27        self.server=loc.getDiscovery(readerclass=ExpatReaderClass) 
     28        #tracefile=sys.stdout) 
    2229        self.documents=None 
    2330        self.hits=None 
    2431        self.serverSessionID=None 
     32        self.logger=logger 
    2533 
    2634     
     
    3745            request._scope=scope 
    3846        #do the search 
     47 
     48        if self.logger: itime=time.time() 
    3949        response=self.server.doFullTextSearch(request) 
     50        if self.logger: 
     51            etime=time.time()-itime 
     52            self.logger.info('Search Request [%s] took [%ss]'%(term,etime)) 
    4053        if response._status: 
    4154            self.serverSessionID=response._resultId 
     
    7083        #create a request object 
    7184        request=doPresentRequest() 
     85        if self.logger: itime=time.time() 
    7286        for doc in self.documents: 
    7387            request._document=doc 
     
    7892            else: 
    7993                self.status.append((doc,result._statusMessage)) 
    80                  
     94        if self.logger: 
     95            etime=time.time()-itime 
     96            self.logger.info('Document Load [n=%s] took [%ss]'%(len(self.documents),etime)) 
    8197        self.docs=docs 
    8298        return self.docs 
  • TI07-MOLES/trunk/PythonCode/browse/portal/cgi/ndg.wsgi.py

    r1646 r1671  
    44from browse.DiscoveryGUI import DiscoveryGUI 
    55from browse.Utilities import Request, Response 
     6from browse.pageLayout import standardPage 
    67 
    78def getEnv(environ): 
     
    4546                                keep_blank_values=1) 
    4647 
    47 class NDGWrapper(object): 
    48       
    49     def __init__(self, wrapTarget,pageName): 
    50         ''' Simple example Middleware ''' 
    51          
    52         self.wrapTarget=wrapTarget 
    53  
    54         self.pageStart='''<?xml version="1.0" encoding="utf-8"?> 
    55                 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
    56                 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
    57                 <head> 
    58                   <meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8"/> 
    59                   <title>NDG: %s</title> 
    60                   <link media="all, screen" href="layout/ndg.css" type="text/css" rel="stylesheet"/> 
    61                 </head>'''%pageName 
    62          
    63         self.header=''' 
    64         <div id="header"></div> 
    65         ''' 
    66          
    67         self.footer='''<div id="Footer"> 
    68         <p> This portal is a pre-alpha release of NDG software.  
    69         We expect bugs, and things not to work, so please let us know about such problems  
    70         (please email badc@rl.ac.uk, and include "NDG problem" in the subject line).  
    71         We will be adding a help link to this page when the interface is slightly more stable. 
    72         </p> </div> 
    73         </div>   
    74         </body> 
    75         </html>''' 
    76          
    77     def __call__(self,environ,start_response): 
    78         ''' Let's prepend and postpend some stuff''' 
    79         response=[self.pageStart,self.header] 
    80         for i in self.wrapTarget(environ,start_response): response.append(i) 
    81         response.append(self.footer) 
    82         return response 
    8348 
    8449class discovery: 
     
    9459 
    9560discover=discovery('browse/') 
    96 app=NDGWrapper(discover,'NDG Data Portal') 
     61app=standardPage(discover,'NERC DataGrid: Data Portal','browse/config.test') 
    9762WSGIServer(app, bindAddress = '/tmp/fcgi.sock').run() 
Note: See TracChangeset for help on using the changeset viewer.