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

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

added type ahead and filepath into UI options.

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