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

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

Sundry modifications associated with the deployment on glue, and better
options for viewing and downloading the underlying xml records (not yet
complete)

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            results=ws.getLabelledDocs()
133            difs=[]
134            for result in results: 
135                obj=ndgObject(result[0])
136                obj.setConfig(self.config)
137                difs.append(DIF(result[1],ndgObject=obj))
138            if results==[]:
139               self.html+='<p>No results for "%s"!</p>'%searchString
140            else:
141               self.html+='<p>Search results for "%s":</p>'%searchString
142               self.html+=renderDiscoverySet(difs,state,config=self.config,
143                               summary=1,spatial=1,temporal=1,services=1)
144                               
145        self.standardInterface()
146        return
147
148    def standardInterface(self):
149       
150        try:
151            helpAddress=self.config.get('SEARCH','helpURL')
152            discoveryURL=self.config.get('SEARCH','discoveryURL')
153            advancedURL=self.config.get('SEARCH','advancedURL')
154        except:
155            self.message='Error, invalid configuration for search interface'
156            self.html+=''
157            return
158       
159        self.html+=DiscoveryTemplate.main%locals()
160        return
161   
162    def advancedInterface(self):
163       
164        try:
165            helpAddress=self.config.get('SEARCH','helpURL')
166            discoveryURL=self.config.get('SEARCH','discoveryURL')
167            advancedURL=self.config.get('SEARCH','advancedURL')
168        except:
169            self.message='Error, invalid configuration for search interface'
170            self.html=''
171            return
172        advancedSubmit=DiscoveryTemplate.advancedSubmit%locals()
173        searchText=DiscoveryTemplate.searchText
174        searchTime=DiscoveryTemplate.searchTime
175        searchArea=DiscoveryTemplate.searchArea
176        searchSource=DiscoveryTemplate.searchSource
177        self.html+=DiscoveryTemplate.advanced%locals()
178        return
179   
180    def helpInterface(self,advanced):
181        if advanced:
182            self.advancedInterface()
183        else:
184            self.standardInterface()
185        helpFile=self.config.get('HELP','helpFile')
186        f=file(helpFile,'r')
187        self.html+=f.read()
188        return
189       
190       
Note: See TracBrowser for help on using the repository browser.