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

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

Added checker for bbox selection.

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, optional=False, default=None, multiple=False):
36        """
37        Returns HTML for text input including onChange validator.
38        optional is a boolean.
39
40        Populates with default value if not None.
41        If multiple is true then makes box bigger.
42        """
43        if default == None: default = ""
44
45        allowed_dtypes = ("float", "int", "string", "datetime")
46        js_opt = str(optional).lower()
47
48        if dtype not in allowed_dtypes:
49            raise Exception("Invalid type sent to FormRenderer.renderTextInput(): %s" % dtype)
50
51        validators = {"int": ("/^[0-9]+$/", "The %s input must be an integer." % name), 
52                      "float": ("/^[-+]?([0-9]*\.[0-9]+|[0-9]+)$/", "The %s input must be a decimal number." % name),
53                      "string": ("/[0-9a-zA-Z]+/", "The %s input must include text characters." % name),
54                      "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)}
55
56        (regex, msg) = validators[dtype]
57
58        if multiple == True:
59            on_change = "validateTextAreaInput"; 
60        else:
61            on_change = "validateTextInput";
62
63        tag_contents = """name="%s" id="%s" value="%s" onChange="%s(this.value, %s, '%s', %s);" """ % (name, name, default, on_change, regex, msg, js_opt)
64
65        if multiple == True:
66            # Use textarea
67            html = """<textarea cols="50" rows="3" %s ></textarea>""" % tag_contents
68            html += """\n<script type="text/javascript">registerTextArea('%s');</script>""" % name
69
70            validator_type = "textarea"
71        else:
72            # Use text input
73            html = '<input type="text" %s />' % tag_contents
74            validator_type = "text"
75
76        html += """<br />\n<script type="text/javascript">addValidator('%s', '%s', %s, '%s', %s);</script>\n""" % (name, validator_type, regex, msg, js_opt)
77        return html
78
79    def renderSelectList(self, name, values, optional=False, multiple=False):
80        """
81        Returns HTML for select list.
82
83        If optional is True then add an extra option called "-- Please select --".
84        """
85        if optional == True:
86            values.insert(0, "-- Please select --")
87
88        multiple_string = ""
89        if multiple == True:
90            multiple_string = 'multiple="multiple"'
91
92        html = """<select %s name="%s" id="%s">\n""" % (multiple_string, name, name)
93       
94        selected = 'selected="selected"' 
95        for value in values:
96            html += """ <option %s value="%s">%s</option>\n""" % (selected, value, value)
97            selected = ""
98
99        return html
100
101    def OLDrenderBBox(self, name, extent="90|-180|-90|180"):
102        """
103        Renders a bounding box and N/W/S/E/ selectors.
104        """
105        if extent == False: extent = "90|-180|-90|180"
106
107        (n, w, s, e) = extent.split("|")
108
109        html = """      <label for="_north">North:</label> <input type="text" id="_north" name="_north" value="%s" onChange="updateBBox('%s');" /><br>
110        <label for="_west">West:</label> <input type="text" id="_west" name="_west" value="%s" onChange="updateBBox('%s');" /><br>
111        <label for="_south">South:</label> <input type="text" id="_south" name="_south" value="%s" onChange="updateBBox('%s');" /><br>
112        <label for="_east">East:</label> <input type="text" id="_east" name="_east" value="%s" onChange="updateBBox('%s');" /><br>
113        <input type="hidden" id="%s" name="%s" value="%s" />
114        """ % (n, name, w, name, s, name, e, name, name, name, extent)
115
116        return html
117
118
119    def renderBBox(self, name, extent):
120        """
121        Renders a bounding box and N/W/S/E selectors.
122        ``extent`` is received as a string of "north|west|south|east".
123        """
124        if extent == False: extent = "90|-180|-90|180"
125        (n, w, s, e) = extent.split("|")
126
127        html = """    <div id="bounding_container">
128        <div> BBox = <span id="bbox_show_val"></span></div>
129        <div id="bounds_control_container"></div>
130        <div id="map_container">
131            <div id='map'></div>
132        </div>
133            <input type="hidden" name="%s" id="bbox_hidden_input" />
134            <script type="text/javascript">
135                var initial_extent = [%s, %s, %s, %s];
136                addValidator('%s', 'bounding_box', extent, 'Your selected spatial bounding box must overlap with the available extent of: (%s) as ("north|west|south|east").', false);
137            </script>
138        </div>
139        """ % (name, n, w, s, e, name, extent)
140
141        return html     
142
143    def renderTypeAheadDirList(self, name, base_dir):
144        """
145        Renders type-ahead widget for directory listing.
146        """
147        html = """      <script type="text/javascript" src="/js/ext/jquery-1.3.2/jquery-1.3.2.js"></script>
148        <script type="text/javascript" src="/js/ui/type_ahead_dirs.js"></script>
149        <script type="text/javascript">
150                var current_list = false;
151                var abs_pos_%s = null;
152
153                $(document).ready(function(){
154                        initTypeAhead("%s", "type_ahead_for_%s", "%s");
155                        abs_pos_%s = type_ahead_div.offset();   
156                        positionRespDiv(abs_pos_%s);
157                });
158        </script>
159
160        <p>Press down button to fill with text...</p>
161        <div style="z-index: 1;">
162                <input type="text" id="%s" name="%s" value="" style="width: 505px; height: 25px;" onBlur="hideSuggestions();" onFocus="showSuggestions();" />
163        </div>
164        <!--<span id="resp_container">
165<div id="type_ahead_for_%s" style="width: 500px; background-color: yellow; border-style: solid; border-width: 1px; position: relative;"></div>
166        </span>-->
167        <div id="type_ahead_for_%s" style="width: 500px; background-color: yellow; border-style: solid; border-width: 1px; position: statis;"></div>
168""" % (name, name, name, base_dir, name, name, name, name, name, name)
169        return html 
Note: See TracBrowser for help on using the repository browser.