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

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

more updates for submission form.

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