Ignore:
Timestamp:
25/06/10 14:29:20 (10 years ago)
Author:
astephen
Message:

fixing up jobs page and moving renderer code into renderer package

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cows_wps/trunk/cows_wps/lib/ui/proc_config.py

    r7008 r7095  
    22import copy 
    33 
    4 from cows_wps.utils.create_process_config import createProcessConfig 
     4#from cows_wps.utils.create_process_config import createProcessConfig 
    55 
    66from cows_wps.lib.ui.proc_config_convertor import ProcConfigConvertor  
    77from cows_wps.utils.parse_capabilities_config import caps_config_dict 
    88 
    9 from cows_wps.renderer.form_renderer import FormRenderer 
     9#from cows_wps.renderer.form_renderer import FormRenderer 
    1010 
    1111log = logging.getLogger(__name__) 
     
    2424    def getProcList(self): 
    2525        proc_dict = {} 
    26         log.warn("%s"%caps_config_dict.keys()) 
     26        log.warn("%s" % caps_config_dict.keys()) 
    2727 
    2828        for proc_id in caps_config_dict["Identifiers"]: 
     
    3232        return proc_dict 
    3333 
    34     def renderProcConfig(self, proc): 
    35         pcc = ProcConfigConvertor() 
    36         proc_config = pcc.convertConfig(proc) 
    37         return self.renderProcessPage(proc_config) 
    38  
    39     def renderProcessPage(self, pc): 
    40         """ 
    41         Takes a dictionary representing the process config. 
    42         Returns a list of HTML components. 
    43         """ 
    44         resp = ["<div>"] 
    45  
    46         resp.extend( self.renderBlock("Process Information", pc["Process Information"]) ) 
    47  
    48         resp.extend( self.renderInputs(pc["Inputs"]) ) 
    49  
    50         resp.extend( self.renderBlock("Process Outputs", pc["Outputs"]) )  
    51         resp.append( "</div>\n" ) 
    52         return resp 
    53  
    54     def renderBlock(self, id, items): 
    55  
    56         resp = ["<div>"] 
    57         resp.append( "<H3>%s</H3>\n" % id ) 
    58  
    59         for k, v in items: 
    60                  
    61             resp.append( '<div style="width:200px;"><b>%s:</b></div><div style="position: relative; left:210px; top: -20px;">%s</div>\n' % (k, v) ) 
    62  
    63         resp.append("</div>\n") 
    64         return resp  
    65  
    66     def renderInputs(self, items): 
    67         resp = ["<div>\n<H3>Process Inputs</H3>"] 
    68         resp.append( '<table border="1" style="position: relative; left: 30px;">\n' ) 
    69  
    70         keys = ["Parameter name", "type", "item_type", "allowed_length", "possible_values"] 
    71         skeys = ["Parameter name", "Data type", "Is array?", "Permitted lengths", "Allowed values"] 
    72  
    73         resp.append("<tr>\n") 
    74         for (i, key) in enumerate(keys): 
    75             resp.append( '<td style="background:#FF9900"><b>%s</b></td>\n' % skeys[i] )  
    76  
    77         for (param_name, dct) in items:  
    78  
    79             resp.append( '<tr>\n<td style="background:#FFFFFF">%s</td>\n' % param_name ) 
    80  
    81             for key in keys[1:]: 
    82                  
    83                 value = dct[key] 
    84                 if key == "possible_values" and value != None: 
    85                     value = ", ".join(value) 
    86  
    87                 if value != None:  
    88                     resp.append( '<td style="background:#00FF00;">%s</td>\n' % value )  
    89                 else: 
    90                     resp.append( '<td style="background:red;">-</td>\n' ) 
    91  
    92             resp.append("</tr>\n") 
    93  
    94         resp.append("</table>\n") 
    95         resp.append("</div>\n") 
    96         return resp 
    97  
    98     def renderProcsViewTable(self): 
    99         """ 
    100         Renders the table of all procs on the view page. 
    101         """ 
    102         resp = """<table border="1">\n<tr>""" 
    103         headings = ("Process name", "Short description", "Full description", "Comments",  
    104                     "Options") 
    105         for heading in headings: 
    106             resp += """<td width="17%%" style="background:#FF9900"><b>%s</b></td>\n""" % heading   
    107         resp += "</tr>\n" 
    108  
    109         procs = self.getProcList() 
    110         for (proc, long_name) in procs.items(): 
    111             # Get config dict for this proc 
    112             proc_dict = createProcessConfig(proc)["Capabilities"]["globals"] 
    113  
    114             required_items = ("Title", "Abstract", "ProcessDescription")      
    115             resp += """<tr>\n<td style="background: #FFFFFF;">%s</td>\n""" % proc  
    116  
    117             for req_item in required_items: 
    118                 resp += """<td style="background: #FFFFFF;">%s</td>\n""" % proc_dict[req_item] 
    119  
    120             # Now add link to details and submit pages 
    121             resp += """<td style="background: #FFFFFF;"><a href="/submit/form?proc_id=%s">Submit job</a><br /> 
    122                            <a href="/view/proc?proc_id=%s">View full details</a></td>\n""" % (proc, proc) 
    123  
    124             resp += "</tr>\n" 
    125  
    126         resp += "</table>\n"  
    127         return resp 
    128  
    129     def renderProcSubmissionForm(self, proc, args): 
    130         """         
    131         Renders a submission form for a proc. 
    132         Populates items with args dictionary if they exist. 
    133         """ 
    134         pcc = ProcConfigConvertor() 
    135         proc_config = pcc.convertConfig(proc) 
    136         inputs = proc_config["Inputs"] 
    137  
    138         # Get form renderer 
    139         fm = FormRenderer() 
    140  
    141         resp = """Please complete the form below to submit a request to the CEDA Web Processing Service. 
    142                 Note that some processes are restricted to registered users only. 
    143                 Click the 'Submit' button to submit your request.<br><br>""" 
    144  
    145         resp += """\n\n <form action="/submit" onSubmit="return validateInputs();"> 
    146                 <input type="hidden" name="proc_id" id="proc_id" value="%s" /> 
    147                 <input type="hidden" id="_textarea_ids" name="_textarea_ids" value="" /> 
    148                 <table border="0">\n""" % proc 
    149  
    150         # Now render the inputs dict as a form 
    151         count = 0  
    152         for (name, input) in inputs: 
    153  
    154             # Set colour style for row 
    155             count += 1 
    156             row_style = ("even_row", "odd_row")[count % 2] 
    157  
    158             # Start HTML for row 
    159             resp += """<tr class="%s"><td width="25%%"><b>%s</b></td><td width="30%%">\n""" % (row_style, name) 
    160  
    161             # Parse arguments from config 
    162             al = input["allowed_length"] 
    163             pv = input["possible_values"] 
    164             default = input.get("default", None) 
    165             opt = input.get("optional", False) 
    166             array_or_item = input["item_type"] 
    167  
    168             multiple = False 
    169             if array_or_item == "list": 
    170                 multiple = True 
    171  
    172             tp = input["type"] 
    173  
    174             # Add a default instruction for this input type 
    175             instruction = "" 
    176             if opt == True: 
    177                 instruction = "This input is optional." 
    178             if multiple == True: 
    179                 instruction += " Multiple inputs are allowed." 
    180  
    181             # Now render them according to data type etc 
    182             if pv != None: 
    183                 resp += fm.renderSelectList(name, values=pv, optional=opt, multiple=multiple) 
    184                 n_items = "an item" 
    185                 if multiple == True: n_items = "one or more items" 
    186                 instruction += " Please select %s from the list." % n_items 
    187  
    188             elif tp == "bool": 
    189                 resp += fm.renderRadioButton(name, is_boolean=True) 
    190                 instruction += " Please select either true or false." 
    191              
    192             elif tp in ("float", "int", "string", "datetime"): 
    193                 if tp == "datetime": 
    194                     if args.has_key(name): 
    195                         # Use input arg sent in to form if received 
    196                         default = args[name] 
    197                     elif default: 
    198                         # Ensure time formatted correctly 
    199                         default = str(default).replace(" ", "T") 
    200          
    201                     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>." 
    202                 else: 
    203                     # Use CGI arg if received 
    204                     if args.has_key(name): 
    205                         default = args[name] 
    206  
    207                     instruction += " Please insert a value of type: %s." % tp 
    208  
    209                 resp += fm.renderTextInput(name, dtype = tp, optional = opt, default = default, multiple = multiple) 
    210             
    211             elif tp == "filepath": 
    212                 base_dir = input["basedir"]  
    213                 resp += fm.renderTypeAheadDirList(name, base_dir) 
    214                 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." 
    215  
    216             elif tp == "bbox": 
    217                 self.bbox_arg_found = True 
    218                 extent = input.get("extent", False) 
    219                 resp += fm.renderBBox(name, extent) 
    220                 csv_extent = extent.replace("|", ", ") 
    221                 instruction += " Please select a valid bounding box with the following geographical extent: %s" % csv_extent  
    222  
    223             resp += "</td><td>%s</td></tr>\n" % instruction 
    224       
    225         count += 1 
    226         row_style = ("even_row", "odd_row")[count % 2]  
    227         resp += '<tr class="%s"><td></td><td colspan="2"><input type="submit" value="Submit" /> Click this button when you are happy with your selections.</td></table>\n</form>\n' % row_style 
    228         return  fm.htmlify(resp) 
Note: See TracChangeset for help on using the changeset viewer.