source: cows_wps/trunk/cows_wps/lib/ui/proc_config.py @ 5955

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cows_wps/trunk/cows_wps/lib/ui/proc_config.py@5955
Revision 5955, 5.4 KB checked in by astephen, 11 years ago (diff)

lots of new stuff.

Line 
1import logging
2
3from cows_wps.utils.create_process_config import createProcessConfig
4
5from cows_wps.lib.ui.proc_config_convertor import ProcConfigConvertor
6from cows_wps.utils.parse_capabilities_config import caps_config_dict
7
8from cows_wps.renderer.form_renderer import FormRenderer
9
10log = logging.getLogger(__name__)
11
12
13class ProcConfig(object):
14
15    def getProcList(self):
16        proc_dict = {}
17        log.warn("%s"%caps_config_dict.keys())
18
19        for proc_id in caps_config_dict["Identifiers"]:
20            proc_dict[proc_id] = proc_id
21
22        return proc_dict
23
24    def renderProcConfig(self, proc):
25        pcc = ProcConfigConvertor()
26        proc_config = pcc.convertConfig(proc)
27        return self.renderProcessPage(proc_config)
28
29    def renderProcessPage(self, pc):
30        """
31        Takes a dictionary representing the process config.
32        Returns a list of HTML components.
33        """
34        resp = ["<div>"]
35
36        resp.extend( self.renderBlock("Process Information", pc["Process Information"]) )
37
38        resp.extend( self.renderInputs(pc["Inputs"]) )
39
40        resp.extend( self.renderBlock("Process Outputs", pc["Outputs"]) ) 
41        resp.append( "</div>\n" )
42        return resp
43
44    def renderBlock(self, id, items):
45
46        resp = ["<div>"]
47        resp.append( "<H3>%s</H3>\n" % id )
48
49        for k, v in items:
50               
51            resp.append( '<div style="width:200px;"><b>%s:</b></div><div style="position: relative; left:210px; top: -20px;">%s</div>\n' % (k, v) )
52
53        resp.append("</div>\n")
54        return resp
55
56    def renderInputs(self, items):
57        resp = ["<div>\n<H3>Process Inputs</H3>"]
58        resp.append( '<table border="1" style="position: relative; left: 30px;">\n' )
59
60        keys = ["Parameter name", "type", "item_type", "allowed_length", "possible_values"]
61        skeys = ["Parameter name", "Data type", "Is array?", "Permitted lengths", "Allowed values"]
62
63        resp.append("<tr>\n")
64        for (i, key) in enumerate(keys):
65            resp.append( '<td style="background:#FF9900"><b>%s</b></td>\n' % skeys[i] ) 
66
67        for (param_name, dct) in items: 
68
69            resp.append( '<tr>\n<td style="background:#FFFFFF">%s</td>\n' % param_name )
70
71            for key in keys[1:]:
72               
73                value = dct[key]
74                if key == "possible_values" and value != None:
75                    value = ", ".join(value)
76
77                if value != None: 
78                    resp.append( '<td style="background:#00FF00;">%s</td>\n' % value ) 
79                else:
80                    resp.append( '<td style="background:red;">-</td>\n' )
81
82            resp.append("</tr>\n")
83
84        resp.append("</table>\n")
85        resp.append("</div>\n")
86        return resp
87
88    def renderProcsViewTable(self):
89        """
90        Renders the table of all procs on the view page.
91        """
92        resp = """<table border="1" style="position: relative; left: 30px;">\n<tr>"""
93        headings = ("Process name", "Short description", "Full description", "Comments", 
94                    "Options")
95        for heading in headings:
96            resp += """<td width="20%%" style="background:#FF9900"><b>%s</b></td>\n""" % heading 
97        resp += "</tr>\n"
98
99        procs = self.getProcList()
100        for (proc, long_name) in procs.items():
101            # Get config dict for this proc
102            proc_dict = createProcessConfig(proc)["Capabilities"]["globals"]
103
104            required_items = ("Title", "Abstract", "ProcessDescription")     
105            resp += "<tr>\n<td>%s</td>\n" % proc
106
107            for req_item in required_items:
108                resp += """<td>%s</td>\n""" % proc_dict[req_item]
109
110            # Now add link to details and submit pages
111            resp += """<td><a href="/submit/form?proc_id=%s">Submit job</a><br />
112                           <a href="/view/proc?proc_id=%s">View full details</a></td>\n""" % (proc, proc)
113
114            resp += "</tr>\n"
115
116        resp += "</table>\n" 
117        return resp
118
119    def renderProcSubmissionForm(self, proc):
120        """       
121        Renders a submission form for a proc.
122        """
123        pcc = ProcConfigConvertor()
124        proc_config = pcc.convertConfig(proc)
125        inputs = proc_config["Inputs"]
126
127        # Get form renderer
128        fm = FormRenderer()
129
130        resp = """Please complete the form below to submit a request to the CEDA Web Processing Service.
131                Note that some processes are restricted to registered users only.
132                Click the 'Submit' button to submit your request."""
133
134        resp += """<form action="/submit">
135                <input type="hidden" name="proc_id" value="%s" />
136                <table border="0">\n""" % proc
137
138        # Now render the inputs dict as a form
139       
140        for (name, input) in inputs:
141            resp += """<tr><td width="30%%"><b>%s</b></td><td width="45%%">\n""" % name
142            al = input["allowed_length"]
143            pv = input["possible_values"]
144            array_or_item = input["item_type"]
145            tp = input["type"]
146
147            if tp == "bool":
148                resp += fm.renderRadioButton(name, is_boolean=True)
149           
150            elif tp in ("float", "int", "string"):
151                resp += fm.renderTextInput(name, dtype=tp) 
152
153            resp += "</td><td>%s</td></tr>\n" % "Eventually we'll put some useful advice here."
154     
155        resp += '<tr><td></td><td><input type="submit" value="Submit" /></td><td></td></table>\n</form>\n'
156        return  fm.htmlify(resp)
Note: See TracBrowser for help on using the repository browser.