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

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

Put all the old code in the old_stuff branch.

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