From 152d6e8dd214739585f56cb0ffd901f1d2e1f287 Mon Sep 17 00:00:00 2001 From: Lorenzo Battistini Date: Mon, 10 Nov 2014 18:55:10 +0100 Subject: [PATCH] [ADD] draft --- field_validator/__init__.py | 2 +- field_validator/__openerp__.py | 8 +- field_validator/field.py | 62 --------------- field_validator/ir_model_field.py | 101 ++++++++++++++++++++++++ field_validator/ir_model_field_view.xml | 14 ++++ field_validator/test/validator.yml | 6 ++ 6 files changed, 127 insertions(+), 66 deletions(-) delete mode 100644 field_validator/field.py create mode 100644 field_validator/ir_model_field.py create mode 100644 field_validator/ir_model_field_view.xml create mode 100644 field_validator/test/validator.yml diff --git a/field_validator/__init__.py b/field_validator/__init__.py index c968a1572..6998ce8c1 100644 --- a/field_validator/__init__.py +++ b/field_validator/__init__.py @@ -17,4 +17,4 @@ # along with this program. If not, see . # ############################################################################## -import field +from . import ir_model_field diff --git a/field_validator/__openerp__.py b/field_validator/__openerp__.py index d8095f23b..1db85a1ac 100644 --- a/field_validator/__openerp__.py +++ b/field_validator/__openerp__.py @@ -22,18 +22,20 @@ 'name': "Field Validator", 'version': '0.1', 'category': 'Tools', - 'summary': "Checks for whitespace before fields", + 'summary': "", 'description': """ -This module delete eventually whitespace before strings in fields. """, 'author': 'Agile Business Group', 'website': 'http://www.agilebg.com', 'license': 'AGPL-3', "depends": ['base'], - "data": [], + "data": [ + 'ir_model_field_view.xml', + ], "demo": [], 'test': [ + 'test/validator.yml', ], "active": False, "installable": True diff --git a/field_validator/field.py b/field_validator/field.py deleted file mode 100644 index 4ef1c1766..000000000 --- a/field_validator/field.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2014 Agile Business Group sagl () -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -from openerp.osv import orm -from openerp import SUPERUSER_ID -from openerp.tools.translate import _ - - -class ir_model_field(orm.Model): - - _inherit = 'ir.model.field' - - def _wrap_name_create(self, old_create, model): - def wrapper(cr, uid, name, context=None): - raise orm.except_orm(_('Error'), - _("Can't create quickly. " - "Opening create form")) - return wrapper - - def _register_hook(self, cr, ids=None): - if ids is None: - ids = self.search(cr, SUPERUSER_ID, []) - for model in self.browse(cr, SUPERUSER_ID, ids): - if model.avoid_quick_create: - model_name = model.model - model_obj = self.pool.get(model_name) - if model_obj and not hasattr(model_obj, 'check_quick_create'): - model_obj.name_create = self._wrap_name_create( - model_obj.name_create, - model_name) - model_obj.check_quick_create = True - return True - - def create(self, cr, uid, vals, context=None): - res_id = super(ir_model_field, self).create( - cr, uid, vals, context=context) - self._register_hook(cr, [res_id]) - return res_id - - def write(self, cr, uid, ids, vals, context=None): - if isinstance(ids, (int, long)): - ids = [ids] - super(ir_model_field, self).write(cr, uid, ids, vals, context=context) - self._register_hook(cr, ids) - return True diff --git a/field_validator/ir_model_field.py b/field_validator/ir_model_field.py new file mode 100644 index 000000000..9b53ca972 --- /dev/null +++ b/field_validator/ir_model_field.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2014 Agile Business Group sagl () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv import orm, fields +import re +from openerp.tools.translate import _ +import openerp +from openerp import SUPERUSER_ID + + +class IrModelField(orm.Model): + + _inherit = 'ir.model.field' + _columns = { + 'regex_validator': fields.char( + 'Validator', size=256, + help="Regular expression used to validate the field. For example, " + "you can add the expression\n%s\nto the email field" + % r'\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'), + } + + def check_vals(self, cr, uid, vals, model, context=None): + field_ids = self.search(cr, uid, [ + ('model', '=', model), ('regex_validator', '!=', False) + ], context=context) + for field in self.browse(cr, uid, field_ids, context=context): + if field.name in vals: + p = re.compile(field.regex_validator) + if not p.match(vals[field.name]): + raise orm.except_orm( + _('Error'), + _('Expression %s not passed for %s') % ( + field.regex_validator, vals[field.name])) + return True + + def _wrap_create(self, old_create, model): + def wrapper(cr, uid, vals, context=None, **kwargs): + self.check_vals(cr, uid, vals, model, context=context) + new_id = old_create(cr, uid, vals, context=context, **kwargs) + return new_id + + return wrapper + + def _wrap_write(self, old_write, model): + def wrapper(cr, uid, ids, vals, context=None, **kwargs): + self.check_vals(cr, uid, vals, model, context=context) + old_write(cr, uid, ids, vals, context=context, **kwargs) + return True + + return wrapper + + def _register_hook(self, cr, ids=None): + """ Wrap the methods `create` and `write` of the model + """ + updated = False + for field in self.browse(cr, SUPERUSER_ID, ids): + model = field.model_id.model + model_obj = self.pool.get(model) + if not hasattr(model_obj, 'field_validator_checked'): + model_obj.create = self._wrap_create( + model_obj.create, model) + model_obj.write = self._wrap_write(model_obj.write, model) + model_obj.field_validator_checked = True + updated = True + return updated + + def create(self, cr, uid, vals, context=None): + res_id = super(IrModelField, self).create( + cr, uid, vals, context=context) + if vals.get('regex_validator'): + if self._register_hook(cr, [res_id]): + openerp.modules.registry.RegistryManager.\ + signal_registry_change(cr.dbname) + return res_id + + def write(self, cr, uid, ids, vals, context=None): + if isinstance(ids, (int, long)): + ids = [ids] + super(IrModelField, self).write(cr, uid, ids, vals, context=context) + if vals.get('regex_validator'): + if self._register_hook(cr, ids): + openerp.modules.registry.RegistryManager.\ + signal_registry_change(cr.dbname) + return True diff --git a/field_validator/ir_model_field_view.xml b/field_validator/ir_model_field_view.xml new file mode 100644 index 000000000..4fcb13463 --- /dev/null +++ b/field_validator/ir_model_field_view.xml @@ -0,0 +1,14 @@ + + + + + ir.model.fields + + + + + + + + + diff --git a/field_validator/test/validator.yml b/field_validator/test/validator.yml new file mode 100644 index 000000000..f632f0997 --- /dev/null +++ b/field_validator/test/validator.yml @@ -0,0 +1,6 @@ +- + Try fields validator +- + !python {model: ir.model.field}: | + field_ids = self.search(cr, uid, [('name', '=', 'email'), ('model', '=', 'res.partner')] + assert len(field_ids) == 1, 'There must be 1 email field'