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

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

various updates. Key thing to add next is polling of jobs and update of
response when it has polled correctly. Can re-use jquery stuff in
submit_utils.js which is relatively lightweight.

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 import utils
17from cows_wps.renderer.ui_renderer import *
18from cows_wps.model.managers import requestManager
19from cows_wps.process_handler.context.process_context import ProcessContext
20from cows_wps.renderer import xml_renderer
21
22from cows_wps.utils.parse_wps_config import wps_config_dict
23from cows_wps.utils.parse_capabilities_config import caps_config_dict
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        cost_only_request_url = wps_request_url + "&Costonly=true"
46
47        wps_resp_div = "wps_response_div"
48        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
49
50        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
51        resp += """<script type="text/javascript">
52
53        function init() {
54                makeWPSRequest('%s', '%s');
55        }
56
57</script>""" % (cost_only_request_url, wps_resp_div)
58
59        submitter_url = url_for(controller='submitter', action='conf')
60        resp += """<br><form id="confirmation" name="confirmation" action="%s" method="GET">
61<input type="hidden" name="wps_request_url" value="%s" />
62<input type="submit" name="submit" id="submit" value="Submit" disabled="disabled" />
63</form>""" % (submitter_url, urllib.unquote(wps_request_url))
64
65        renderer = UIPageRenderer()
66        resp = renderer.render("Confirmation page",
67                               [("Information about your asynchronous job", resp)])
68
69        return resp
70
71
72    def _submitToWPSAndRedirectToJobViewer(self, wps_request_url):
73        "Submits request and gets statusLocation then redirects to job viewer controller."
74        base_url = "http://" + request.url[7:].split("/")[0]
75        full_url = base_url + wps_request_url
76
77        getter = urllib.urlopen(full_url)
78        xml = getter.read()
79        getter.close()
80
81        m = re.search('statusLocation="(.+?)"', xml)
82        status_url = m.groups()[0]
83
84        jobviewer_url = url_for(controller='jobviewer', status_url = status_url)
85        return redirect_to(jobviewer_url)
86
87
88    def conf(self):
89        "Called once confirmation is complete and just calls WPS and forwards."
90        wps_request_url = str(request.params.getone("wps_request_url"))
91        return self._submitToWPSAndRedirectToJobViewer(wps_request_url)
92       
93
94    def _isAsync(self, proc_id):
95        "Returns boolean by looking up if WPS is async."
96        process_conf = caps_config_dict[proc_id]
97        process_type = process_conf["wps_interface"]["process_type"]
98
99        if process_type.find("async") == 0:
100            return True
101        else:
102            return False
103       
Note: See TracBrowser for help on using the repository browser.