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

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

Changes to make cleaner logging in discovery/browse ..

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,mailError
8from ndgObject import ndgObject
9debug=0
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=environ['wsgilog.logger']
29        self.mailServer=self.config.get('DEFAULT','mailServer','outbox.rl.ac.uk')
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_DDC')
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        if hits<stride:stride=hits
110        return DiscoveryState(id,self.environ,hits,offset,stride)
111       
112    def doText(self,searchString,textTarget,start,howmany,scope=None,dateRange=None,bbox=None):
113        ''' Carry out a text search for <searchString>
114        in the <textTarget> where the accepted text target values are controlled
115        by the DiscoveryTemplate GUI, and are: All, Authors, Parameters '''
116       
117        start,howmany=int(start),int(howmany)  # url arguments need conversion ...
118       
119        ws=NS.ndgSearch(logger=self.logger)
120        documents=ws.search(searchString,start=start,howmany=howmany,target=textTarget,
121                            scope=scope,dateRange=dateRange,bbox=bbox)
122        if ws.error !=None:
123            for i in ws.error:
124                self.html+='<p>%s</p>'%i
125            return
126       
127        hits=ws.hits
128        id=ws.serverSessionID
129        state=self.__setState(id,hits,start,howmany)
130        if hits==0: 
131            self.html+='<p> No records found </p>'
132        else:
133            try:
134                results=ws.getLabelledDocs(format='DIF')
135                difs=[]
136                errors=[]
137                for result in results: 
138                    obj=ndgObject(result[0])
139                    obj.setConfig(self.config)
140                    try:
141                        difs.append(DIF(result[1],ndgObj=obj))
142                    except ValueError,e:
143                        errors.append((result[0],str(e)))
144                if results==[]:
145                    self.html+='<p>No results for "%s"!</p>'%searchString
146                elif difs==[]:
147                    self.html+='<p>No usable results for "%s"!'%searchString
148                else:
149                    self.html+='<p>Search results for "%s"'%searchString
150                    if errors<>[]:
151                        dp=[]
152                        for e in errors:
153                            n=ndgObject(e[0])
154                            if n.repository not in dp: dp.append(n.repository)
155                        if len(dp)<>1: 
156                            dp='[Various Data Providers]'
157                        else:
158                            dp='[%s]'%dp[0] 
159                        self.html+=' (unfortunately %s hits matched unformattable documents from %s, an internal error has been logged):</p>'%(len(errors),dp)
160                        mailError('b.n.lawrence@rl.ac.uk','DIF errors',str(errors),server=self.mailServer)
161                    else: self.html+=':</p>'
162                    self.html+=renderDiscoverySet(difs,state,config=self.config,
163                               summary=1,spatial=1,temporal=1,services=1)
164            except ValueError,e:
165                if debug: 
166                    raise ValueError,str(e)
167                else:
168                    self.html='<p> Error retrieving documents for %s hits is [%s]</p>'%(hits,e)
169                               
170        self.standardInterface()
171        return
172
173    def standardInterface(self):
174       
175        try:
176            helpAddress=self.config.get('SEARCH','helpURL')
177            discoveryURL=self.config.get('SEARCH','discoveryURL')
178            advancedURL=self.config.get('SEARCH','advancedURL')
179        except:
180            self.message='Error, invalid configuration for search interface'
181            self.html+=''
182            return
183       
184        self.html+=DiscoveryTemplate.main%locals()
185        return
186   
187    def advancedInterface(self):
188       
189        try:
190            helpAddress=self.config.get('SEARCH','helpURL')
191            discoveryURL=self.config.get('SEARCH','discoveryURL')
192            advancedURL=self.config.get('SEARCH','advancedURL')
193        except:
194            self.message='Error, invalid configuration for search interface'
195            self.html=''
196            return
197        advancedSubmit=DiscoveryTemplate.advancedSubmit%locals()
198        searchText=DiscoveryTemplate.searchText
199        searchTime=DiscoveryTemplate.searchTime
200        searchArea=DiscoveryTemplate.searchArea
201        searchSource=DiscoveryTemplate.searchSource
202        self.html+=DiscoveryTemplate.advanced%locals()
203        return
204   
205    def helpInterface(self,advanced):
206        if advanced:
207            self.advancedInterface()
208        else:
209            self.standardInterface()
210        helpFile=self.config.get('HELP','helpFile')
211        f=file(helpFile,'r')
212        self.html+=f.read()
213        return
214       
215       
Note: See TracBrowser for help on using the repository browser.