source: cows_wps/trunk/cows_wps/renderer/form_renderer.py @ 6111

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cows_wps/trunk/cows_wps/renderer/form_renderer.py@6111
Revision 6111, 4.7 KB checked in by astephen, 10 years ago (diff)

added date time validator and data type.

Line 
1import os
2
3from genshi.template import TemplateLoader
4from genshi.builder import * 
5from genshi import HTML
6
7
8class FormRenderer(object):
9    """
10    A set of rendering methods for HTML forms.
11    """
12
13    def __init__(self):
14        # Instantiate Genshi template loader
15        self.templateLoader = TemplateLoader(
16           os.path.join(os.getcwd(), 'cows_wps/templates'),
17           auto_reload=True)
18
19    def htmlify(self, html): return HTML(html)
20
21    def renderRadioButton(self, name, is_boolean=True, values=None):
22        """
23        Returns HTML of radio button.
24        """
25        if is_boolean == True:
26            values = ("true", "false")
27
28        html = ""
29        for value in values:
30            html += """         <input type="radio" id="%s" name="%s" value="%s" />
31                <label for="%s">%s</label><br />\n"""   
32
33        return html
34
35    def renderTextInput(self, name, dtype):
36        """
37        Returns HTML for text input including onChange validator.
38        """
39        allowed_dtypes = ("float", "int", "string", "datetime")
40
41        if dtype not in allowed_dtypes:
42            raise Exception("Invalid type sent to FormRenderer.renderTextInput(): %s" % dtype)
43
44        validators = {"int": ("/^[0-9]+$/", "The %s input must be an integer." % name), 
45                      "float": ("/^[-+]?([0-9]*\.[0-9]+|[0-9]+)$/", "The %s input must be a decimal number." % name),
46                      "string": ("/[0-9a-zA-Z]+/", "The %s input must include text characters." % name),
47                      "datetime": ("/[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}/", "The %s input must be a date/time entry as follows YYYY-MM-DDThh:mm:ss (e.g. 2009-01-01T12:00:00)." % name)}
48
49        (regex, msg) = validators[dtype]
50 
51        html = """<input type="text" name="%s" id="%s" value="" onChange="validateTextInput(this.value, %s, '%s');" /><br />\n""" % (name, name, regex, msg)
52        html += """<script type="text/javascript">addValidator('%s', 'text', %s, '%s');</script>\n""" % (name, regex, msg)
53        return html
54
55    def renderSelectList(self, name, values):
56        """
57        Returns HTML for select list.
58        """
59        html = """<select name="%s" id="%s">\n""" % (name, name)
60       
61        for value in values:
62            html += """ <option value="%s">%s</option>\n""" % (value, value)
63
64        return html
65
66    def renderBBox(self, name, extent):
67        """
68        Renders a bounding box and N/W/S/E selectors.
69        """
70        html = """      <script type="text/javascript" src="/js/ext/jquery-1.3.2/jquery-1.3.2.js"></script>
71        <script type="text/javascript" src="http://openlayers.org/api/OpenLayers.js"></script>
72        <script type="text/javascript" src="/js/ui/openlayers-x.js"></script>
73        <script type="text/javascript" src="/js/ui/boundingBoxMapSelect.js"></script>
74        <script type="text/javascript">
75                var layers = new Array();
76                var layer_data = false;
77                var bboxSelect = false;
78
79                $(document).ready(function() {
80                        var layer_data = new OpenLayers.Layer.WMS( "World Map", "http://labs.metacarta.com/wms-c/Basic.py?", {layers: 'basic', format: 'image/png' } );
81                        layers.push(layer_data);
82                        var bboxSelect = new BoundingBoxMapSelect('map', 'bounds_control_container', layers,  'bbox_hidden_input', null);
83                });
84        </script>
85
86        <div id="bounding_container">
87                <div id="bounds_control_container"></div>       
88                <div id="map_container">
89                        <div id='map'></div>
90                </div>
91                <input type="hidden" name="bbox" id="bbox_hidden_input" value="" />
92        </div>
93        """
94        return html     
95
96    def renderTypeAheadDirList(self, name, base_dir):
97        """
98        Renders type-ahead widget for directory listing.
99        """
100        html = """      <script type="text/javascript" src="/js/ext/jquery-1.3.2/jquery-1.3.2.js"></script>
101        <script type="text/javascript" src="/js/ui/type_ahead_dirs.js"></script>
102        <script type="text/javascript">
103                var current_list = false;
104                var abs_pos_%s = null;
105
106                $(document).ready(function(){
107                        initTypeAhead("%s", "type_ahead_for_%s", "%s");
108                        abs_pos_%s = type_ahead_div.offset();   
109                        positionRespDiv(abs_pos_%s);
110                });
111        </script>
112
113        <p>Press down button to fill with text...</p>
114        <div style="z-index: 1;">
115                <input type="text" id="%s" name="%s" value="" style="width: 505px; height: 25px;" onBlur="hideSuggestions();" onFocus="showSuggestions();" />
116        </div>
117        <!--<span id="resp_container">
118<div id="type_ahead_for_%s" style="width: 500px; background-color: yellow; border-style: solid; border-width: 1px; position: relative;"></div>
119        </span>-->
120        <div id="type_ahead_for_%s" style="width: 500px; background-color: yellow; border-style: solid; border-width: 1px; position: statis;"></div>
121""" % (name, name, name, base_dir, name, name, name, name, name, name)
122        return html 
Note: See TracBrowser for help on using the repository browser.