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

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

fix to submitter to parse args with spaces in correctly

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).replace(" ", "+")
77
78        xml = downloadFromURL(clean_request_url, cookies = request.cookies)
79
80        m = re.search('statusLocation="(.+?)"', xml)
81        status_url = m.groups()[0]
82
83        jobviewer_url = url_for(controller='jobviewer', status_url = status_url)
84        return redirect_to(jobviewer_url)
85
86
87    def conf(self):
88        "Called once confirmation is complete and just calls WPS and forwards."
89        wps_request_url = str(request.params.getone("wps_request_url"))
90        return self._submitToWPSAndRedirectToJobViewer(wps_request_url)
91       
92
93    def _isAsync(self, proc_id):
94        "Returns boolean by looking up if WPS is async."
95        process_conf = caps_config_dict[proc_id]
96        process_type = process_conf["wps_interface"]["process_type"]
97
98        if process_type.find("async") == 0:
99            return True
100        else:
101            return False
102       
Note: See TracBrowser for help on using the repository browser.