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

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

adding more good stuff for the midas extraction bits.

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