=== modified file 'addons/openerp/static/javascript/form.js'
--- addons/openerp/static/javascript/form.js 2012-10-15 13:19:24 +0000
+++ addons/openerp/static/javascript/form.js 2013-01-29 07:07:22 +0000
@@ -178,6 +178,67 @@
return result;
}
+function validate_digits(form){
+ if (typeof form == 'string') {
+ form = jQuery('#' + form).get(0);
+ }
+
+ if (!form) {
+ return true;
+ }
+
+ var elements = MochiKit.Base.filter(function(el){
+ return !el.disabled && el.id && el.name && el.id.indexOf('_terp_listfields/') == -1 && hasElementClass(el, 'digitsfield');
+ }, form.elements);
+
+ var result = true;
+ var nan_pattern = /[^0-9]/g;
+
+ for (var i = 0; i < elements.length; i++) {
+ var elem = elements[i];
+ var elem2 = elem;
+ var value = elem.value;
+ var kind = jQuery(elem).attr('kind');
+ var digits = jQuery(elem).attr('digits');
+ var set_class = false;
+
+ if(kind == 'float') {
+ // extract sign and number from input value
+ var sign = value[0] == '-' ? '-' : '';
+ var integer_part = value.substring(sign.length), decimal_part = '';
+
+ elem2 = openobject.dom.get(elem.name + '_set') || elem;
+ if(typeof(digits) == "string"){
+ digits = eval(digits)
+ }
+
+ // split float integer and decimal parts on last non decimal char
+ var decimal_sep_position = integer_part.replace(nan_pattern, '.').lastIndexOf('.');
+ if (decimal_sep_position !== -1) {
+ decimal_part = integer_part.substring(decimal_sep_position+1);
+ integer_part = integer_part.substring(0, decimal_sep_position);
+ }
+ if(value.length > digits[0] || decimal_part.length > digits[1])
+ set_class = true;
+
+ }
+
+ if (set_class) {
+ jQuery(elem2).addClass('errorfield');
+ result = false;
+ }
+ else
+ if (jQuery(elem2).hasClass('errorfield')) {
+ jQuery(elem2).removeClass('errorfield');
+ }
+ }
+
+ if (!result) {
+ error_display(_("Invalid form, correct red fields, enter value of float and integer field in range"));
+ }
+ return result;
+}
+
function error_display(msg) {
var error = jQuery("
",{'width': '100%', 'height': '100%'}
).append(
@@ -228,7 +289,7 @@
action = get_form_action(action, args);
var $form = jQuery('#view_form');
- if (/\/save(\?|\/)?/.test(action) && !validate_required($form[0])) {
+ if (/\/save(\?|\/)?/.test(action) && (!validate_required($form[0]) || !validate_digits($form[0]))) {
return;
}
@@ -423,6 +484,11 @@
attrs['required'] = 1;
}
+ if(extended && kind=='float') {
+ var digits = $this.attr('digits');
+ attrs['digit'] = typeof(digits) == "undefined" ? '' : digits;
+ }
+
switch (kind) {
case "picture":
name = this.id;
@@ -806,7 +872,9 @@
if (fld) {
fld.focus();
fld.select();
+ jQuery(fld).addClass('errorfield');
}
+ return error_display(obj.error);
}
if (obj.error) {
=== modified file 'addons/openerp/static/javascript/wizard.js'
--- addons/openerp/static/javascript/wizard.js 2011-01-17 11:57:11 +0000
+++ addons/openerp/static/javascript/wizard.js 2013-01-29 07:07:22 +0000
@@ -38,7 +38,7 @@
act = '/openerp/wizard/report';
}
- if (state != 'end' && !validate_required(form)) {
+ if (state != 'end' && (!validate_required($form[0]) || !validate_digits($form[0]))) {
return;
}
=== modified file 'addons/openerp/utils/utils.py'
--- addons/openerp/utils/utils.py 2012-05-25 16:46:25 +0000
+++ addons/openerp/utils/utils.py 2013-01-29 07:07:22 +0000
@@ -343,7 +343,7 @@
v = _VALIDATORS.get(kind, openobject.validators.DefaultValidator)()
if kind == "float" and attrs.get("digit"):
- v = validators.Float(digit=attrs.get("digit"))
+ v = validators.Float(digits=attrs.get("digit"))
v.not_empty = (required or False) and True
try:
=== modified file 'addons/openerp/validators.py'
--- addons/openerp/validators.py 2012-07-30 08:07:39 +0000
+++ addons/openerp/validators.py 2013-01-29 07:07:22 +0000
@@ -70,14 +70,41 @@
class Int(formencode.validators.Int):
if_empty = False
-class Float(formencode.validators.Number):
+class Float(BaseValidator):
if_empty = False
digit = 2
+ def __init__(self, kind="float",digits=False, *args, **kw):
+ self.digits = digits
+ super(Float, self).__init__(*args, **kw)
+
def _from_python(self, value, state):
return format.format_decimal(float(value) or 0.0, self.digit)
def _to_python(self, value, state):
+ if isinstance(self.digits, basestring):
+ self.digits = eval(self.digits)
+ if self.digits:
+ try:
+ nan_pattern = r"[^0-9]";
+ sign = ''
+ if value[0] == '-':
+ sign = '-'
+ integer_part = value[len(sign):]
+ decimal_part = ''
+ # split float integer and decimal parts on last non decimal char
+ decimal_sep_position = re.subn(nan_pattern, '.', integer_part)
+ if decimal_sep_position[1] != 0:
+ decimal_sep_position = decimal_sep_position[0].rindex('.')
+ else:
+ decimal_sep_position = -1
+ if decimal_sep_position != -1:
+ decimal_part = integer_part[decimal_sep_position+1:]
+ #integer_part = integer_part.substring(0, decimal_sep_position)
+ if len(integer_part) > int(self.digits[0]) or len(decimal_part) > int(self.digits[1]):
+ raise ValueError
+ except ValueError:
+ raise formencode.api.Invalid(_('Invalid literal for float'), value, state)
try:
value = format.parse_decimal(value)
except ValueError:
=== modified file 'addons/openerp/widgets/form/_form.py'
--- addons/openerp/widgets/form/_form.py 2012-02-29 07:24:24 +0000
+++ addons/openerp/widgets/form/_form.py 2013-01-29 07:07:22 +0000
@@ -426,17 +426,20 @@
class Float(TinyInputWidget):
template = "/openerp/widgets/form/templates/float.mako"
+ params = ['digits']
def __init__(self, **attrs):
super(Float, self).__init__(**attrs)
- digits = attrs.get('digits', (16,2))
+ digits = attrs.get('digits', False)
if isinstance(digits, basestring):
digits = eval(digits)
-
- integer, digit = digits
-
- self.validator = validators.Float(digit=digit)
+ #integer, digit = digits
+ self.digits = digits
+ if isinstance(self.digits, tuple):
+ self.digits = list(self.digits)
+
+ self.validator = validators.Float(digits=digits)
# if not self.default:
# self.default = 0.0
@@ -607,6 +610,7 @@
self.validator = self.widget.validator
self.relation = attrs.get('relation') or None
self.editable = self.readonly
+
if 'field_id' not in attrs:
self.field_id = self.name
=== modified file 'addons/openerp/widgets/form/templates/float.mako'
--- addons/openerp/widgets/form/templates/float.mako 2011-10-05 10:10:37 +0000
+++ addons/openerp/widgets/form/templates/float.mako 2013-01-29 07:07:22 +0000
@@ -6,6 +6,7 @@
id ='${name}'
value="${value}"
size="1"
+ digits="${digits}"
class="${css_class}" ${py.attrs(attrs, fld_required=required and 1 or 0, fld_readonly=readonly and 1 or 0)}/>
% endif
=== modified file 'openobject/widgets/_base.py'
--- openobject/widgets/_base.py 2010-12-20 09:57:11 +0000
+++ openobject/widgets/_base.py 2013-01-29 07:07:22 +0000
@@ -264,6 +264,7 @@
'required': "Whether the field value is required.",
'readonly': "Whether the field is readonly.",
'disabled': "Whether the field is disabled.",
+ 'digits': "Whether field contains digits"
}
validator = DefaultValidator
@@ -271,6 +272,7 @@
required = False
readonly = False
disabled = False
+ digits = False
strip_name = False
@@ -312,6 +314,10 @@
def is_readonly(self):
return self.readonly
+ @property
+ def has_digits(self):
+ return self.digits
+
def validate(self, value, state=None):
"""Validate value using validator if widget has one. If validation fails
a formencode.Invalid exception will be raised.
@@ -386,6 +392,9 @@
if self.is_disabled:
classes.append('disabledfield')
+ if self.has_digits:
+ classes.append('digitsfield')
+
if getattr(params, 'error', None):
classes.append('errorfield')