source: TI07-MOLES/trunk/PythonCode/wsgi/DiscoveryGUI.py @ 2330

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/PythonCode/wsgi/DiscoveryGUI.py@2330
Revision 2330, 7.9 KB checked in by lawrence, 15 years ago (diff)

Sundry testcases plus a a bug fix for ticket:666 ... it's done, but I
don't like this bugfix because it shows that I don't really understand
unicode properly. Need to revisit unicode again ... later.

Line 
1import DiscoveryTemplate
2from paste.request import parse_querystring
3import ndgSearch as NS
4from DIF import DIF
5from renderDiscoverySet import renderDiscoverySet
6from DiscoveryState import DiscoveryState
7from Utilities import myConfig
8from ndgObject import ndgObject
9debug=1
10class DiscoveryGUI:
11    ''' This class handles the NDG gui search interface, and is intimately related to the
12    template.py code which provides the gui interface and the variables which need to be populated '''
13   
14    #The key options are either there is content in the inputdictionary, in which case we have a
15    #search to do, and then some results to present, or there is none, in which case we present
16    #an appropriate interface back to the user (remembering that we only produce part of a page,
17    #this can all be embedded in anything else.
18   
19    def __init__(self,environ,config,logger):
20        ''' Takes a dictionary of variables which have been populated by the cgi (or whatever)
21        handler, and tests them for sanity before handing queries off to the NDG backend xqquery
22        web service '''
23       
24        inputs=dict(parse_querystring(environ))
25        self.inputs=inputs
26        self.environ=environ
27        self.config=config
28        self.logger=logger
29
30        self.message=''
31        self.html=''
32       
33        #is this simply a blank request for an interface?
34        if self.inputs.keys()==[]:
35            self.html+='<div id="superPad">'
36            self.standardInterface()
37            self.html+='</div>'
38            return
39        elif self.inputs.keys()==['advanced']:
40            self.advancedInterface()
41            return
42        elif self.inputs.keys()==['help']:
43            self.helpInterface(0)
44            return
45        elif self.inputs.keys()==['help','advanced']:
46            self.helpInterface(1)
47            return
48       
49        #check simplest text issues common to both simple and advanced search
50        expected=['advanced','textTarget','searchString']
51        self.__checkform(expected)
52        if self.message!='': return
53       
54        #the following may also be present
55        continuations={'start':1,'howmany':10}
56        for i in continuations:
57            if i not in self.inputs: self.inputs[i]=continuations[i]
58           
59        advanced=int(self.inputs['advanced'])
60       
61        self.html=''
62        if not advanced:
63            self.doText(self.inputs['searchString'],self.inputs['textTarget'],
64                        self.inputs['start'],self.inputs['howmany'])
65        else:
66            #check content
67            expected=['timeLimit','startDateDay','startDateMon','startDateYear',
68                        'endDateDay','endDateMon','endDateYear','spaceLimit',
69                        'bboxN','bboxE','bboxS','bboxW',
70                        'sourceLimit']
71            self.__checkform(expected)
72            if self.message!='': return
73             
74            if int(self.inputs['sourceLimit']):
75                scope=[]
76                if 'sourceMDIP' in self.inputs:
77                    if self.inputs['sourceMDIP']: scope.append('MDIP')
78                if 'sourceNERC' in self.inputs:
79                    if self.inputs['sourceNERC']: scope.append('NERC')
80            else:
81                scope=None
82               
83            if int(self.inputs['spaceLimit']):
84                bbox=[self.inputs['bboxN'],self.inputs['bboxS'],self.inputs['bboxW'],self.inputs['bboxE']]
85            else:
86                bbox=None
87               
88            if int(self.inputs['timeLimit']):
89                dateRange=[(self.inputs['startDateDay'],self.inputs['startDateMon'],self.inputs['startDateYear']),
90                           (self.inputs['endDateDay'],self.inputs['endDateMon'],self.inputs['endDateYear'])]
91            else:
92                dateRange=None
93               
94            self.doText(self.inputs['searchString'],self.inputs['textTarget'],
95                        self.inputs['start'],self.inputs['howmany'],scope=scope,dateRange=dateRange,bbox=bbox)
96           
97        return
98           
99    def __checkform(self,expected):
100        ''' Simply checks the inputs to make sure the elements in expected are present '''
101        message="An incomplete NDG search form was received: "
102        for i in expected:
103            if i not in self.inputs: 
104                self.message=message+i
105                self.html='<p>%s</p>'%self.message
106               
107    def __setState(self,id,hits,offset,stride):
108        ''' Sets the discovery state to be used by external routines '''
109        return DiscoveryState(id,self.environ,hits,offset,stride)
110       
111    def doText(self,searchString,textTarget,start,howmany,scope=None,dateRange=None,bbox=None):
112        ''' Carry out a text search for <searchString>
113        in the <textTarget> where the accepted text target values are controlled
114        by the DiscoveryTemplate GUI, and are: All, Authors, Parameters '''
115       
116        start,howmany=int(start),int(howmany)  # url arguments need conversion ...
117       
118        ws=NS.ndgSearch(logger=self.logger)
119        documents=ws.search(searchString,start=start,howmany=howmany,target=textTarget,
120                            scope=scope,dateRange=dateRange,bbox=bbox)
121        if ws.error !=None:
122            for i in ws.error:
123                self.html+='<p>%s</p>'%i
124            return
125       
126        hits=ws.hits
127        id=ws.serverSessionID
128        state=self.__setState(id,hits,start,howmany)
129        if hits==0: 
130            self.html+='<p> No records found </p>'
131        else:
132            try:
133                results=ws.getLabelledDocs(format='DIF')
134                difs=[]
135                for result in results: 
136                    obj=ndgObject(result[0])
137                    obj.setConfig(self.config)
138                    difs.append(DIF(result[1],ndgObject=obj))
139                    if debug: print 'DIF record obtained: %s'%difs[-1].entryID
140                if results==[]:
141                    self.html+='<p>No results for "%s"!</p>'%searchString
142                else:
143                    self.html+='<p>Search results for "%s":</p>'%searchString
144                    self.html+=renderDiscoverySet(difs,state,config=self.config,
145                               summary=1,spatial=1,temporal=1,services=1)
146            except ValueError,e:
147                if debug: 
148                    raise ValueError,str(e)
149                else:
150                    self.html='<p> Error retrieving documents for %s hits is [%s]</p>'%(hits,e)
151                               
152        self.standardInterface()
153        return
154
155    def standardInterface(self):
156       
157        try:
158            helpAddress=self.config.get('SEARCH','helpURL')
159            discoveryURL=self.config.get('SEARCH','discoveryURL')
160            advancedURL=self.config.get('SEARCH','advancedURL')
161        except:
162            self.message='Error, invalid configuration for search interface'
163            self.html+=''
164            return
165       
166        self.html+=DiscoveryTemplate.main%locals()
167        return
168   
169    def advancedInterface(self):
170       
171        try:
172            helpAddress=self.config.get('SEARCH','helpURL')
173            discoveryURL=self.config.get('SEARCH','discoveryURL')
174            advancedURL=self.config.get('SEARCH','advancedURL')
175        except:
176            self.message='Error, invalid configuration for search interface'
177            self.html=''
178            return
179        advancedSubmit=DiscoveryTemplate.advancedSubmit%locals()
180        searchText=DiscoveryTemplate.searchText
181        searchTime=DiscoveryTemplate.searchTime
182        searchArea=DiscoveryTemplate.searchArea
183        searchSource=DiscoveryTemplate.searchSource
184        self.html+=DiscoveryTemplate.advanced%locals()
185        return
186   
187    def helpInterface(self,advanced):
188        if advanced:
189            self.advancedInterface()
190        else:
191            self.standardInterface()
192        helpFile=self.config.get('HELP','helpFile')
193        f=file(helpFile,'r')
194        self.html+=f.read()
195        return
196       
197       
Note: See TracBrowser for help on using the repository browser.