Browse Source

[12.0][IMP] add by_method exception

12.0-mig-module_prototyper_last
Sébastien BEAU 5 years ago
parent
commit
fe923aab8d
  1. 25
      base_exception/models/base_exception.py

25
base_exception/models/base_exception.py

@ -26,14 +26,16 @@ class ExceptionRule(models.Model):
exception_type = fields.Selection( exception_type = fields.Selection(
selection=[('by_domain', 'By domain'), selection=[('by_domain', 'By domain'),
('by_py_code', 'By python code')],
('by_py_code', 'By python code'),
('by_method', 'By method'),
],
string='Exception Type', required=True, default='by_py_code', string='Exception Type', required=True, default='by_py_code',
help="By python code: allow to define any arbitrary check\n" help="By python code: allow to define any arbitrary check\n"
"By domain: limited to a selection by an odoo domain:\n" "By domain: limited to a selection by an odoo domain:\n"
" performance can be better when exceptions " " performance can be better when exceptions "
" are evaluated with several records") " are evaluated with several records")
domain = fields.Char('Domain') domain = fields.Char('Domain')
method = fields.Char('Method', readonly=True)
active = fields.Boolean('Active', default=True) active = fields.Boolean('Active', default=True)
code = fields.Text( code = fields.Text(
'Python Code', 'Python Code',
@ -45,11 +47,13 @@ class ExceptionRule(models.Model):
def check_exception_type_consistency(self): def check_exception_type_consistency(self):
for rule in self: for rule in self:
if ((rule.exception_type == 'by_py_code' and not rule.code) or if ((rule.exception_type == 'by_py_code' and not rule.code) or
(rule.exception_type == 'by_domain' and not rule.domain)):
(rule.exception_type == 'by_domain' and not rule.domain) or
(rule.exception_type == 'by_method' and not rule.method)):
raise ValidationError( raise ValidationError(
_("There is a problem of configuration, python code or "
"domain is missing to match the exception type.")
_("There is a problem of configuration, python code, "
"domain or method is missing to match the exception type.")
) )
# TODO in case of by_method exception test that the method exist with hasattr
@api.multi @api.multi
def _get_domain(self): def _get_domain(self):
@ -163,6 +167,8 @@ class BaseExceptionMethod(models.AbstractModel):
return self._detect_exceptions_by_py_code(rule) return self._detect_exceptions_by_py_code(rule)
elif rule.exception_type == 'by_domain': elif rule.exception_type == 'by_domain':
return self._detect_exceptions_by_domain(rule) return self._detect_exceptions_by_domain(rule)
elif rule.exception_type == 'by_method':
return self._detect_exceptions_by_method(rule)
@api.multi @api.multi
def _get_base_domain(self): def _get_base_domain(self):
@ -191,6 +197,15 @@ class BaseExceptionMethod(models.AbstractModel):
domain = osv.expression.AND([base_domain, rule_domain]) domain = osv.expression.AND([base_domain, rule_domain])
return self.search(domain) return self.search(domain)
@api.multi
def _detect_exceptions_by_method(self, rule):
"""
Find exceptions found on self.
"""
base_domain = self._get_base_domain()
records = self.search(base_domain)
return getattr(records, rule.method)()
class BaseException(models.AbstractModel): class BaseException(models.AbstractModel):
_inherit = 'base.exception.method' _inherit = 'base.exception.method'

Loading…
Cancel
Save