Changeset 2533 for TI07-MOLES


Ignore:
Timestamp:
31/05/07 09:59:23 (11 years ago)
Author:
lawrence
Message:

Discovery now defaults to an advanced interface which is getting close
to that required by ticket:731. The first point on ticket:733 is now done too.

Location:
TI07-MOLES/trunk/PythonCode/wsgi
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • TI07-MOLES/trunk/PythonCode/wsgi/Date.py

    r2523 r2533  
    4242    if d[0]>m[d[1]]: return 0 
    4343    return 1 
     44     
     45def iMonth(s): 
     46    '''Take a month as 'mmm' and convert to an integer (or do 
     47    nothing if the month is blank ''' 
     48    d={'':'','JAN':1,'FEB':2,'MAR':3,'APR':4,'MAY':5,'JUN':6, 
     49       'JUL':7,'AUG':8,'SEP':9,'OCT':10,'NOV':11,'DEC':12} 
     50    return d[s.upper()] 
    4451 
    4552import unittest 
  • TI07-MOLES/trunk/PythonCode/wsgi/DiscoveryGUI.py

    r2528 r2533  
    3232        self.html='' 
    3333         
    34         #is this simply a blank request for an interface? 
     34        #is this simply a blank request for an interface? In this version,  
    3535        if self.inputs.keys()==[]: 
    36             self.html+='<div id="superPad">' 
    37             self.standardInterface() 
    38             self.html+='</div>' 
     36            self.advancedInterface2() 
    3937            return 
    4038        elif self.inputs.keys()==['advanced']: 
    41             self.advancedInterface() 
     39            self.advancedInterface2() 
    4240            return 
    4341        elif self.inputs.keys()==['help']: 
     
    6260         
    6361        self.html='' 
     62         
    6463        if not advanced: 
    6564            self.doText(self.inputs['searchString'],self.inputs['textTarget'], 
     
    6766        else: 
    6867            #check content 
    69             expected=['timeLimit','startDateDay','startDateMon','startDateYear', 
    70                         'endDateDay','endDateMon','endDateYear','spaceLimit', 
    71                         'bboxN','bboxE','bboxS','bboxW', 
    72                         'sourceLimit'] 
     68            expected=['startDateDay','startDateMon','startDateYear', 
     69                        'endDateDay','endDateMon','endDateYear', 
     70                        'bboxN','bboxE','bboxS','bboxW'] 
    7371            self.__checkform(expected) 
    7472            if self.message!='': return self.error() 
    75               
    76             if int(self.inputs['sourceLimit']): 
    77                 scope=[] 
    78                 if 'sourceMDIP' in self.inputs: 
    79                     if self.inputs['sourceMDIP']: scope.append('MDIP') 
    80                 if 'sourceNERC' in self.inputs: 
    81                     if self.inputs['sourceNERC']: scope.append('NERC_DDC') 
     73             
     74            # ------------- Handle scope from radio button on form ------- 
     75            if 'source' in self.inputs: 
     76                # the WSDL expects a list, we're just providing one ... via a radio ... 
     77                scope=[self.inputs['source']] 
     78                if scope==['All']: scope=None 
    8279            else: 
    8380                scope=None 
    84                  
    85             if int(self.inputs['spaceLimit']): 
    86                 bbox=[self.inputs['bboxN'],self.inputs['bboxS'],self.inputs['bboxW'],self.inputs['bboxE']] 
    87                 self.__checkbox(bbox) 
    88                 if self.message!='': return self.error() 
    89             else: 
    90                 bbox=None 
    91                  
    92             if int(self.inputs['timeLimit']): 
    93                 dateRange=[(self.inputs['startDateDay'],self.inputs['startDateMon'],self.inputs['startDateYear']), 
    94                            (self.inputs['endDateDay'],self.inputs['endDateMon'],self.inputs['endDateYear'])] 
    95                 self.__checkdates(dateRange)                  
    96                 if self.message!='': return self.error() 
     81             
     82            # ------------- Handle Location Bounding -------- 
     83            # default form has a global bounding box 
     84            bbox=[self.inputs['bboxN'],self.inputs['bboxS'],self.inputs['bboxW'],self.inputs['bboxE']] 
     85            self.__checkbox(bbox) 
     86            if self.message!='': return self.error() 
     87                 
     88            # ------------- Handle Date Ranges --------------- 
     89            dateRange=[(self.inputs['startDateDay'],iMonth(self.inputs['startDateMon']),self.inputs['startDateYear']), 
     90                           (self.inputs['endDateDay'],iMonth(self.inputs['endDateMon']),self.inputs['endDateYear'])] 
     91            #default form has blanks, in which case we don't want to check for date range 
     92            if dateRange<>[("","",""),("","","")]: 
     93                self.__checkdates(dateRange) 
     94            else: dateRange=None 
     95            if self.message!='': return self.error() 
    9796                         
    98             else: 
    99                 dateRange=None 
    100   
     97            # ------------- ok, now go do the search ----------- 
    10198            self.doText(self.inputs['searchString'],self.inputs['textTarget'], 
    102                         self.inputs['start'],self.inputs['howmany'],scope=scope,dateRange=dateRange,bbox=bbox) 
     99                 self.inputs['start'],self.inputs['howmany'],scope=scope,dateRange=dateRange,bbox=bbox) 
    103100            
    104101        return 
     
    125122            self.message='Second date must be after first date' 
    126123                 
    127     def __setState(self,id,searchString,hits,offset,stride): 
     124    def __setState(self,id,searchString,hits,offset,stride,constraints): 
    128125        ''' Sets the discovery state to be used by external routines ''' 
    129126        if hits<stride:stride=hits 
    130         return DiscoveryState(id,searchString,self.environ,hits,offset,stride) 
     127        return DiscoveryState(id,searchString,self.environ,hits,constraints,offset,stride) 
    131128         
    132129     
     
    134131        ''' Return a useful error message ''' 
    135132        self.html='<div class="error"><p>%s</p></div>'%self.message 
    136         if self.advanced: 
    137             self.advancedInterface() 
    138         else: 
    139             self.standardInterface() 
     133        self.advancedInterface2() 
     134 
    140135             
    141136    def message(self,message): 
    142137        ''' Layout a message to the user ''' 
    143138        self.html='<div class="message"><p>%s</p></div>'%message 
     139         
     140         
     141    def __buildconstraints(self,dateRange,bbox,scope): 
     142        ''' Just build a constraint string ''' 
     143        constraints=' (' 
     144        if dateRange is not None:  
     145            constraints+='Including&nbsp;%s&nbsp;to&nbsp;%s; '%('%s,%s,%s'%dateRange[0],'%s,%s,%s'%dateRange[1]) 
     146        if bbox is None or bbox==['+90.0','-90.0','-180.0','+180.0']: 
     147            constraints+='Global; ' 
     148        else: constraints+='Bounding&nbsp;Box:&nbsp;%s,%s,%s,%s; '%tuple(bbox) 
     149        if scope is not None: 
     150            constraints+='Restricted to %s; '%scope[0] 
     151        constraints=constraints[:-2]+')' 
     152        self.logger.info(constraints) 
     153        return constraints 
    144154         
    145155     
     
    160170            return 
    161171         
     172        #build constraints info for report 
     173        constraints=self.__buildconstraints(dateRange,bbox,scope) 
     174         
    162175        hits=ws.hits 
    163176        id=ws.serverSessionID 
    164         state=self.__setState(id,searchString,hits,start,howmany) 
     177        state=self.__setState(id,searchString,hits,start,howmany,constraints) 
    165178        if hits==0:  
    166             self.html+=self.message('No records found') 
     179            self.html+='<div class="message"><table><tbody><tr><td>No records found %s.</td></tr></tbody></table></div>'%state.constraints 
    167180        else: 
    168181            try: 
     
    237250        return 
    238251     
     252    def advancedInterface2(self): 
     253        try: 
     254            discoveryURL=self.config.get('SEARCH','discoveryURL') 
     255            advancedURL=self.config.get('SEARCH','advancedURL') 
     256            oneLiner=DiscoveryTemplate.oneLiner 
     257        except: 
     258            self.message='Error, invalid configuration for search interface' 
     259            self.html='' 
     260            return 
     261        bboxN,bboxW,bboxE,bboxS='+90.0','-180.0','+180.0','-90.0' 
     262        startDateDay,startDateMon,startDateYear='','','' 
     263        endDateDay,endDateMon,endDateYear='','','' 
     264        self.html+=DiscoveryTemplate.revisedAdvancedSearch%locals() 
     265         
     266     
    239267    def helpInterface(self,advanced): 
    240268        if advanced: 
     
    250278        try: 
    251279            discoveryURL=self.config.get('SEARCH','discoveryURL') 
     280            oneLiner=DiscoveryTemplate.oneLiner 
    252281        except: 
    253282            self.message='Error, invalid configuration for search interface' 
  • TI07-MOLES/trunk/PythonCode/wsgi/DiscoveryState.py

    r2487 r2533  
    33    ''' This class holds the state associated with presenting multiple slices 
    44    of a large result set ''' 
    5     def __init__(self,sessionID,searchString,environ,hits,offset=1,stride=10): 
     5    def __init__(self,sessionID,searchString,environ,hits,constraints,offset=1,stride=10): 
    66        ''' On instantiation, provide 
    77                the backend sessionID 
     
    99                the stride through the result set ''' 
    1010        self.environ=environ # the wsgi environment 
     11        self.constraints=constraints # some text to show constraints on search 
    1112        self.sessID=sessionID 
    1213        self.hits=hits 
     
    2627        url=construct_url(self.environ, with_query_string=True, with_path_info=True, querystring=q) 
    2728        return url 
     29    def __str__(self): 
     30        return '''  
     31___ Discovery State ___ 
     32searchString: %s 
     33constraints: %s 
     34sessionID: %s 
     35hits: %s 
     36offset,stride: %s,%s 
     37environment: %s 
     38======================== 
     39'''%(self.searchString,self.constraints,self.sessID,self.hits,self.offset,self.stride,self.environ) 
    2840         
    2941import unittest 
     
    3547        DummyEnviron={'QUERY_STRING':'start=10&howmany=10','HTTP_HOST':'example.ndg', 
    3648                      'PATH_INFO':'/discovery','wsgi.url_scheme':'http','SERVER_PORT':'80'} 
    37         d=DiscoveryState('123','blah',DummyEnviron,12) 
     49        d=DiscoveryState('123','blah',DummyEnviron,12,'(none)') 
    3850        self.assertEqual(d.geturl(offset='11',stride='20'), 
    3951                         'http://example.ndg/discovery?start=11&howmany=20') 
    40  
     52        print d 
    4153  
    4254         
  • TI07-MOLES/trunk/PythonCode/wsgi/DiscoveryTemplate.py

    r2528 r2533  
    1313# Note that this has been deliberately laid out to be used inside some other page driving format  
    1414# including headers, footers etc, and css ... 
    15 # 
    16 # V0.0, Bryan Lawrence, September 28, 2006. 
    1715# 
    1816######################################################################################################### 
     
    151149</div>''' 
    152150 
     151oneLiner='''<input type="text" size="60" name="searchString"><input type="hidden" value="0" name="advanced"> 
     152            (Target:&nbsp;<select name="textTarget"> 
     153            <option value="Authors">Authors</option> 
     154            <option value="All" selected="selected">All</option> 
     155            <option value="Params">Parameters</option> </select>)''' 
     156 
    153157searchTextOneLine=''' 
    154158    <div class="searchOneLine"><form action="%(discoveryURL)s"> 
    155         New Search:&nbsp; 
    156         <input type="text" size="60" name="searchString"><input type="hidden" value="0" name="advanced"> 
    157         (Target:&nbsp;<select name="textTarget"> 
    158             <option value="Authors">Authors</option> 
    159             <option value="All" selected="selected">All</option> 
    160             <option value="Params">Parameters</option> </select>) </form> 
     159        New Search:&nbsp;%(oneLiner)s</form> 
    161160    </div>''' 
     161     
     162 
     163revisedAdvancedSearch=''' 
     164    <div class="AdvancedSearch"> 
     165        <form action="%(advancedURL)s"> 
     166            <table class="SearchBox"><tbody> 
     167                <tr><td>Free&nbsp;Text&nbsp;Search:&nbsp;<input type="text" size="60" name="searchString">  
     168                (Target:&nbsp;<select name="textTarget"> 
     169                    <option value="Authors">Authors</option> 
     170                    <option value="All" selected="selected">All</option> 
     171                    <option value="Params">Parameters</option> </select>)</td></tr> 
     172                <tr><td align="center"><div class="searchMethod"> 
     173                    <table><tbody> 
     174                        <tr><td colspan="2"><span class="searchHdr"> Refine by Temporal Coverage </span></td></tr> 
     175                        <tr><td>Start date: </td> 
     176                            <td><input type="text" value="%(startDateDay)s" size="2" name="startDateDay"/> 
     177                                <input type="text" value="%(startDateMon)s" size="3" name="startDateMon"/> 
     178                                <input type="text" value="%(startDateYear)s" size="4" name="startDateYear"/> 
     179                            </td> 
     180                        </tr>       
     181                        <tr><td>End date: </td> 
     182                            <td><input type="text" value="%(endDateDay)s" size="2" name="endDateDay"/> 
     183                                <input type="text" value="%(endDateMon)s" size="3" name="endDateMon"/> 
     184                                <input type="text" value="%(endDateYear)s" size="4" name="endDateYear"/> 
     185                            </td> 
     186                        </tr> 
     187                        <tr><td colspan="2">(Format: dd mmm yyyy)</td></tr> 
     188                    </tbody></table> 
     189                </div></td></tr> 
     190                <tr><td align="center"><div class="searchMethod"> 
     191                    <table><tbody> 
     192                        <tr><td colspan="3"><span class="searchHdr"> Refine by Spatial Coverage</span><br/></td></tr> 
     193                        <tr><td>Northerly Latitude:</td> 
     194                            <td colspan="2" align="center"> 
     195                            <input size="7" value="%(bboxN)s" name="bboxN"/></td></tr> 
     196                        <tr><td>Longitudinal Extent:</td> 
     197                            <td><input size="8" value="%(bboxW)s" name="bboxW"/></td> 
     198                            <td><input size="8" value="%(bboxE)s" name="bboxE"/></td> </tr> 
     199                        <tr><td> Southerly Latitude:</td> 
     200                        <td colspan="2" align="center"> 
     201                        <input size="7"value="%(bboxS)s" name="bboxS"/></td></tr> 
     202                        <tr><td colspan="3"> (Units: degrees, north and east positive)</td></tr> 
     203                     </tbody></table> 
     204                </div></td></tr> 
     205                <tr><td align="center"><div class="searchMethod">  
     206                    <table><tbody> 
     207                        <tr><td colspan="2"><span class="searchHdr"> Refine by Source Data Centres </span></td></tr> 
     208                        <tr><td> All</td><td><input type="radio" name="source" value="All" checked="checked"></td></tr> 
     209                        <tr><td> NERC Data Centres</td><td><input type="radio" name="source" value="NERC_DDC"/></td></tr> 
     210                        <tr><td> Marine Data Partnership (MDIP)</td><td><input type="radio" name="source" value="MDIP"/></td></tr> 
     211                    </tbody></table> 
     212                 </div></td></tr> 
     213                <tr><td align="center"><input type="submit"></td></tr> 
     214            </tbody></table> 
     215            <input type="hidden" value="1" name="advanced"/> 
     216         </form> 
     217    </div>''' 
     218     
     219     
     220     
  • TI07-MOLES/trunk/PythonCode/wsgi/layout/ndg.css

    r2528 r2533  
    7676tr.rbgGrey {BACKGROUND-COLOR: #EEEEE0; } 
    7777tr.rbgBeige {BACKGROUND-COLOR: #FDFFCC; } 
     78.searchString {BACKGROUND-COLOR: white; margin-left:2px; margin-right:2px;} 
    7879/* end of result set controls */ 
    7980 
  • TI07-MOLES/trunk/PythonCode/wsgi/ndgLog.py

    r2528 r2533  
    5050    '''Default error handling WSGI application.''' 
    5151    start_response(HTTPMSG, [('Content-type', 'text/plain')], 
    52          exc_info=sys.exc_info()) 
    53 #        sys.exc_info()) 
     52#         exc_info=sys.exc_info()) 
     53        sys.exc_info()) 
    5454    return [ERRORMSG]     
    5555 
  • TI07-MOLES/trunk/PythonCode/wsgi/ndgPageLayout.py

    r2522 r2533  
    9191            failure=0 
    9292        except Exception,e: 
    93             raise Exception,e 
    94             response+='''<p> Unable to fufill request, probably an error in the metadata record.  
    95             NDG staff have been advised. Please try another search. </p>''' 
    9693            body='Error [%s]\n'%e 
     94            response+='''<p> Unable to fufill request. NDG staff have been advised.  
     95            Please try another search. </p><p>%s</p> '''%body 
    9796            body+=str(environ) 
    9897            mailError('b.n.lawrence@rl.ac.uk','Discovery/Browse Error',body,server=self.mailServer) 
  • TI07-MOLES/trunk/PythonCode/wsgi/renderDiscoverySet.py

    r2528 r2533  
    55from renderService import * 
    66debug=1 
     7WIDTH="70%" 
    78 
    89def CalculateStride(start,stride,total): 
     
    4344        html+=', %s'%hyperlink(l1,lasturl) 
    4445    html+='.' 
    45     stml='Search for <span class="searchString">%s</span>.'%state.searchString 
     46    print state 
     47    stml='Search for <span class="searchString">%s</span>%s.'%(state.searchString,state.constraints) 
    4648    html='''<div class="stridePosition"><table width="100%%"><tbody> 
    47             <tr><td align="left">%s</td><td align="right">%s</td></tr></tbody></table></div>'''%(stml,html) 
     49            <tr><td align="left" width="%s">%s</td><td align="right">%s</td></tr></tbody></table></div>'''%(WIDTH,stml,html) 
    4850    return html 
    4951     
     
    6769    def row(rowlist,rclass='rbgWhite'): 
    6870        print rowlist 
    69         r= '''<tr class="%s"><td width="70%%">%s</td><td width="12%%" align="center">%s</td> 
    70             '''%(rclass,rowlist[0],rowlist[1]) 
     71        r= '''<tr class="%s"><td width="%s">%s</td><td width="12%%" align="center">%s</td> 
     72            '''%(rclass,WIDTH,rowlist[0],rowlist[1]) 
    7173        ll=len(rowlist) 
    7274        print 'BBB[',rowlist[2:],']' 
Note: See TracChangeset for help on using the changeset viewer.