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

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

more fixes

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        count = 0 
146        for (name, input) in inputs:
147
148            # Set colour style for row
149            count += 1
150            row_style = ("even_row", "odd_row")[count % 2]
151
152            # Start HTML for row
153            resp += """<tr class="%s"><td width="25%%"><b>%s</b></td><td width="30%%">\n""" % (row_style, name)
154
155            # Parse arguments from config
156            al = input["allowed_length"]
157            pv = input["possible_values"]
158            default = input.get("default", None)
159            opt = input.get("optional", False)
160            array_or_item = input["item_type"]
161
162            multiple = False
163            if array_or_item == "list":
164                multiple = True
165
166            tp = input["type"]
167
168            # Add a default instruction for this input type
169            instruction = ""
170            if opt == True:
171                instruction = "This input is optional."
172
173            # Now render them according to data type etc
174            if pv != None:
175                resp += fm.renderSelectList(name, values=pv, optional=opt, multiple=multiple)
176                n_items = "an item"
177                if multiple == True: n_items = "one or more items"
178                instruction += " Please select %s from the list." % n_items
179
180            elif tp == "bool":
181                resp += fm.renderRadioButton(name, is_boolean=True)
182                instruction += " Please select either true or false."
183           
184            elif tp in ("float", "int", "string", "datetime"):
185                if tp == "datetime":
186                    if default:
187                        # Ensure time formatted correctly
188                        default = str(default).replace(" ", "T")
189       
190                    instruction += " Please insert a date/time field in the format <kbd><B>YYYY-MM-DDThh:mm:ss</B></kbd> such as <kbd>2009-01-01T00:00:00</kbd>."
191                else:
192                    instruction += " Please insert a value of type: %s." % tp
193
194                resp += fm.renderTextInput(name, dtype=tp, optional=opt, default=default)
195           
196            elif tp == "filepath":
197                base_dir = input["basedir"] 
198                resp += fm.renderTypeAheadDirList(name, base_dir)
199                instruction += " Please type a file path on the CEDA file system. Click down to auto-fill with one of the options on the drop-down list."
200
201            elif tp == "bbox":
202                extent = input.get("extent", False)
203                resp += fm.renderBBox(name, extent)
204                csv_extent = extent.replace("|", ", ")
205                instruction += " Please select a valid bounding box with the following geographical extent: %s" % csv_extent
206
207            resp += "</td><td>%s</td></tr>\n" % instruction
208     
209        resp += '<tr><td></td><td><input type="submit" value="Submit" /></td><td></td></table>\n</form>\n'
210        return  fm.htmlify(resp)
Note: See TracBrowser for help on using the repository browser.