source: cows_wps/trunk/cows_wps/controllers/submitter.py @ 7069

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cows_wps/trunk/cows_wps/controllers/submitter.py@7069
Revision 7069, 4.4 KB checked in by astephen, 10 years ago (diff)

updated using process_base

Line 
1import os
2import re
3import glob
4import logging
5import urllib
6
7from pylons import request, response, session, tmpl_context as c
8from pylons.controllers.util import abort, redirect_to
9from routes import url_for
10
11
12from cows.exceptions import *
13from cows.pylons.ows_controller import render_ows_exception
14
15from cows_wps.controllers import *
16from cows_wps.renderer.ui_renderer import *
17from cows_wps.model.managers import requestManager
18from cows_wps.process_handler.context.process_context import ProcessContext
19from cows_wps.renderer import xml_renderer
20
21from cows_wps.utils.parse_wps_config import wps_config_dict
22from cows_wps.utils.parse_capabilities_config import caps_config_dict
23from cows_wps.utils.common import downloadFromURL
24
25
26from cows_wps.model.managers import requestManager
27
28log = logging.getLogger(__name__)
29
30
31class SubmitterController(BaseController):
32
33
34    def index(self):
35        wps_request_url = str(request.params.getone("wps_request_url"))
36        proc_id = str(request.params.getone("proc_id"))
37
38        async = self._isAsync(proc_id)
39       
40        # If quick process then just forward
41        if async == False:
42            return self._submitToWPSAndRedirectToJobViewer(wps_request_url)
43
44        # Now we are only dealing with async requests
45        return wps_request_url
46        cost_only_request_url = wps_request_url + "&Costonly=true"
47
48        wps_resp_div = "wps_response_div"
49        resp = '<div>You have requested to run a "%s" job that will be run on the offline batch processing system. These jobs are controlled by a queuing system and it may take some time for your outputs to be produced.<br><br></div>' % proc_id
50
51        resp += '<div id="%s">Estimates of the size of the expected outputs and the duration of the job are being calculated...</div>' % wps_resp_div
52        resp += """<script type="text/javascript">
53
54        function init() {
55                makeWPSRequest('%s', '%s');
56        }
57
58</script>""" % (cost_only_request_url, wps_resp_div)
59
60        submitter_url = url_for(controller='submitter', action='conf')
61        resp += """<br><form id="confirmation" name="confirmation" action="%s" method="GET">
62<input type="hidden" name="wps_request_url" value="%s" />
63<input type="submit" name="submit" id="submit" value="Submit" disabled="disabled" />
64</form>""" % (submitter_url, urllib.unquote(wps_request_url))
65
66        renderer = UIPageRenderer()
67        resp = renderer.render("Confirmation page",
68                               [("Information about your asynchronous job", resp)])
69
70        return resp
71
72
73    def _submitToWPSAndRedirectToJobViewer(self, wps_request_url):
74        "Submits request and gets statusLocation then redirects to job viewer controller."
75        base_url = "http://" + request.url[7:].split("/")[0]
76        clean_request_url = base_url + urllib.unquote(wps_request_url)
77
78        """
79        req = urllib2.Request(url = clean_request_url)
80        cookies = request.cookies
81        expiration = datetime.datetime.now() + datetime.timedelta(days=30)
82
83        # Now go through each cookie and add it to the request object before sending
84        for cookie in cookies.items():
85            nc = Cookie.SimpleCookie()
86            (k, v) = cookie
87#            log.warn("COOKIE: %s = %s" % (k, v))
88            nc[k] = v
89#            nc[k]["domain"] = "ceda-wps1.badc.rl.ac.uk"
90            nc[k]["path"] = "/"
91#            nc[k]["expires"] = expiration.strftime("%a, %d-%b-%Y %H:%M:%S PST")
92            req.add_header('Cookie', nc.output())
93
94#        getter = urllib.urlopen(clean_request_url)
95        getter = urllib2.urlopen(req)
96        xml = getter.read()
97        getter.close()
98        """
99
100        xml = downloadFromURL(clean_request_url, cookies = request.cookies)
101
102        m = re.search('statusLocation="(.+?)"', xml)
103        status_url = m.groups()[0]
104
105        jobviewer_url = url_for(controller='jobviewer', status_url = status_url)
106        return redirect_to(jobviewer_url)
107
108
109    def conf(self):
110        "Called once confirmation is complete and just calls WPS and forwards."
111        wps_request_url = str(request.params.getone("wps_request_url"))
112        return self._submitToWPSAndRedirectToJobViewer(wps_request_url)
113       
114
115    def _isAsync(self, proc_id):
116        "Returns boolean by looking up if WPS is async."
117        process_conf = caps_config_dict[proc_id]
118        process_type = process_conf["wps_interface"]["process_type"]
119
120        if process_type.find("async") == 0:
121            return True
122        else:
123            return False
124       
Note: See TracBrowser for help on using the repository browser.