source: TI03-DataExtractor/branches/old_stuff/dx-webservice/userInterface.py @ 793

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI03-DataExtractor/branches/old_stuff/dx-webservice/userInterface.py@793
Revision 793, 17.5 KB checked in by astephen, 13 years ago (diff)

Put all the old code in the old_stuff branch.

  • Property svn:executable set to *
Line 
1"""
2userInterface.py
3================
4
5Output module for the data extractor package.
6
7This module holds the UserInterface class that is used
8to write HTML output from the data extractor package.
9
10"""
11
12# Import required modules
13
14import os
15import string
16from datasetdb import Datasetdb
17
18# Import package modules and variables
19from common import *
20from config import *
21from errorHandler import *
22
23class UserInterface:
24    """
25    UserInterface class - used to generate interactive output based on user requests
26    and available datasets. Typically steps through the following stages:
27    1. datasetGroup page
28    2. dataset page
29    3. variables page
30    4. domain page
31    Current version only creates HTML output.
32    """
33
34    def __init__(self):
35        """
36        __init__ method - prints the http header.
37        """
38        print HTTP_HEADER
39 
40    def writeHeader(self, headfile=os.path.join(HTML_DIR, "header.html")):
41        """
42        writeHeader method - writes the header section present on all
43        output pages of the dx.
44        """
45        print open(headfile).read()
46        # Now write user message if there is one:
47        if MESSAGE_TO_USERS!=None:
48            print """<CENTER><I>
49<FONT FACE="Arial, Helvetica, sans-serif" SIZE="+1" COLOR="RED">*** %s ***</FONT></I></CENTER><BR>""" % MESSAGE_TO_USERS
50
51    def writeFooter(self, footfile=os.path.join(HTML_DIR, "footer.html")):
52        """
53        writeFooter method - writes the footer section present on all
54        output pages of the dx.
55        """
56        print open(footfile).read()
57
58    def writeRequestInfo(self, request, stage=0):
59        if request.has_key("num_datasets"):
60            top_count=request["num_datasets"]+1
61        else:
62            top_count=2
63        print '<A HREF="%s">Return to Start</A>' % cgi_name
64
65        self_caller="%s?" % cgi_name
66        first_call=1
67        for key in request.keys():
68            if key=="target_page":
69                extra="%s=%s" % (key, "INSERT_STAGE_HERE")
70            else:
71                extra="%s=%s" % (key, request[key])
72            if first_call:
73                self_caller=self_caller+extra
74                first_call=None
75            else:
76                self_caller=self_caller+"&"+extra
77        if not request.has_key("num_datasets") or request["num_datasets"]==1:
78            select_link=self_caller.replace("num_datasets=1", "num_datasets=2")
79            select_link=select_link.replace("target_page=INSERT_STAGE_HERE", "")
80            # Temporary measure - send back to start if changed
81            select_link="%s?num_datasets=2" % cgi_name
82            print ' | <A HREF="%s">Select 2 datasets</A>' % select_link
83        elif request["num_datasets"]==2:
84            select_link=self_caller.replace("num_datasets=2", "num_datasets=1")
85            select_link=select_link.replace("target_page=INSERT_STAGE_HERE", "")
86            # Temporary measure - send back to start if changed
87            select_link="%s?num_datasets=1" % cgi_name
88            print ' | <A HREF="%s">Deselect dataset 2</A>' % select_link
89
90        print '<TABLE WIDTH="100%"><TR class="tablerow"><TD COLSPAN="2">CURRENT REQUEST</TD></TR>'
91
92        print '<TR class="tablerow">'
93
94        for count in range(1, top_count):
95          print '<TD WIDTH="50%%">Dataset %s: ' % count
96          if stage==0:
97            print "None Specified"
98          elif stage>0:
99            display_string=' -&gt; <A HREF="%s">%s</A>' % (self_caller, request["dataset_%s"% count])
100            print display_string.replace("INSERT_STAGE_HERE", pages[0])
101            if stage>1:
102                display_string=' -&gt; <A HREF="%s">%s</A>' % (self_caller, request["subset_%s" % count])
103                print display_string.replace("INSERT_STAGE_HERE", pages[1])
104                if stage>2:
105                    display_string=' -&gt; <A HREF="%s">%s</A>' % (self_caller, request["variable_%s" % count])
106                    print display_string.replace("INSERT_STAGE_HERE", pages[2])
107                    if stage>3:
108                        display_string=' -&gt; <A HREF="%s">%s</A>' % (self_caller, "subset selection")
109                        print display_string.replace("INSERT_STAGE_HERE", pages[3])
110          print "</TD>"
111        print "</TR></TABLE>"
112        print "</I></B><P>"
113
114
115    def writeForm(self, request, stage=0):
116        if request.has_key("num_datasets"):
117            top_count=request["num_datasets"]+1
118        else:
119            top_count=2
120        dsetdb=Datasetdb()
121        this_page=pages[stage+1]
122
123        #print "<P>REQUEST: %s<P>" % request
124
125        print '<TABLE WIDTH="100%"><TR class="tablerow"><TD>FURTHER SELECTION</TD></TR></TABLE>'
126        # Begin form in HTML output
127        print """<FORM NAME="extract_info" method="POST" action="%s">
128<INPUT NAME="target_page" TYPE="hidden" VALUE="%s">""" % (cgi_name, this_page)
129        if request.has_key("req_id"):
130            print '<INPUT NAME="req_id" TYPE="hidden" VALUE="%s">' % request["req_id"]
131
132        print '<TABLE WIDTH="100%"><TR>'
133        for count in range(1, top_count):
134          selected_flag=None
135          print '<TD WIDTH="50%" class="tablestyle" VALIGN="top">'
136          if not request.has_key("dataset_%s" % count) or request["target_page"]==pages[0] :
137            all_datasets=dsetdb.getDatasets()
138            if not request.has_key("allowed_groups"): 
139                allowed_groups=[]
140            else: 
141                allowed_groups=request["allowed_groups"]
142            allowed_datasets=[]
143            for dset in all_datasets:
144                    protect_id=all_datasets[dset]
145                    #print protect_id
146                   
147                    if protect_id==None or protect_id in allowed_groups: 
148                        allowed_datasets.append(dset)
149                    #except:
150                    #  if string.find(allowed_groups, protect_id)>-1:
151                        #allowed_datasets[dset]=dset
152            choices=("Dataset %s" % count, allowed_datasets)
153            #selected_flags[count]=choices[1][0]
154          else:
155
156            #selected_flag=request["dataset_%s" % count]
157
158            if not request.has_key("subset_%s" % count) or request["target_page"]==pages[1]:
159                choices=("Subset %s" % count, map(lambda x: x[0], dsetdb.getSubsets(request["dataset_%s" % count])))
160                #selected_flags[count]=choices[1][0]
161            else:
162
163                #selected_flag=request["subset_%s" % count]
164
165                if not request.has_key("variable_%s" % count) or request["target_page"]==pages[2]:
166                    if request.has_key("datasetURI_%s" % count):
167                        var_list=dsetdb.getVariables(datasetURI=request["datasetURI_%s" % count])
168                    else:
169                        var_list=dsetdb.getVariables(dataset=request["dataset_%s" % count], subset=request["subset_%s" % count])
170                    choices=("Variable %s" % count, tuple(var_list))
171                    #selected_flags[count]=choices[1][0]
172
173                else:   
174                    #selected_flag=request["variable_%s" % count]
175                    if not request.has_key("north") or request["target_page"]==pages[3]:   # If domain not defined need to call separate method.
176                        self.writeDomainOptions(request)
177                        return
178
179          print "<P><B>PLEASE SELECT: %s</B><P>" % choices[0]
180
181          if len(choices[1])==0:
182              print "</TD></TR></TABLE>"
183              print """<FONT FACE="Arial, Helvetica, sans-serif" SIZE="+1"><B>
184<P>YOU DO NOT HAVE PERMISSION TO ACCESS ANY OF THE DATASETS VISIBLE BY THE DATA EXTRACTOR.<P>
185<P>You can apply for access to datasets via the BADC web pages at:<P>
186<A HREF="http://badc.nerc.ac.uk/data/list_all_datasets.html?source=home">http://badc.nerc.ac.uk/data/list_all_datasets.html?source=home</A>.<P>
187</B></FONT>
188"""
189              self.writeFooter()
190              sys.exit()
191          else:
192              radio_name=choices[0].lower().replace(" ", "_")
193              if request.has_key(radio_name):    selected_flag=request[radio_name]
194              if selected_flag==None:   selected_flag=choices[1][0]
195              #print "<P>SELECTED: %s, %s</P>" % (selected_flag, radio_name)
196              for choice in choices[1]:
197                    #print "<P>::%s::%s::" % (choice, selected_flag)
198                    if choice==selected_flag:
199                         print '<BR><INPUT TYPE="radio" NAME="%s" VALUE="%s" CHECKED>%s</INPUT>' % (radio_name, choice, choice)
200                         #selected_flag=1
201                    else:
202                         print '<BR><INPUT TYPE="radio" NAME="%s" VALUE="%s">%s</INPUT>' % (radio_name, choice, choice)
203          print "</TD>"
204
205        print "</TR></TABLE>"
206
207        print '<P><INPUT TYPE="submit" NAME="proceed" VALUE="Proceed"><P>'
208        print "</FORM><P>"
209         
210
211    def writeDomainOptions(self, request):
212        if request.has_key("num_datasets"):
213            top_count=request["num_datasets"]+1
214        else:
215            top_count=2
216
217        dsetdb=Datasetdb()
218
219        for dset_num in range(1, top_count):
220            if not request.has_key("datasetURI_%s" % dset_num): 
221                datasetURI=None
222            else:
223                datasetURI=request["datasetURI_%s" % dset_num]
224        (north, west, south, east)=dsetdb.getHorizontalSpatialDomain(request["dataset_1"], request["subset_1"], request["variable_1"], datasetURI)
225        #levels=domain[1][0]
226
227        # timeDict holds time list dictionaries for start and end times, time units and time interval for each dataset
228        timeDict={}
229        for dset_num in range(1, top_count):
230            #(levels, vertical_units)=dsetdb.getVerticalSpatialDomain(request["dataset_%s" % dset_num], request["subset_%s" % dset_num], request["variable_%s" % dset_num], datasetURI)
231            start_time={}
232            end_time={}
233            (start_time_list, end_time_list, (interval_value, interval_units))=dsetdb.getTemporalDomain(request["dataset_%s" % dset_num], request["subset_%s" % dset_num], request["variable_%s" % dset_num], datasetURI)
234     
235            counter=0
236
237            for key in time_keys:
238                start_time[key]=start_time_list[counter]
239                end_time[key]=end_time_list[counter]
240                counter=counter+1
241
242            timeDict["dataset_%s" % dset_num]=(start_time, end_time, interval_value, interval_units) 
243            #print "<P>TD:%s" % timeDict
244           
245        #(interval_value, interval_units)=domain[2][2]
246       
247        #print "<p>%s, %s<p>" % (interval_units, interval_value)
248
249        #if type(levels)==str: levels=(levels,)
250        #if len(levels)>3:
251        #    levboxheight=3
252        #else:
253        #    levboxheight=len(levels)
254
255        # Now print output
256        print "<P><B>SPATIAL AND TEMPORAL SELECTION</B><P>"
257
258
259        # Horizontal Domain
260        print '<B>Horizontal Domain</B><P>'
261
262        print """<TABLE><TR><TD WIDTH="33%%"></TD>
263<TD WIDTH="34%%"><INPUT TYPE="text" NAME="north" VALUE="%s" SIZE="6"> N </TD>
264<TD WIDTH="33%%"></TD></TR>
265<TR><TD><INPUT TYPE="text" NAME="west" VALUE="%s" SIZE="6"> W </TD>
266<TD></TD>
267<TD><INPUT TYPE="text" NAME="east" VALUE="%s" SIZE="6"> E </TD>
268<TD></TD>
269<TR><TD></TD>
270<TD><INPUT TYPE="text" NAME="south" VALUE="%s" SIZE="6"> S </TD>
271<TD></TD></TR></TABLE>
272<input type="button" value="Select from map"
273    onClick="newWindow('%s','window2',550,400);">
274&nbsp;&nbsp; Note that the map Java applet may not work if you do not have Java enabled.<P>
275""" % (north, west, east, south, map_applet)
276
277        print """<P>[&nbsp;<A NAME="/dx_extra/help_page.html#interpolation" onClick="help('/dx_extra/help_page.html#interpolation')">Note about interpolation methods.</A>&nbsp;]<P>"""
278
279        #print '<INPUT NAME="resolution" TYPE="hidden" VALUE="1.0">'
280
281        # Vertical domain
282        print '<P><B>Vertical Domain</B><P><TABLE WIDTH="100%"><TR>'
283        for dset_num in range(1, top_count):
284            (levels, vertical_units)=dsetdb.getVerticalSpatialDomain(request["dataset_%s" % dset_num], request["subset_%s" % dset_num], request["variable_%s" % dset_num], datasetURI)
285
286            if type(levels)==str: levels=(levels,)
287            if len(levels)>3:
288                levboxheight=3
289            else:
290                levboxheight=len(levels)
291
292            print '<TD WIDTH="50%%">Levels<BR><SELECT MULTIPLE NAME="vertical_domain_%s" SIZE="%s" WIDTH="50" VALUE="%s">' % (dset_num, levboxheight, levels[0])
293            lev_selected=" SELECTED"
294            for level in levels:
295                print "<OPTION%s> %s" % (lev_selected, level)
296                lev_selected=""
297            print "</SELECT>"
298            print '<INPUT NAME="vertical_units" TYPE="hidden" VALUE="hPa">' 
299            print "</TD>"
300        print "</TR></TABLE>"
301
302        #print "<H1>:%s: :%s:</H1>" % timeDict["dataset_1"][2:]
303
304        # Insert the date checking Javascript functions
305        import js_funcs
306        super_index_list=[]
307        for dset_num in range(1, top_count):
308            (start_time, end_time)=timeDict["dataset_%s" % dset_num][:2]
309            # Put together the indices of the start time
310            index_list=[0,0,0,0,0,0] # Assume the start time is beginning of first year
311            # Do month and day
312            if start_time["month"]!=1:   index_list[1]=start_time["month"]-1
313            if start_time["day"]!=1:   index_list[2]=start_time["day"]-1
314            # Do hour, minute, second
315            if start_time["hour"]!=0:   index_list[3]=start_time["hour"]
316            if start_time["min"]!=0:   index_list[4]=start_time["min"]
317            if start_time["sec"]!=0:   index_list[5]=int(start_time["sec"])
318            super_index_list=super_index_list+index_list[:]
319
320            # Put together the indices of the end time
321            index_list=[len(range(start_time["year"], end_time["year"])), 12-1, 31-1, 24-1, 60-1, 60-1] # Assume the end time is end of last year
322            # Do month and day
323            if end_time["month"]!=12:   index_list[1]=end_time["month"]-1
324            if end_time["day"]!=31:   index_list[2]=end_time["day"]-1
325            # Do hour, minute, second
326            if end_time["hour"]!=23:   index_list[3]=end_time["hour"]
327            if end_time["min"]!=59:   index_list[4]=end_time["min"]
328            if end_time["sec"]!=59:   index_list[5]=int(end_time["sec"])
329            super_index_list=super_index_list+index_list[:]
330
331        if len(super_index_list)==12:  super_index_list=super_index_list+[0,0,0,0,0,0,0,0,0,0,0,0]
332        print js_funcs.js_dateCheckFunctionGroup % tuple(super_index_list)     
333
334
335
336
337        # Temporal domain
338        print '<P><B>Time</B><P><TABLE WIDTH="100%"><TR>'
339        for dset_num in range(1, top_count):
340            (interval_value, interval_units)=timeDict["dataset_%s" % dset_num][2:]
341            (start_time, end_time)=timeDict["dataset_%s" % dset_num][:2]
342            print '<INPUT NAME="time_interval_units_%s" TYPE="hidden" VALUE="%s">' % (dset_num, interval_units) 
343            print '<INPUT NAME="time_interval_value_%s" TYPE="hidden" VALUE="%s">' % (dset_num, interval_value)
344            print '<TD WIDTH="50%">'
345            print '<TABLE BORDER="1"><TR>'
346
347            for part in ("Dataset %s: Start time" % dset_num, "start", "text", "end", "End time"):
348                if part in ("Dataset %s: Start time" % dset_num, "End time"):
349                    print '<TD COLSPAN="6">%s</TD>' % part
350                else:
351                  field_flag=""
352                  for key in time_keys:
353                    if part=="text":
354                        print "<TD>%s</TD>" % key
355                    elif part in ("start", "end"):
356                        print """<TD><SELECT NAME="%s_%s_%s" %s onChange="checkDate('%s_%s')">""" % (part, key, dset_num, field_flag, part, dset_num)
357                        if key=="year":
358                            time_format="%.4d"
359                        else:
360                            time_format="%.2d"
361
362                        if interval_units==key:
363                            #raise "IU %s %s" % (interval_value, interval_units)
364                            interval=interval_value
365                            #field_flag="DISABLED"
366                        else:
367                            interval=1
368
369                        if key=="month":
370                            fudged_start_time=1
371                            fudged_end_time=12
372                            interval=1
373                        elif key=="day":
374                            fudged_start_time=1
375                            fudged_end_time=31
376                            interval=1
377                        else:
378                            fudged_end_time=end_time[key]
379                            fudged_start_time=start_time[key]
380
381
382                        for item in range(fudged_start_time, fudged_end_time+1, interval):
383                            print ("<OPTION>"+time_format) % item
384               
385                        print "</SELECT></TD>"
386
387                print "</TR>"
388            print "</TABLE>"
389            print "</TD>"
390
391        print "</TR></TABLE><P>"
392        # Call the javascript to update the date field now!!!
393        print """<SCRIPT LANGUAGE="Javascript">resetAllDates(%s)</SCRIPT>""" % (top_count-1)
394        self.writeOutputPage()
395
396
397    def writeOutputPage(self):
398        print """Format <P><SELECT NAME="output_type">
399<OPTION>NetCDF</SELECT>""" # <OPTION>GRIB
400        print "&nbsp;&nbsp; Note that you should choose NetCDF format if you wish to visualise data."
401 
402        print '<P><INPUT TYPE="submit" NAME="proceed" VALUE="Proceed"><P>'
403        print "</FORM><P>"
404
405
406    def writeResults(self, request):
407        print "<H1>Your job is being processed. Please wait...</H1>"
408        print "<P>Your job specification is:<P>"
409        print "<TABLE><TR><TD><B>Field</B></TD><TD><B>Value</B></TD></TR>"
410       
411        for key in request.keys():
412            print "<TR><TD>%s</TD><TD>%s</TD></TR>" % (key, request[key])
413
414        print "</TABLE>"
415        return request
416       
417           
418    def writePage(self, request, stage):
419        self.writeHeader()
420        self.writeRequestInfo(request, stage)
421        self.writeForm(request, stage)
422        self.writeFooter()
423
424       
425
Note: See TracBrowser for help on using the repository browser.