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

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

Better error handling, better parameter showing. Shell example
javascript as an initial step to using the Vocabserver.

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
9
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                    print result[0],obj.gettable
139                    difs.append(DIF(result[1],ndgObject=obj))
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                self.html='<p> Error retrieving documents for %s hits is [%s]</p>'%(hits,e)
148                               
149        self.standardInterface()
150        return
151
152    def standardInterface(self):
153       
154        try:
155            helpAddress=self.config.get('SEARCH','helpURL')
156            discoveryURL=self.config.get('SEARCH','discoveryURL')
157            advancedURL=self.config.get('SEARCH','advancedURL')
158        except:
159            self.message='Error, invalid configuration for search interface'
160            self.html+=''
161            return
162       
163        self.html+=DiscoveryTemplate.main%locals()
164        return
165   
166    def advancedInterface(self):
167       
168        try:
169            helpAddress=self.config.get('SEARCH','helpURL')
170            discoveryURL=self.config.get('SEARCH','discoveryURL')
171            advancedURL=self.config.get('SEARCH','advancedURL')
172        except:
173            self.message='Error, invalid configuration for search interface'
174            self.html=''
175            return
176        advancedSubmit=DiscoveryTemplate.advancedSubmit%locals()
177        searchText=DiscoveryTemplate.searchText
178        searchTime=DiscoveryTemplate.searchTime
179        searchArea=DiscoveryTemplate.searchArea
180        searchSource=DiscoveryTemplate.searchSource
181        self.html+=DiscoveryTemplate.advanced%locals()
182        return
183   
184    def helpInterface(self,advanced):
185        if advanced:
186            self.advancedInterface()
187        else:
188            self.standardInterface()
189        helpFile=self.config.get('HELP','helpFile')
190        f=file(helpFile,'r')
191        self.html+=f.read()
192        return
193       
194       
Note: See TracBrowser for help on using the repository browser.