source: DataExtractor/trunk/dxui.py @ 70

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/DataExtractor/trunk/dxui.py@70
Revision 70, 9.6 KB checked in by astephen, 16 years ago (diff)

Beta-release of dx: version 0.1.0

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
Line 
1#!/usr/local/cdat/bin/python
2#####!/home/tornado/internal/badc/software/development/cdat-4.0b3-ppio/linux/redhat7.3/bin/python
3 
4"""
5dxui.py
6======
7 
8Main module for the Data Extractor (dx) package.
9 
10This module holds the main function that is used
11to control a user request and data extraction.
12 
13Version history
14===============
15 
16Version 1.0:  - 01/03/2004
17              - Ag Stephens, British Atmospheric Data Centre.
18              - First version.
19 
20""" 
21 
22# Import required modules
23import string 
24import sys 
25# Add your location path for the dx package
26sys.path.append("/usr/local") 
27sys.path.insert(0, "/usr/local/badcdat/lib") 
28sys.path.insert(0, "/usr/local/badcdat/lib/python") 
29sys.path.append("/home/tornado/internal/badc/software/pythonlib/badc") 
30 
31import os 
32os.environ["HOME"]="/home/tornado/internal/badc" 
33 
34# Bring DataExtractor package into local scope
35from dx import * 
36import accountUtils 
37 
38import time 
39import cgi 
40import commands 
41import grp
42 
43# Set up cgi error reporting to screen
44import cgitb 
45cgitb.enable() 
46 
47# Set global variables
48
49 
50def main(args): 
51    stdout=None # to check later
52    username=None 
53    allowed_groups=None 
54    response=None 
55    #print http_header
56 
57    request={} 
58    if args==None: 
59        args={} 
60        form=cgi.FieldStorage() 
61 
62        for key in form.keys(): 
63            args[key]=form.getvalue(key) 
64            if key in ["num_datasets"]: 
65                # Make sure it is an integer
66                try: 
67                    args[key]=int(args[key]) 
68                except: 
69                    pass 
70            #print "%s::%s" % (key, args[key])
71    # Get security from configuration script conf.py
72    #### OVERRIDE SECURITY FOR NOW ####
73 
74#    print http_header
75#    print args
76 
77    if restricted_data==1: 
78        sec=Security(args) 
79 
80        if args.has_key("logout"): 
81            # logout
82            args={} 
83            sec.logout() 
84            allowed_groups=None 
85            #loginStatus=None
86 
87        else: 
88            response=sec.getLoginStatus() 
89            #print response
90            if response: 
91                username=response[0] 
92                allowed_group_codes=response[1] 
93                #loginStatus=1 
94                allowed_groups=[]
95                for i in allowed_group_codes:
96                    try:
97                        group=grp.getgrgid(int(i))[0]
98                    except:
99                        group=i
100                    allowed_groups.append(group)
101
102                    # Sort multiple group issue for ECMWFOP
103                    if group[:7]=="ecmwfop": 
104                        for g in ("ecmwfop", "ecmwfop1", "ecmwfop2"): 
105                            if g not in allowed_groups:  allowed_groups.append(g)
106
107                    # Sort the ERA40 and ERA15 merger groups
108                    if group in ("era", "era4t", "ecmwfera"):
109                        for g in ("era", "era4t", "ecmwfera"):
110                            if g not in allowed_groups:  allowed_groups.append(g)               
111
112                #print http_header, "<H1>", allowed_groups, "</H1>"                   
113                #print "<H1>", username, "</H1>"
114            else: 
115                return 
116 
117    else: 
118        allowed_groups="" 
119 
120    ui=UserInterface() 
121 
122    # If first page then don't create a request
123    if args=={}: 
124        pass 
125        # NOT YET IMPLEMENTED       
126     
127    # args now holds the input arguments (from CGI or command line)
128 
129    for key in ("_gohome",): 
130        if args.has_key(key):  del args[key] 
131 
132    if not args.has_key("req_id"): 
133        requester=Requestdb() 
134        request["req_id"]=requester.getRequestID() 
135        #request["user"]=username
136        request["target_page"]=pages[0] 
137        request["num_datasets"]=1 
138        #request["loginStatus"]=loginStatus
139    else: 
140        requester=Requestdb(args["req_id"]) 
141        request=requester.readRequest() 
142 
143    # Update request with allowed groups at each stage (this is checked every reload)
144    request["allowed_groups"]=allowed_groups
145 
146    if not request.has_key("user"): 
147        request["user"]=username
148 
149    for key in args.keys(): 
150        request[key]=args[key] 
151 
152    if request.has_key("allowed_groups"): 
153        if type(request["allowed_groups"])==str: 
154            allowed_string=request["allowed_groups"].replace(" ","") 
155            allowed_as_list=allowed_string[1:-1].split(",") 
156            cleaned_list=map(lambda x: x.replace("'", ""), allowed_as_list) 
157            request["allowed_groups"]=cleaned_list
158 
159    if request.has_key("datasetURI_2"):  request["num_datasets"]=2 
160       
161    for dset_num in range(1, request["num_datasets"]+1): 
162        if request.has_key("datasetURI_%s" % dset_num) and not request.has_key("dataset_%s" % dset_num): 
163            dsetdb=Datasetdb() 
164            URI_list=dsetdb.getSubsetURIList() 
165            for i in URI_list: 
166                if request["datasetURI_%s" % dset_num]==i[0]: # if it is a known dataset
167                    request["dataset_%s" % dset_num]=i[2] 
168                    request["subset_%s" %dset_num]=i[1] 
169            if not request.has_key("dataset_%s" % dset_num): 
170                request["dataset_%s" % dset_num]="User dataset" 
171                request["subset_%s" % dset_num]="User subset" 
172                # Note if it is not known then no security check needed.         
173            request["target_page"]="VariablesPage" 
174 
175    if request.has_key("num_datasets") and request["num_datasets"]==1: 
176        for key in ("dataset_2", "subset_2", "variable_2"): 
177            if request.has_key(key):  del request[key] 
178     
179    if request.has_key("target_page"): 
180        target_page=request["target_page"] 
181    else: 
182        target_page="DatasetPage" 
183 
184    # Extra security check
185    for dset in ("dataset_1", "dataset_2"): 
186        if request.has_key(dset): 
187            if request[dset]=="User dataset" or datasets[request[dset]]==None: 
188                pass 
189            elif datasets[request[dset]] not in request["allowed_groups"] and datasets[request[dset]]!=None: 
190                raise "You do not have permission to access the requested data!" 
191 
192    if target_page: 
193        stage=pages.index(target_page)
194    else: 
195        handleError("Target page not recognised; %s" % target_page, noheader=1, request_id=self.request["req_id"], user=self.request["user"]) 
196 
197    if target_page!=pages[4]: 
198        ui.writePage(request, stage) 
199    else:                         #  if target_page==pages[4]:
200        ui.writeHeader() 
201        ui.writeRequestInfo(request, stage) 
202        sys.stdout.flush()
203 
204        print '<FONT FACE="Arial, Helvetica, sans-serif" SIZE="-1"><P><B>Executing request...</B><P>'
205        sys.stdout.flush()
206        # Roundabout method of getting subset xml file out of list of lists.
207        source_xmls=[] 
208        for dset_num in range(1, request["num_datasets"]+1): 
209            if request["dataset_%s" % dset_num]=="User dataset": 
210                source_xmls.append(request["datasetURI_%s" % dset_num]) 
211            else: 
212                for sub in subsets[request["dataset_%s" % dset_num]]: 
213                    if sub[0]==request["subset_%s" % dset_num]: 
214                        source_xmls.append(sub[1]) 
215 
216 
217        if request["output_type"]=="NetCDF": 
218            data_producer=DataFile(source_xmls, request) 
219            estimatedDuration=data_producer.getParam(estimateDuration="yes") 
220 
221            # Tell the user they will be e-mailed when the job is complete if large job
222            if estimatedDuration>60: 
223                emailAddr=accountUtils.getUserEmail(request["user"]) 
224                print """<P>Your extraction job has been submitted and is estimated to take about %s seconds.
225<P>You will be emailed at %s when the job has finished and the output is ready.<P>Thank you for using the %s.""" % (int(estimatedDuration), emailAddr, package_name) 
226                print "<P>If you remain on this page it should eventually produce your output but the server may time out if your request is large.<P>" 
227            sys.stdout.flush()
228
229            # Now really get data...
230            data_producer.getParam()
231            (outfile, outfile_actual)=data_producer.process() 
232           
233            # E-mail the user now the data has been produced
234            if estimatedDuration>60: 
235                stdout=sys.stdout
236                sys.stdout=RedirectStdout() 
237                mail=MailUser(emailAddr, "Message from %s" % package_name) 
238                mail.sendMail("""Your extraction job has completed, you may collect the data from:\n 
239%s\n\nThank you for using this service.\n\nIf you have any comments or feedback please send them to %s.""" % (outfile, admin_mail_address)) 
240                sys.stdout=stdout
241            print "<P><B>Request processed...</B><P>" 
242            print '<A HREF="%s">Click here to download file</A>.<P>' % outfile
243            print '<A HREF="%s?fileURI=%s">Click here to visualise your NetCDF file</A>.<P>' % (visualisor, outfile_actual) 
244 
245        elif request["output_type"]=="GRIB": 
246            data_producer=GribFile(source_xmls, request) 
247            outfile=data_producer.process() 
248            print "Request processed...<P>" 
249            print '<A HREF="%s">Click here to download file</A>.<P>' % outfile
250        else: 
251            pass 
252        ui.writeFooter() 
253 
254    if request.has_key("allowed_groups"):  del request["allowed_groups"] 
255    if request.has_key("dataset_1") or request.has_key("req_id"): 
256        request["access_time"]=time.time() 
257        requester.writeRequest(request) 
258
259    return 
260
261         
262if __name__=="__main__": 
263    args={} 
264     
265    if len(sys.argv)>1:   # use command line args to test
266        for arg in sys.argv[1:]: 
267            (key, value)=arg.split("=") 
268            args[key]=value
269    else: 
270        args=None 
271 
272    main(args) 
Note: See TracBrowser for help on using the repository browser.