[Cluster-devel] conga/luci site/luci/Extensions/HelperFunction ...

kupcevic at sourceware.org kupcevic at sourceware.org
Fri Oct 6 22:08:17 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	kupcevic at sourceware.org	2006-10-06 22:08:13

Modified files:
	luci/site/luci/Extensions: HelperFunctions.py StorageReport.py 
	luci/storage   : form-macros validate_html 

Log message:
	luci storage: display size in appropriate units (instead of bytes), taking preferred size into account

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/HelperFunctions.py.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/StorageReport.py.diff?cvsroot=cluster&r1=1.9&r2=1.10
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/form-macros.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/validate_html.diff?cvsroot=cluster&r1=1.1&r2=1.2

--- conga/luci/site/luci/Extensions/HelperFunctions.py	2006/10/05 23:21:39	1.3
+++ conga/luci/site/luci/Extensions/HelperFunctions.py	2006/10/06 22:08:13	1.4
@@ -90,3 +90,49 @@
                        expires='Tue, 30 Jun 2060 12:00:00 GMT')
     
     return value
+
+
+
+
+# returns (str(float), units) that fits best,
+# ignores prefered units
+def bytes_to_value_units(bytes):
+    units = 'TB'
+    if float(convert_bytes(bytes, 'GB')) < 1024:
+        units = 'GB'
+    if float(convert_bytes(bytes, 'MB')) < 1024:
+        units = 'MB'
+    if float(convert_bytes(bytes, 'KB')) < 1024:
+        units = 'KB'
+    if float(convert_bytes(bytes, 'bytes')) < 1024:
+        units = 'bytes'
+    return (convert_bytes(bytes, units), units)
+
+# returns (str(float), units) that fits best,
+# takes prefered units into account
+def bytes_to_value_prefunits(self, bytes):
+    p_units = self.REQUEST.SESSION.get('preferred_size_units')
+    dummy, units = bytes_to_value_units(bytes)
+    if get_units_multiplier(units) > get_units_multiplier(p_units):
+        units = p_units
+    return (convert_bytes(bytes, units), units)
+
+def get_units_multiplier(units):
+    if units.lower() == 'bytes':
+        return 1.0
+    elif units.lower() == 'kb':
+        return 1024.0
+    elif units.lower() == 'mb':
+        return 1024*1024.0
+    elif units.lower() == 'gb':
+        return 1024*1024*1024.0
+    elif units.lower() == 'tb':
+        return 1024*1024*1024*1024.0
+    else:
+        raise "invalid size unit"
+
+def convert_bytes(bytes, units):
+    c = int(bytes) / get_units_multiplier(units)
+    c = str(c)
+    c = c[:c.find('.') + 3]
+    return c
--- conga/luci/site/luci/Extensions/StorageReport.py	2006/10/05 23:21:39	1.9
+++ conga/luci/site/luci/Extensions/StorageReport.py	2006/10/06 22:08:13	1.10
@@ -232,7 +232,7 @@
     try:
         rep = get_storage_report(ricci_comm, session)
         if rep == None:
-            raise Exception, 'Unable to communicate to host'
+            raise Exception, 'Unable to communicate with host (either system down or ricci not running on it)'
         else:
             return True
     except Exception, e:
@@ -300,7 +300,7 @@
     if module_r_status != '0':
         #raise Exception, 'error retrieving storage report'
         if module_r_status == '3':
-            raise Exception, 'Unable to find storage module: reinstall it'
+            raise Exception, 'Unable to find storage module on host (reinstall it)'
     resp_r = None
     for node in module_r.childNodes:
         if node.nodeType == xml.dom.Node.ELEMENT_NODE:
@@ -334,9 +334,9 @@
     if succ_v.get_value() != True:
         # error
         if err_code_v.get_value() == -1:
-            raise Exception, 'Generic error:\n\n' + err_desc_v.get_value()
+            raise Exception, 'Generic error on host:\n\n' + err_desc_v.get_value()
         else:
-            raise Exception, err_desc_v.get_value()
+            raise Exception, 'Host responded: ' + err_desc_v.get_value()
     
     #xml_report = fr_r.toxml()
     xml_report = fr_r
@@ -765,17 +765,17 @@
         pass
     
     if props != None:
-        res = check_props(props, request)
+        res = check_props(self, props, request)
         if res[0] == False:
             return res[1] + ' ' + res[2]
     
     if content_props != None:
-        res = check_props(content_props, request)
+        res = check_props(self, content_props, request)
         if res[0] == False:
             return res[1] + ' ' + res[2]
     
     return 'OK'
-def check_props(props, request):
+def check_props(self, props, request):
     valid = True
     var_name = ''
     msg = 'no message - BUG :('
@@ -785,23 +785,43 @@
             prop = props[prop_name]
             req_value = request[prop_name]
             if prop['type'] == 'int':
-                try:
-                    req_value = int(req_value)
-                except:
-                    msg = prop['pretty_name'] + ' is missing an integer value'
-                    var_name = prop_name
-                    valid = False
-                    break
-                min = int(prop['validation']['min'])
-                max = int(prop['validation']['max'])
-                step = int(prop['validation']['step'])
-                r_val = (req_value / step) * step
-                if r_val > max or r_val < min:
-                    msg = prop['pretty_name'] + ' has to be within range ' + str(min) + ' - ' + str(max) + ' ' + prop['units']
-                    var_name = prop_name
-                    valid = False
-                    break
-            
+                if prop['units'] != 'bytes':
+                    try:
+                        req_value = int(req_value)
+                    except:
+                        msg = prop['pretty_name'] + ' is missing an integer value'
+                        var_name = prop_name
+                        valid = False
+                        break
+                    min = int(prop['validation']['min'])
+                    max = int(prop['validation']['max'])
+                    step = int(prop['validation']['step'])
+                    r_val = (req_value / step) * step
+                    if r_val > max or r_val < min:
+                        msg = prop['pretty_name'] + ' has to be within range ' + str(min) + ' - ' + str(max) + ' ' + prop['units']
+                        var_name = prop_name
+                        valid = False
+                        break
+                else:
+                    try:
+                        req_value = float(req_value)
+                    except:
+                        msg = prop['pretty_name'] + ' is missing a float value'
+                        var_name = prop_name
+                        valid = False
+                        break
+                    dummy, units = bytes_to_value_prefunits(self, prop['value'])
+                    min  = float(convert_bytes(prop['validation']['min'], units))
+                    max  = float(convert_bytes(prop['validation']['max'], units))
+                    step = float(convert_bytes(prop['validation']['step'], units))
+                    if step < 0.000001:
+                        step = 0.000001
+                    r_val = (req_value / step) * step
+                    if r_val > max or r_val < min:
+                        msg = prop['pretty_name'] + ' has to be within range ' + str(min) + ' - ' + str(max) + ' ' + units
+                        var_name = prop_name
+                        valid = False
+                        break
             elif prop['type'] == 'text':
                 if len(req_value) < int(prop['validation']['min_length']):
                     msg = prop['pretty_name'] + ' has to have minimum length of ' + prop['validation']['min_length']
@@ -893,9 +913,23 @@
                             var_name = node.getAttribute('name')
                             if var_name in request:
                                 if bd_data['props'][var_name]['type'] == 'int':
-                                    val = int(request[var_name])
-                                    step = int(bd_data['props'][var_name]['validation']['step'])
-                                    val = (val / step) * step
+                                    if bd_data['props'][var_name]['units'] != 'bytes':
+                                        val = int(request[var_name])
+                                        step = int(bd_data['props'][var_name]['validation']['step'])
+                                        val = (val / step) * step
+                                    else:
+                                        dummy, units = bytes_to_value_prefunits(self,
+                                                                                bd_data['props'][var_name]['value'])
+                                        min  = int(bd_data['props'][var_name]['validation']['min'])
+                                        max  = int(bd_data['props'][var_name]['validation']['max'])
+                                        step = int(bd_data['props'][var_name]['validation']['step'])
+                                        val_units = float(request[var_name])
+                                        val = int(val_units * get_units_multiplier(units))
+                                        val = (val / step) * step
+                                        if val < min:
+                                            val = min
+                                        if val > max:
+                                            val = max
                                     node.setAttribute('value', str(val))
                                 else:
                                     node.setAttribute('value', request[var_name])
@@ -925,9 +959,23 @@
                             req_name = 'content_variable_' + selected_content_id + '_' + var_name
                             if req_name in request:
                                 if selected_content_data['props'][req_name]['type'] == 'int':
-                                    val = int(request[req_name])
-                                    step = int(selected_content_data['props'][req_name]['validation']['step'])
-                                    val = (val / step) * step
+                                    if selected_content_data['props'][req_name]['units'] != 'bytes':
+                                        val = int(request[req_name])
+                                        step = int(selected_content_data['props'][req_name]['validation']['step'])
+                                        val = (val / step) * step
+                                    else:
+                                        dummy, units = bytes_to_value_prefunits(self,
+                                                                                selected_content_data['props'][req_name]['value'])
+                                        min  = int(selected_content_data['props'][req_name]['validation']['min'])
+                                        max  = int(selected_content_data['props'][req_name]['validation']['max'])
+                                        step = int(selected_content_data['props'][req_name]['validation']['step'])
+                                        val_units = float(request[req_name])
+                                        val = int(val_units * get_units_multiplier(units))
+                                        val = (val / step) * step
+                                        if val < min:
+                                            val = min
+                                        if val > max:
+                                            val = max
                                     node.setAttribute('value', str(val))
                                 else:
                                     node.setAttribute('value', request[req_name])
@@ -1035,9 +1083,23 @@
                             var_name = node.getAttribute('name')
                             if var_name in request:
                                 if bd_data['props'][var_name]['type'] == 'int':
-                                    val = int(request[var_name])
-                                    step = int(bd_data['props'][var_name]['validation']['step'])
-                                    val = (val / step) * step
+                                    if bd_data['props'][var_name]['units'] != 'bytes':
+                                        val = int(request[var_name])
+                                        step = int(bd_data['props'][var_name]['validation']['step'])
+                                        val = (val / step) * step
+                                    else:
+                                        dummy, units = bytes_to_value_prefunits(self,
+                                                                                bd_data['props'][var_name]['value'])
+                                        min  = int(bd_data['props'][var_name]['validation']['min'])
+                                        max  = int(bd_data['props'][var_name]['validation']['max'])
+                                        step = int(bd_data['props'][var_name]['validation']['step'])
+                                        val_units = float(request[var_name])
+                                        val = int(val_units * get_units_multiplier(units))
+                                        val = (val / step) * step
+                                        if val < min:
+                                            val = min
+                                        if val > max:
+                                            val = max
                                     node.setAttribute('value', str(val))
                                 else:
                                     node.setAttribute('value', request[var_name])
@@ -1068,9 +1130,23 @@
                                 req_name = 'content_variable_' + selected_content_id + '_' + var_name
                                 if req_name in request:
                                     if selected_content_data['props'][req_name]['type'] == 'int':
-                                        val = int(request[req_name])
-                                        step = int(selected_content_data['props'][req_name]['validation']['step'])
-                                        val = (val / step) * step
+                                        if selected_content_data['props'][req_name]['units'] != 'bytes':
+                                            val = int(request[req_name])
+                                            step = int(selected_content_data['props'][req_name]['validation']['step'])
+                                            val = (val / step) * step
+                                        else:
+                                            dummy, units = bytes_to_value_prefunits(self,
+                                                                                    selected_content_data['props'][req_name]['value'])
+                                            min  = int(selected_content_data['props'][req_name]['validation']['min'])
+                                            max  = int(selected_content_data['props'][req_name]['validation']['max'])
+                                            step = int(selected_content_data['props'][req_name]['validation']['step'])
+                                            val_units = float(request[req_name])
+                                            val = int(val_units * get_units_multiplier(units))
+                                            val = (val / step) * step
+                                            if val < min:
+                                                val = min
+                                            if val > max:
+                                                val = max
                                         node.setAttribute('value', str(val))
                                     else:
                                         node.setAttribute('value', request[req_name])
@@ -1200,9 +1276,23 @@
                             var_name = node.getAttribute('name')
                             if var_name in request:
                                 if mapper_data['props'][var_name]['type'] == 'int':
-                                    val = int(request[var_name])
-                                    step = int(mapper_data['props'][var_name]['validation']['step'])
-                                    val = (val / step) * step
+                                    if mapper_data['props'][var_name]['units'] != 'bytes':
+                                        val = int(request[var_name])
+                                        step = int(mapper_data['props'][var_name]['validation']['step'])
+                                        val = (val / step) * step
+                                    else:
+                                        dummy, units = bytes_to_value_prefunits(self,
+                                                                                mapper_data['props'][var_name]['value'])
+                                        min  = int(mapper_data['props'][var_name]['validation']['min'])
+                                        max  = int(mapper_data['props'][var_name]['validation']['max'])
+                                        step = int(mapper_data['props'][var_name]['validation']['step'])
+                                        val_units = float(request[var_name])
+                                        val = int(val_units * get_units_multiplier(units))
+                                        val = (val / step) * step
+                                        if val < min:
+                                            val = min
+                                        if val > max:
+                                            val = max
                                     node.setAttribute('value', str(val))
                                 else:
                                     node.setAttribute('value', request[var_name])
@@ -1288,9 +1378,23 @@
                             var_name = node.getAttribute('name')
                             if request.has_key(var_name):
                                 if mapper_data['props'][var_name]['type'] == 'int':
-                                    val = int(request[var_name])
-                                    step = int(mapper_data['props'][var_name]['validation']['step'])
-                                    val = (val / step) * step
+                                    if mapper_data['props'][var_name]['units'] != 'bytes':
+                                        val = int(request[var_name])
+                                        step = int(mapper_data['props'][var_name]['validation']['step'])
+                                        val = (val / step) * step
+                                    else:
+                                        dummy, units = bytes_to_value_prefunits(self,
+                                                                                mapper_data['props'][var_name]['value'])
+                                        min  = int(mapper_data['props'][var_name]['validation']['min'])
+                                        max  = int(mapper_data['props'][var_name]['validation']['max'])
+                                        step = int(mapper_data['props'][var_name]['validation']['step'])
+                                        val_units = float(request[var_name])
+                                        val = int(val_units * get_units_multiplier(units))
+                                        val = (val / step) * step
+                                        if val < min:
+                                            val = min
+                                        if val > max:
+                                            val = max
                                     node.setAttribute('value', str(val))
                                 else:
                                     node.setAttribute('value', request[var_name])
@@ -1422,7 +1526,8 @@
     type = bd_xml.getAttribute('mapper_type')
     pretty_name = path.replace('/dev/','')
     pretty_type = 'Block Device'
-    description = props['size']['value'] + ' ' + props['size']['units']
+    size_in_units, units = bytes_to_value_units(props['size']['value'])
+    description = str(size_in_units) + ' ' + units
     icon_name = ''
     color = 'black'
     if type == MAPPER_SYS_TYPE:
@@ -1553,10 +1658,6 @@
             min  = var.getAttribute('min')
             max  = var.getAttribute('max')
             step = var.getAttribute('step')
-            if d_units == 'bytes':
-                # modify units
-                
-                pass
             validation_data['min']  = str(min)
             validation_data['max']  = str(max)
             validation_data['step'] = str(step)
--- conga/luci/storage/form-macros	2006/10/05 23:21:40	1.5
+++ conga/luci/storage/form-macros	2006/10/06 22:08:13	1.6
@@ -189,10 +189,16 @@
        </td>
        <td>
         <select name="preferred_size_units" onchange="this.form.submit()">
+         <option value="bytes" 
+                 tal:attributes="selected python:preferred_size_units == 'bytes'">Bytes</option>
+         <option value="KB" 
+                 tal:attributes="selected python:preferred_size_units == 'KB'">KB - KiloBytes</option>
          <option value="MB" 
                  tal:attributes="selected python:preferred_size_units == 'MB'">MB - MegaBytes</option>
          <option value="GB" 
                  tal:attributes="selected python:preferred_size_units == 'GB'">GB - GigaBytes</option>
+         <option value="TB" 
+                 tal:attributes="selected python:preferred_size_units == 'TB'">TB - TeraBytes</option>
         </select>
        </td>
       </tr>
@@ -201,7 +207,9 @@
         Display Devices by
        </td>
        <td>
-        <select name="preferred_path_display" onchange="this.form.submit()">
+        <select name="preferred_path_display"
+                onchange="this.form.submit()"
+                style="width: 100%;">
          <option value="path" 
                  tal:attributes="selected python:preferred_path_display == 'path'">Device Path</option>
          <option value="scsi" 
@@ -629,7 +637,8 @@
                    prefix                  python:'create_mapper_template_' + mapper['mapper_type'] + '_'; 
                    properties_span_id      string:; 
                    mapper_template_form_id python:prefix + 'mapper_template_form_id'; 
-                   create_mapper_button_id python:prefix + 'mapper_template_apply_button_id'">
+                   create_mapper_button_id python:prefix + 'mapper_template_apply_button_id';
+                   form_submit_button_id   create_mapper_button_id">
    <div metal:use-macro="here/form-macros/macros/forms-css"/>
    <div metal:use-macro="here/form-macros/macros/form-scripts"/>
    <form tal:attributes="id      mapper_template_form_id; 
@@ -702,8 +711,11 @@
               <input tal:attributes="type string:checkbox; 
                                      name python:'source_bd_' + bd['path']"/>
              </td>
-             <td>
-              <span tal:replace="bd/path"/> (<span tal:replace="bd/props/size/value"/> <span tal:replace="bd/props/size/units"/> - <span tal:replace="bd/pretty_type"/>)
+             <td tal:define="bytes  bd/props/size/value;
+                             dummy  python:here.bytes_to_value_units(bytes);
+                             size   python:dummy[0];
+                             units  python:dummy[1]">
+              <span tal:replace="bd/path"/> (<span tal:replace="size"/> <span tal:replace="units"/> - <span tal:replace="bd/pretty_type"/>)
              </td>
             </tr>
            </span>
@@ -792,8 +804,16 @@
              </span>
             </select>
            </span>
-           <span tal:condition="not: prop/replacements|nothing"
-                 tal:replace="prop/value"/>
+           <span tal:omit-tag=""
+                 tal:condition="not: prop/replacements|nothing">
+            <span tal:condition="python: prop_units == 'bytes'">
+             <span tal:define="dummy python: here.bytes_to_value_units(prop['value']);
+                               value python: str(dummy[0]) + ' ' + str(dummy[1])"
+                   tal:replace="value"/>
+            </span>
+            <span tal:condition="python: prop_units != 'bytes'"
+                  tal:replace="prop/value"/>
+           </span>
           </span>
 
 
@@ -803,16 +823,32 @@
                                  type        string:text; 
                                  value       prop/value;
                                  onkeypress  python:'return validate_text_keypress(this, event, 2, \'' + prop['validation']['illegal_chars'] + '\', ' + str(prop['validation']['max_length']) + ')';
-                                 onblur      python:'validate_text(this, 2, \'' + prop['validation']['illegal_chars'] + '\', \'' + prop['validation']['reserved_words'] + '\', ' + str(prop['validation']['min_length']) + ', ' + str(prop['validation']['max_length']) + ')'"/>
+                                 onblur      python:'validate_text(this, 2, \'' + prop['validation']['illegal_chars'] + '\', \'' + prop['validation']['reserved_words'] + '\', ' + str(prop['validation']['min_length']) + ', ' + str(prop['validation']['max_length']) + ', \'' + form_submit_button_id + '\')'"/>
           
           
           
-          <input tal:condition="python:prop_type == 'int'"
+          <input tal:condition="python:prop_type == 'int' and prop_units != 'bytes'"
                  tal:attributes="name   p; 
                                  type   string:text; 
                                  value  prop/value;
-                                 onblur python:'validate_int(this, 2, ' + str(prop['validation']['min']) + ', ' + str(prop['validation']['max']) + ', ' + str(prop['validation']['step']) + ')'"
+                                 onblur python:'validate_int(this, 2, ' + str(prop['validation']['min']) + ', ' + str(prop['validation']['max']) + ', ' + str(prop['validation']['step']) + ', \'' + prop_units + '\', \'' + form_submit_button_id + '\')'"
                  onkeypress="return validate_int_keypress(this, event, 2)"/>
+          <span tal:condition="python:prop_type == 'int' and prop_units == 'bytes'">
+           <span tal:define="bytes  prop/value;
+                             dummy  python:here.bytes_to_value_prefunits(bytes);
+                             value  python:dummy[0];
+                             units  python:dummy[1];
+                             minim  python:here.convert_bytes(prop['validation']['min'], units);
+                             maxim  python:here.convert_bytes(prop['validation']['max'], units);
+                             step   python:here.convert_bytes(prop['validation']['step'], units)">
+            <input tal:attributes="name   p; 
+                                   type   string:text; 
+                                   value  value;
+                                   onblur python:'validate_float(this, 2, ' + str(minim) + ', ' + str(maxim) + ', ' + str(step) + ', \'' + units + '\', \'' + form_submit_button_id + '\')'"
+                   onkeypress="return validate_float_keypress(this, event, 2)"/>
+            <span tal:replace="units"/>
+           </span>
+          </span>
           
           
           
@@ -820,14 +856,23 @@
            <select tal:define="prop_options prop/value"
                    tal:attributes="name p">
             <span tal:omit-tag="" 
+                  tal:condition="python: prop_units != 'bytes'"
                   tal:repeat="prop_opt prop_options">
              <option tal:attributes="value prop_opt"/><span tal:replace="prop_opt"/>
             </span>
+            <span tal:omit-tag="" 
+                  tal:condition="python: prop_units == 'bytes'"
+                  tal:repeat="prop_opt prop_options">
+             <option tal:attributes="value prop_opt"/><span tal:define="dummy python: here.bytes_to_value_units(prop_opt);
+                                                                        value python: str(dummy[0]) + ' ' + str(dummy[1])"
+                                                            tal:replace="value"/>
+            </span>
            </select>
           </span>
          </td>
          <td>
-          <span tal:replace="prop_units"/>
+          <span tal:condition="python: prop_units != 'bytes'"
+                tal:replace="prop_units"/>
          </td>
         </tr>
        </table>
@@ -912,13 +957,15 @@
 
 // validations
 
-function validate_text(elem, timeout, illegal_chars, reserved_words, min_length, max_length)
+function validate_text(elem, timeout, illegal_chars, reserved_words, min_length, max_length, button_id)
 {
+   document.getElementById(button_id).disabled = true;
+   
    var value = elem.value;
    
    for (var i=0; i<value.length; i++) {
       if (illegal_chars.indexOf(value[i]) != -1) {
-         return;
+         //return;
          elem.className = 'validation_error';
          display_warning(elem, timeout, 'Illegal characters are: \'' + illegal_chars + '\'');
          return;
@@ -928,7 +975,7 @@
    var res_list = reserved_words.split(';');
    for (var i=0; i<res_list.length; i++) {
       if (value == res_list[i] && value != '') {
-         return;
+         //return;
          elem.className = 'validation_error';
          display_warning(elem, timeout, 'Reserved words are: ' + res_list);
          return;
@@ -936,55 +983,103 @@
    }
    
    if (value.length < min_length) {
-      return;
+      //return;
       elem.className = 'validation_error';
       display_warning(elem, timeout, 'Minimum length is ' + min_length);
       return;
    }
    
    if (value.length > max_length) {
-      return;
+      //return;
       elem.className = 'validation_error';
       display_warning(elem, timeout, 'Maximum length is ' + max_length);
       return;
    }
    
    elem.className = '';
+   document.getElementById(button_id).disabled = false;
 }
 
 
-function validate_int(elem, timeout, min, max, step)
+function validate_int(elem, timeout, min, max, step, units, button_id)
 {
-   var value = elem.value;
+   document.getElementById(button_id).disabled = true;
    
+   var value = elem.value;
    for (var i=0; i<value.length; i++) {
       if ('0123456789'.indexOf(value[i]) == -1) {
-         return;
+         //return;
          elem.className = 'validation_error';
          display_warning(elem, timeout, 'Only whole numbers are allowed');
          return;
       }
    }
    
-   value = ((value - 0) / step) * step;
+   min  = parseInt(min);
+   max  = parseInt(max);
+   step = parseInt(step);
+   if (step == 0)
+      step = 1;
+   value = parseInt(value);
+   value = (value / step) * step;
    
    if (value < min) {
-      return;
+      //return;
       elem.className = 'validation_error';
-      display_warning(elem, timeout, 'Minimum allowed value is ' + min);
+      display_warning(elem, timeout, 'Minimum allowed value is ' + min + ' ' + units);
       return;
    }
    
    if (value > max) {
-      return;
+      //return;
       elem.className = 'validation_error';
-      display_warning(elem, timeout, 'Maximum allowed value is ' + max);
+      display_warning(elem, timeout, 'Maximum allowed value is ' + max + ' ' + units);
       return;
    }
    
    elem.className = '';
+   document.getElementById(button_id).disabled = false;
 }
 
+function validate_float(elem, timeout, min, max, step, units, button_id)
+{
+   document.getElementById(button_id).disabled = true;
+   
+   var value = elem.value;
+   for (var i=0; i<value.length; i++) {
+      if ('0123456789.'.indexOf(value[i]) == -1) {
+         //return;
+         elem.className = 'validation_error';
+         display_warning(elem, timeout, 'Only whole digits and dot are allowed');
+         return;
+      }
+   }
+   
+   min  = parseFloat(min);
+   max  = parseFloat(max);
+   step = parseFloat(step);
+   if (step == 0.0)
+      step = 0.00001;
+   value = parseFloat(value);
+   value = (value / step) * step;
+   
+   if (value < min) {
+      //return;
+      elem.className = 'validation_error';
+      display_warning(elem, timeout, 'Minimum allowed value is ' + min + ' ' + units);
+      return;
+   }
+   
+   if (value > max) {
+      //return;
+      elem.className = 'validation_error';
+      display_warning(elem, timeout, 'Maximum allowed value is ' + max + ' ' + units);
+      return;
+   }
+   
+   elem.className = '';
+   document.getElementById(button_id).disabled = false;
+}
 
 
 function validate_text_keypress(elem, event, timeout, illegal_chars, max_length)
@@ -1034,6 +1129,38 @@
    return true;
 }
 
+function validate_float_keypress(elem, event, timeout)
+{
+   var ev = event;
+   if (!ev) ev = window.event;
+   var key = get_keycode(ev);
+   
+   if (key == 8 || key == 9) return true;
+   else if (ev.which) ;
+   else if (document.selection) ;
+   else return true;
+   
+   var ch = String.fromCharCode(key);
+   
+   if ('0123456789.'.indexOf(ch) == -1) {
+//      display_warning(elem, timeout, 'Only digits and dot are allowed');
+      return false;
+   }
+   
+   if (ch == '.') {
+      txt = elem.value;
+      c = 0;
+      for (i=0; i<txt.length; i++) {
+         if (txt[i] == '.')
+            c++;
+      }
+      if (c != 0)
+         return false;
+   }
+   
+   return true;
+}
+
 function get_keycode(ev)
 {
     if (ev.keyCode)
@@ -1093,8 +1220,10 @@
 function reset_form(form) {
    if (confirm('Do you really want to reset the form?')) {
       form.reset();
-      for (i=0; i<form.length; i++)
-          form.elements[i].className = '';
+      for (i=0; i<form.length; i++) {
+         form.elements[i].className = '';
+         form.elements[i].disabled  = false;
+      }
       return true;
    }
    return false;
@@ -1237,6 +1366,7 @@
                      bd_form_id                 python:prefix + 'bd_form';
                      select_content_id          python:prefix + 'select_content_id';
                      apply_button_id            python:prefix + 'apply_button_id';
+                     form_submit_button_id      apply_button_id;
                      content_span_id            python:prefix + 'content_span_id'">
     <form tal:attributes="id      bd_form_id;
                           method  string:get">
@@ -1460,7 +1590,8 @@
    <form tal:define="prefix                     prefix|mapper/mapper_id;
                      prefix                     python:prefix + '_';
                      mapper_form_id             python:prefix + 'mapper_form_id';
-                     apply_button_id            python:prefix + 'apply_button_id'"
+                     apply_button_id            python:prefix + 'apply_button_id';
+                     form_submit_button_id      apply_button_id"
          tal:attributes="id     mapper_form_id;
                          method string:get">
     <input tal:attributes="type  string:hidden; 
--- conga/luci/storage/validate_html	2006/06/30 17:00:02	1.1
+++ conga/luci/storage/validate_html	2006/10/06 22:08:13	1.2
@@ -12,6 +12,9 @@
 <span tal:omit-tag="" 
       tal:define="global action_type request/action_type|nothing"/>
 
+<span tal:omit-tag=""
+      tal:define="global preferred_size_units python:here.set_persistant_var('preferred_size_units', 'GB')"/>
+
 
 <span tal:omit-tag=""
       tal:condition="not: access_to_host_allowed">




More information about the Cluster-devel mailing list