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

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI03-DataExtractor/branches/old_stuff/dx_badc/userInterface.py@793
Revision 793, 14.2 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"""
2output.py
3=========
4
5Output module for the 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 *
28
29class UserInterface:
30 
31    def __init__(self):
32        # Required header that tells the browser how to render the text.
33        print "Content-Type: text/html\n\n" 
34 
35    def writeHeader(self, headfile=os.path.join(html_dir, "header.html")):
36        print open(headfile).read()
37
38    def writeFooter(self, footfile=os.path.join(html_dir, "footer.html")):
39        print open(footfile).read()
40
41    def writeErrorInfo(self, error):
42        print """<P><FONT COLOR="red">You selected the value '%s' for the field
43'%s'. This is invalid please go back and try again.</FONT><P>""" % (error[0], error[1])
44
45    def writeLoginForm(self, login_status): pass
46
47    def writeLoginForm2(self, login_status):
48        if login_status==1:
49            action, info_text=("Logout", "&nbsp;of restricted datasets")
50        else:
51            action, info_text=("Login", "&nbsp;to access restricted datasets.")
52
53        print """<P><TABLE BGCOLOR="#DDDDDD"><TR WIDTH="100%%"><TD>
54<FORM NAME="loginForm" method="POST" action="%s">
55<BUTTON TYPE="submit" NAME="%s" VALUE="%s">%s</BUTTON>%s
56</FORM></TD></TR></TABLE><P>""" % (cgi_name, action.lower(), action.lower(), action, info_text) 
57
58    def writeRequestInfo(self, request, stage=0):
59        if request.has_key("num_datasets"):
60            top_count=int(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=int(request["num_datasets"])+1
118        else:
119            top_count=2
120        dsetdb=Datasetdb()
121        this_page=pages[stage+1]
122        selected_flag=None
123
124        #print "<P>REQUEST: %s<P>" % request
125
126        print '<TABLE WIDTH="100%"><TR class="tablerow"><TD>FURTHER SELECTION</TD></TR></TABLE>'
127        # Begin form in HTML output
128        print """<FORM NAME="extract_info" method="POST" action="%s">
129<INPUT NAME="target_page" TYPE="hidden" VALUE="%s">""" % (cgi_name, this_page)
130        if request.has_key("req_id"):
131            print '<INPUT NAME="req_id" TYPE="hidden" VALUE="%s">' % request["req_id"]
132        if request.has_key("allowed_groups"):
133            print '<INPUT NAME="allowed_groups" TYPE="hidden" VALUE="%s">'  % request["allowed_groups"]
134
135        print '<TABLE WIDTH="100%"><TR>'
136        for count in range(1, top_count):
137
138          print '<TD WIDTH="50%" class="tablestyle" VALIGN="top">'
139          if not request.has_key("dataset_%s" % count) or request["target_page"]==pages[0] :
140            all_datasets=dsetdb.getDatasets()
141            if not request.has_key("allowed_groups"): 
142                allowed_groups=[]
143            else: 
144                allowed_groups=request["allowed_groups"]
145            allowed_datasets=[]
146            for dset in all_datasets:
147                    protect_id=all_datasets[dset]
148                    #print protect_id
149                   
150                    if protect_id==None or protect_id in allowed_groups: 
151                        allowed_datasets.append(dset)
152                    #except:
153                    #  if string.find(allowed_groups, protect_id)>-1:
154                        #allowed_datasets[dset]=dset
155            choices=("Dataset %s" % count, allowed_datasets)
156            #selected_flags[count]=choices[1][0]
157          else:
158
159            #selected_flag=request["dataset_%s" % count]
160
161            if not request.has_key("subset_%s" % count) or request["target_page"]==pages[1]:
162                choices=("Subset %s" % count, map(lambda x: x[0], dsetdb.getSubsets(request["dataset_%s" % count])))
163                #selected_flags[count]=choices[1][0]
164            else:
165
166                #selected_flag=request["subset_%s" % count]
167
168                if not request.has_key("variable_%s" % count) or request["target_page"]==pages[2]:
169                    if request.has_key("datasetURI_%s" % count):
170                        var_list=dsetdb.getVariables(datasetURI=request["datasetURI_%s" % count])
171                    else:
172                        var_list=dsetdb.getVariables(dataset=request["dataset_%s" % count], subset=request["subset_%s" % count])
173                    choices=("Variable %s" % count, tuple(var_list))
174                    #selected_flags[count]=choices[1][0]
175
176                else:   
177                    #selected_flag=request["variable_%s" % count]
178                    if not request.has_key("domain") or request["target_page"]==pages[3]:   # If domain not defined need to call separate method.
179                        self.writeDomainOptions(request)
180                        return
181
182          print "<P><B>PLEASE SELECT: %s</B><P>" % choices[0]
183
184          radio_name=choices[0].lower().replace(" ", "_")
185          if request.has_key(radio_name):    selected_flag=request[radio_name]
186          if selected_flag==None:   selected_flag=choices[1][0]
187          #print "<P>SELECTED: %s, %s</P>" % (selected_flag, radio_name)
188          for choice in choices[1]:
189                #print "<P>::%s::%s::" % (choice, selected_flag)
190                if choice==selected_flag:
191                     print '<BR><INPUT TYPE="radio" NAME="%s" VALUE="%s" CHECKED>%s</INPUT>' % (radio_name, choice, choice)
192                     #selected_flag=1
193                else:
194                     print '<BR><INPUT TYPE="radio" NAME="%s" VALUE="%s">%s</INPUT>' % (radio_name, choice, choice)
195          print "</TD>"
196
197        print "</TR></TABLE>"
198
199        print '<P><BUTTON TYPE="submit" NAME="proceed">Forward</BUTTON><P>'
200        print "</FORM><P>"
201         
202
203    def writeDomainOptions(self, request):
204        if request.has_key("num_datasets"):
205            top_count=int(request["num_datasets"])+1
206        else:
207            top_count=2
208
209        dsetdb=Datasetdb()
210        #if request.has_key("datasetURI_1"):
211        #    domain=dsetdb.getDomain(variable=request["variable_1"], datasetURI=request["datasetURI_1"])
212        #else:
213        #    domain=dsetdb.getDomain(request["dataset_1"], request["subset_1"], request["variable_1"])
214        #(north, west, south, east)=domain[0]
215        (north, west, south, east)=dsetdb.getHorizontalSpatialDomain(request["dataset_1"], request["subset_1"], request["variable_1"])
216        #levels=domain[1][0]
217
218        # timeDict holds time list dictionaries for start and end times, time units and time interval for each dataset
219        timeDict={}
220        for dset_num in range(1, top_count):
221            (levels, vertical_units)=dsetdb.getVerticalSpatialDomain(request["dataset_%s" % dset_num], request["subset_%s" % dset_num], request["variable_%s" % dset_num])
222            start_time={}
223            end_time={}
224            (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])
225     
226            counter=0
227
228            for key in time_keys:
229                start_time[key]=start_time_list[counter]
230                end_time[key]=end_time_list[counter]
231                counter=counter+1
232
233            timeDict["dataset_%s" % dset_num]=(start_time, end_time, interval_value, interval_units) 
234            #print "<P>TD:%s" % timeDict
235           
236        #(interval_value, interval_units)=domain[2][2]
237       
238        #print "<p>%s, %s<p>" % (interval_units, interval_value)
239
240        if type(levels)==str: levels=(levels,)
241        if len(levels)>3:
242            levboxheight=3
243        else:
244            levboxheight=len(levels)
245
246        # Now print output
247        print "<P><B>SPATIAL AND TEMPORAL SELECTION</B><P>"
248
249
250        # Horizontal Domain
251        print '<B>Horizontal Domain</B><P>'
252
253        print """<TABLE><TR><TD WIDTH="33%%"></TD>
254<TD WIDTH="34%%"><INPUT TYPE="text" NAME="north" VALUE="%s" SIZE="6"> N </TD>
255<TD WIDTH="33%%"></TD></TR>
256<TR><TD><INPUT TYPE="text" NAME="west" VALUE="%s" SIZE="6"> W </TD>
257<TD></TD>
258<TD><INPUT TYPE="text" NAME="east" VALUE="%s" SIZE="6"> E </TD>
259<TD></TD>
260<TR><TD></TD>
261<TD><INPUT TYPE="text" NAME="south" VALUE="%s" SIZE="6"> S </TD>
262<TD></TD></TR></TABLE>
263<input type="button" value="Select from map"
264    onClick="newWindow('%s','window2',550,400);">
265""" % (north, west, east, south, map_applet)
266
267        print '<INPUT NAME="resolution" TYPE="hidden" VALUE="1.0">'
268
269        # Vertical domain
270        print """<P><B>Vertical Domain</B><P>
271Levels <SELECT MULTIPLE NAME="vertical_domain" SIZE="%s" WIDTH="50" VALUE="%s">""" % (levboxheight, levels[0])
272        for level in levels:
273            print "<OPTION> %s" % level
274        print "</SELECT>"
275        print '<INPUT NAME="vertical_units" TYPE="hidden" VALUE="hPa">'
276
277        # Temporal domain
278        print '<P><B>Time</B><P><TABLE WIDTH="100%"><TR>'
279        for dset_num in range(1, top_count):       
280            (interval_units, interval_value)=timeDict["dataset_%s" % dset_num][2:]
281            (start_time, end_time)=timeDict["dataset_%s" % dset_num][:2]
282            print '<INPUT NAME="time_interval_units_%s" TYPE="hidden" VALUE="%s">' % (dset_num, interval_units) 
283            print '<INPUT NAME="time_interval_value_%s" TYPE="hidden" VALUE="%s">' % (dset_num, interval_value)
284            print '<TD WIDTH="50%">'
285            print '<TABLE BORDER="1"><TR>'
286
287            for part in ("Dataset %s: Start time" % dset_num, "start", "text", "end", "End time"):
288                if part in ("Dataset %s: Start time" % dset_num, "End time"):
289                    print '<TD COLSPAN="6">%s</TD>' % part
290                else:
291                  field_flag=""
292                  for key in time_keys:
293                    if part=="text":
294                        print "<TD>%s</TD>" % key
295                    elif part in ("start", "end"):
296                        print '<TD><SELECT NAME="%s_%s_%s" %s onChange="checkDateOrder(\'%s\');">' % (part, key, dset_num, field_flag, part)
297                        if key=="year":
298                            time_format="%.4d"
299                        else:
300                            time_format="%.2d"
301
302                        if interval_units==key:
303                            interval=interval_value
304                            #field_flag="DISABLED"
305                        else:
306                            interval=1
307
308                        if key=="month":
309                            fudged_end_time=12
310                        elif key=="day":
311                            fudged_end_time=31
312                        else:
313                            fudged_end_time=end_time[key]
314                        for item in range(start_time[key], fudged_end_time+1, interval):
315                            print ("<OPTION>"+time_format) % item
316               
317                        print "</SELECT></TD>"
318
319                print "</TR>"
320            print "</TABLE>"
321            print "</TD>"
322
323        print "</TR></TABLE><P>"
324        self.writeOutputPage()
325
326
327    def writeOutputPage(self):
328        print """Format <SELECT NAME="output_type">
329<OPTION>NetCDF</SELECT>""" # <OPTION>GRIB
330        print "&nbsp;&nbsp; Note that visualisation options only currently support NetCDF format."
331 
332        print '<P><BUTTON TYPE="submit" NAME="proceed">Forward</BUTTON><P>'
333        print "</FORM><P>"
334
335
336    def writeResults(self, request):
337        print "<H1>Your job is being processed. Please wait...</H1>"
338        print "<P>Your job specification is:<P>"
339        print "<TABLE><TR><TD><B>Field</B></TD><TD><B>Value</B></TD></TR>"
340       
341        for key in request.keys():
342            print "<TR><TD>%s</TD><TD>%s</TD></TR>" % (key, request[key])
343
344        print "</TABLE>"
345        return request
346       
347           
348    def writePage(self, request, stage):
349        self.writeHeader()
350        self.writeRequestInfo(request, stage)
351        self.writeForm(request, stage)
352        self.writeFooter()
353
354       
355
Note: See TracBrowser for help on using the repository browser.