source: cows_wps/trunk/cows_wps/renderer/ui_renderer.py @ 7106

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cows_wps/trunk/cows_wps/renderer/ui_renderer.py@7106
Revision 7106, 6.3 KB checked in by astephen, 10 years ago (diff)

Got job cancellation working. Still needs to pick up responses propoerly

Line 
1import os
2
3from pylons import config, request, tmpl_context as c
4from routes import url_for
5
6from genshi.template import TemplateLoader
7from genshi.builder import * 
8from genshi import HTML
9
10from cows_wps.renderer.form_renderer import *
11
12#c.tester = "OOJOJ"
13
14
15class UIPageRenderer(object):
16    """
17    A set of rendering methods.
18    """
19
20    def __init__(self):
21        # Instantiate Genshi template loader
22        self.template_dir = config["wps.template_dir"]
23        self.templateLoader = TemplateLoader(self.template_dir, auto_reload=True)
24
25    def _htmlifyItems(self, items):
26        """
27        Ensures that template treats all content items as HTML.
28        """
29        new_items = []
30
31        for i in range(len(items)):
32            new_items.append((items[i][0], HTML(items[i][1])))
33
34        return new_items
35
36    def render(self, title, items, bbox_required=False):
37        """
38        Renders the page using title and then a list of tuples of
39         (section_title, section_content).
40        """
41        tmpl_gen = self.templateLoader.load("ui_template.html")
42        # Make sure items are HTML and won't be escaped
43        items = self._htmlifyItems(items)
44        stream = tmpl_gen.generate(title=title, items=items, 
45                        wps_capabilities_url="/wps?Service=WPS&Request=GetCapabilities&Format=text/xml",
46                        bbox_required=bbox_required)
47        return stream.render('xhtml')
48
49
50    def renderJobsPage(self, user_id, jobs, total_matches, args, bad_args):
51        """
52        Renders jobs page.
53        """
54        jobs_html = '<b>Total jobs matched: <span style="background: white; border: solid 1px; padding: 3px;">%d</span></b><br/><br/>' % total_matches
55        jobs_html += self._renderJobsTable(user_id, jobs)
56 
57        filter_html = "Please select the filtering options and press the 'Filter jobs' button to submit the new filter settings."
58
59        if len(bad_args.keys()) > 0:
60            msg = "Warning: the following arguments were provided with unknown values: <br/><br/>"
61
62            for (key, value) in bad_args.items():
63                msg += "%s = %s<br/>" % (key, value) 
64
65            filter_html += '<center><div id="incorrect_arguments" style="width: 600px; border-width: 0px; background: orange; color: white; font-weight: bold; padding: 3px;">%s</div></center>' % msg
66
67        filter_html += self._renderFilterOptions(args)
68
69 
70        items = [("Welcome to the Jobs Page", "The Jobs Page allows you to view current and previous jobs. Select the filter options to modify the records matched."),
71                 ("Filter the Job List", filter_html),
72                 ("Jobs", jobs_html)] 
73
74        return self.render("Jobs Page", items)
75
76
77    def _renderJobsTable(self, user_id, jobs):
78        "Renders and returns (as string) table of HTML jobs."
79        html = """
80<table border="2">
81        <tr>
82                <td>Request ID</td>
83                <td>Job type</td>
84                <td>User</td>
85                <td>Submission time</td>
86                <td>Job status</td>
87                <td>Action</td>
88        </tr>\n"""
89
90        count = 0
91
92        for  (req_id, user, status, job_type, created) in jobs:
93            created = created.split(".")[0]
94
95            # Set colour style for row
96            count += 1
97            row_style = ("even_row", "odd_row")[count % 2]
98
99            # Set action
100            status_url = "http://" + request.environ["HTTP_HOST"] + url_for(controller = 'status', requestId = req_id) 
101            job_viewer_url = url_for(controller = 'jobviewer') + "?status_url=" + status_url
102            action = '<a href="%s">View job info/outputs</a>' % job_viewer_url
103
104            if status in ("STARTED", "ACCEPTED"):
105                cancel_url = url_for(controller = "user", action = "cancel", userId = user_id, jobId = req_id) 
106                action += '<br/><a href="%s">Cancel this job</a>' % cancel_url
107
108            # HTML for row
109            row = '<tr class="%s"><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n' % (row_style, req_id, job_type, user, created, status, action)
110            html += row
111
112        html += "</table>"
113        return html
114
115
116    def _renderFilterOptions(self, args):
117        """
118        Returns a string for the rendered HTML for filter form.
119        """
120        fr = FormRenderer()
121
122        filters = [("job_id_match", {"type": "text", "regex": "any", "text": "Job ID matches", "default": ""}),
123                   ("job_status", {"type": "list", "text": "Job Status", "default": "-- Please select --",
124                         "optional": True, "multiple": False,
125                         "option_names": ["COMPLETED", "FAILED", "RUNNING"],
126                         "option_values": ["COMPLETED", "FAILED", "STARTED|ACCEPTED"]}),
127                   ("job_type", {"type": "list", "text": "Job Type", "default": "-- Please select --", 
128                         "optional": True, "multiple": False,
129                         "option_values": ["1", "2"], "option_names": ["1", "2"]}), 
130                   ("sub_before", {"type": "text", "regex": "datetime", "text": 
131                         "Job submitted before (format: YYYY-MM-DDThh:mm:ss)", "default": ""}),
132                   ("sub_after", {"type": "text", "regex": "datetime", "text": 
133                         "Job submitted after (format: YYYY-MM-DDThh:mm:ss)", "default": ""}),
134                  ]
135
136        html = '<form name="filter_form" action="jobs">'
137        for (id, fd) in filters:
138
139            input = "<br/>%s " % fd["text"] 
140
141            if id in args.keys():
142                value = args[id]
143                if value == None: value = ""
144            else:
145                value = fd["default"] 
146
147            if fd["type"] == "text":
148                input += fr.renderTextInput(id, fd["regex"], optional = True)
149
150            elif fd["type"] == "list":
151                selected_value = value
152                if type(selected_value) == type([1,2]): selected_value = value[0]
153                input += fr.renderSelectList(id, fd["option_values"], optional = fd["optional"], 
154                                             multiple = fd["multiple"], option_names = fd["option_names"],
155                                             selected = selected_value)
156                input += "<br/>"
157
158            html += "\n%s" % input
159
160        html += '<br/><br/>Click the button to re-load the page with these settings <input type="submit" value="Filter jobs" />'
161        html += '</form>'
162        return html
Note: See TracBrowser for help on using the repository browser.