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

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

Further modifications to support xml versions of displayed records in
discovery.

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