Browse Source

[REF] working with tests

pull/84/head
Lorenzo Battistini 10 years ago
committed by eLBati
parent
commit
ac6273e435
  1. 3
      field_validator/__init__.py
  2. 7
      field_validator/__openerp__.py
  3. 78
      field_validator/ir_model.py
  4. 9
      field_validator/ir_model_demo.xml
  5. 33
      field_validator/ir_model_field_regex.py
  6. 14
      field_validator/ir_model_field_view.xml
  7. 22
      field_validator/ir_model_view.xml
  8. 5
      field_validator/security/ir.model.access.csv
  9. 34
      field_validator/test/validator.yml

3
field_validator/__init__.py

@ -17,4 +17,5 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import ir_model_field
from . import ir_model
from . import ir_model_field_regex

7
field_validator/__openerp__.py

@ -31,9 +31,12 @@
'license': 'AGPL-3',
"depends": ['base'],
"data": [
'ir_model_field_view.xml',
'ir_model_view.xml',
'security/ir.model.access.csv',
],
"demo": [
'ir_model_demo.xml',
],
"demo": [],
'test': [
'test/validator.yml',
],

78
field_validator/ir_model_field.py → field_validator/ir_model.py

@ -25,29 +25,24 @@ import openerp
from openerp import SUPERUSER_ID
class IrModelFields(orm.Model):
class IrModel(orm.Model):
_inherit = 'ir.model.fields'
_inherit = 'ir.model'
_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'),
}
'validator_line_ids': fields.one2many(
'ir.model.validator.line', 'name', 'Validators'),
}
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]):
for validator_line in model.validator_line_ids:
if validator_line.field_id.name in vals:
pattern = re.compile(validator_line.regex_id.regex)
if not pattern.match(vals[validator_line.field_id.name]):
raise orm.except_orm(
_('Error'),
_('Expression %s not passed for %s') % (
field.regex_validator, vals[field.name]))
validator_line.regex_id.regex,
vals[validator_line.field_id.name]))
return True
def _wrap_create(self, old_create, model):
@ -72,32 +67,45 @@ class IrModelFields(orm.Model):
if ids is None:
ids = self.search(cr, SUPERUSER_ID, [])
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
for model in self.browse(cr, SUPERUSER_ID, ids):
if model.validator_line_ids:
model_name = model.model
model_obj = self.pool.get(model_name)
if model_obj and 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(IrModelFields, self).create(
res_id = super(IrModel, 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)
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(IrModelFields, 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)
super(IrModel, self).write(cr, uid, ids, vals, context=context)
if self._register_hook(cr, ids):
openerp.modules.registry.RegistryManager.\
signal_registry_change(cr.dbname)
return True
class IrModelValidatorLine(orm.Model):
_name = "ir.model.validator.line"
_columns = {
'name': fields.many2one('ir.model', string="Model", required=True),
'field_id': fields.many2one(
'ir.model.fields', 'Field', required=True),
'regex_id': fields.many2one(
'ir.model.fields.regex', string="Validator",
required=True),
}

9
field_validator/ir_model_demo.xml

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="regex_mail" model="ir.model.fields.regex">
<field name="regex">[^@]+@[^@]+\.[^@]+</field>
<field name="name">Email</field>
</record>
</data>
</openerp>

33
field_validator/ir_model_field_regex.py

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2014 Agile Business Group sagl (<http://www.agilebg.com>)
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import orm, fields
class IrModelFieldsRegex(orm.Model):
_name = "ir.model.fields.regex"
_columns = {
'name': fields.char('Description', size=512, required=True),
'regex': fields.char(
'Regular Expression', size=512, required=True,
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'),
}

14
field_validator/ir_model_field_view.xml

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_model_fields_form_validator" model="ir.ui.view">
<field name="model">ir.model.fields</field>
<field name="inherit_id" ref="base.view_model_fields_form"></field>
<field name="arch" type="xml">
<field name="on_delete" position="after">
<field name="regex_validator" attrs="{'readonly': [('ttype','not in',['char','text'])]}"></field>
</field>
</field>
</record>
</data>
</openerp>

22
field_validator/ir_model_view.xml

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_model_form_validator" model="ir.ui.view">
<field name="model">ir.model</field>
<field name="inherit_id" ref="base.view_model_form"></field>
<field name="arch" type="xml">
<notebook position="inside">
<page string="Validators">
<field name="validator_line_ids">
<tree editable="bottom">
<field name="field_id"
domain="[('model_id','=',parent.id)]"></field>
<field name="regex_id"></field>
</tree>
</field>
</page>
</notebook>
</field>
</record>
</data>
</openerp>

5
field_validator/security/ir.model.access.csv

@ -0,0 +1,5 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_ir_model_regex_erp_manager","ir_model_regex group_erp_manager","model_ir_model_fields_regex","base.group_erp_manager",1,1,1,1
"access_ir_model_regex_all","access_ir_model_regex_all","model_ir_model_fields_regex",,1,0,0,0
"access_ir_model_validator_line_erp_manager","ir_model_validator_line group_erp_manager","model_ir_model_validator_line","base.group_erp_manager",1,1,1,1
"access_ir_model_validator_line_all","access_ir_model_validator_line_all","model_ir_model_validator_line",,1,0,0,0

34
field_validator/test/validator.yml

@ -1,8 +1,30 @@
-
Try fields validator
set regex for partner
-
!python {model: ir.model.fields}: |
from openerp.exceptions import Warning
field_ids = self.search(cr, uid, [('name', '=', 'email'), ('model', '=', 'res.partner')])
assert len(field_ids) == 1, 'There must be 1 email field'
self.write(cr, uid, field_ids, {'regex_validator': r'\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'})
!python {model: ir.model}: |
self.write(cr, uid, [ref('base.model_res_partner')], {
'validator_line_ids': [(0,0,
{
'name': ref('base.model_res_partner'),
'field_id': ref('base.field_res_partner_email'),
'regex_id': ref('regex_mail'),
})],
})
-
Set valid email
-
!record {model: res.partner, id: base.res_partner_12}:
email: 'info@agilebg.com'
-
Try invalid email
-
!python {model: res.partner}: |
from openerp.osv import orm
try:
self.write(cr, uid, [ref('base.res_partner_12')], {
'email': 'john',
})
assert False, "An exception should have been raised, 'john' is not a valid email!"
except orm.except_orm:
# exception was raised as expected
pass
Loading…
Cancel
Save