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

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

Added more filter options on jobs controller.

Line 
1import os
2
3from pylons import config, tmpl_context as c
4
5
6from genshi.template import TemplateLoader
7from genshi.builder import * 
8from genshi import HTML
9
10#c.tester = "OOJOJ"
11
12
13class UIPageRenderer(object):
14    """
15    A set of rendering methods.
16    """
17
18    def __init__(self):
19        # Instantiate Genshi template loader
20        self.template_dir = config["wps.template_dir"]
21        self.templateLoader = TemplateLoader(self.template_dir, auto_reload=True)
22
23    def _htmlifyItems(self, items):
24        """
25        Ensures that template treats all content items as HTML.
26        """
27        new_items = []
28
29        for i in range(len(items)):
30            new_items.append((items[i][0], HTML(items[i][1])))
31
32        return new_items
33
34    def render(self, title, items, bbox_required=False):
35        """
36        Renders the page using title and then a list of tuples of
37         (section_title, section_content).
38        """
39        tmpl_gen = self.templateLoader.load("ui_template.html")
40        # Make sure items are HTML and won't be escaped
41        items = self._htmlifyItems(items)
42        stream = tmpl_gen.generate(title=title, items=items, 
43                        wps_capabilities_url="/wps?Service=WPS&Request=GetCapabilities&Format=text/xml",
44                        bbox_required=bbox_required)
45        return stream.render('xhtml')
46
47
48    def renderJobsPage(self, jobs, total_matches, args, bad_args):
49        """
50        Renders jobs page.
51        """
52        rjobs = self._renderJobsTable(jobs)
53 
54        filter_html = ""
55
56        if len(bad_args.keys()) > 0:
57            msg = "Warning: the following arguments were provided with unknown values: <br/><br/>"
58
59            for (key, value) in bad_args.items():
60                msg += "%s = %s<br/>" % (key, value) 
61
62            filter_html += '<center><div id="incorrect_arguments" style="width: 600px; border-width: 0px; background: orange; color: white; font-weight: bold; padding: 3px;">%s</div>' % msg
63
64        filter_html += self._renderFilterOptions(args)
65 
66        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."),
67                 ("Filter the Job List", filter_html),
68                 ("Total Matches", str(total_matches)),
69                 ("Jobs", rjobs)]  #["<br>%s = %s" % (job[0], str(job)) for job in jobs])]
70
71        return self.render("Jobs Page", items)
72
73
74    def _renderJobsTable(self, jobs):
75        "Renders and returns (as string) table of HTML jobs."
76        html = '<table border="2"><tr><td>Job id</td><td>Job type</td><td>User</td><td>Submission time</td><td>Job status</td></tr>\n'
77        count = 0
78
79        for  (job_id, user, status, job_type, created) in jobs:
80            created = created.split(".")[0]
81
82            # Set colour style for row
83            count += 1
84            row_style = ("even_row", "odd_row")[count % 2]
85
86            # HTML for row
87            row = '<tr class="%s"><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n' % (row_style, job_id, job_type, user, created, status)
88            html += row
89
90        html += "</table>"
91        return html
92
93
94    def _renderFilterOptions(self, args):
95        """
96        Returns a string for the rendered HTML for filter form.
97        """
98        filters = [("job_id_match", {"type": "text", "text": "Job ID matches", "default": ""}),
99                   ("job_status", {"type": "list", "text": "Job Status", "default": "-- Please select --",
100                         "option_names": ("-- Please select --", "Completed", "Failed", "Running"),
101                         "option_values": ("", "COMPLETED", "FAILED", "STARTED|ACCEPTED")}),
102                  ]
103
104        html = '<form name="filter_form" action="jobs">'
105        for (id, fd) in filters:
106
107            input = "<br/>%s " % fd["text"] 
108
109            if id in args.keys():
110                value = args[id]
111                if value == None: value = ""
112            else:
113                value = fd["default"] 
114
115            if fd["type"] == "text":
116                input += '<input type="text" id="%s" name="%s" value="%s" />' % (id, id, value)
117
118            elif fd["type"] == "list":
119                input += '<select id="%s" name="%s">' % (id, id)
120
121                for (i, opt_name) in enumerate(fd["option_names"]): 
122                    opt_value = fd["option_values"][i]
123
124                    selected = "" 
125
126                    if value == opt_value:
127                        selected = ' selected="selected"'
128
129                    input += '\n        <option value="%s"%s>%s</option>' % (opt_value, selected, opt_name)
130
131                input += "</select>"
132
133            html += "\n%s" % input
134
135        html += '<input type="submit" value="Filter jobs" />'
136        html += '</form>'
137#        raise Exception(str(html))
138        return html
Note: See TracBrowser for help on using the repository browser.