diff --git a/base_exception/models/base_exception.py b/base_exception/models/base_exception.py
index b6b0d6fb0..f8de02691 100644
--- a/base_exception/models/base_exception.py
+++ b/base_exception/models/base_exception.py
@@ -41,6 +41,13 @@ class ExceptionRule(models.Model):
required=True,
)
model = fields.Selection(selection=[], string='Apply on', required=True)
+
+ type = fields.Selection(
+ selection=[('by_domain', 'By domain'),
+ ('by_py_code', 'By Python Code')],
+ string='Exception Type', required=True)
+ domain = fields.Char('Domain')
+
active = fields.Boolean('Active')
next_state = fields.Char(
'Next state',
@@ -76,6 +83,19 @@ class ExceptionRule(models.Model):
select_vals
))
+ @api.multi
+ def _get_domain(self):
+ """ override me to customize domains according exceptions cases """
+ self.ensure_one()
+ return safe_eval(self.domain)
+
+ @api.onchange('type',)
+ def onchange_type(self):
+ if self.type == 'by_domain':
+ self.code = False
+ elif self.type == 'by_py_code':
+ self.domain = False
+
class BaseException(models.AbstractModel):
_name = 'base.exception'
@@ -146,6 +166,7 @@ class BaseException(models.AbstractModel):
def detect_exceptions(self):
"""returns the list of exception_ids for all the considered base.exceptions
"""
+ import pdb; pdb.set_trace()
if not self:
return []
exception_obj = self.env['exception.rule']
@@ -195,15 +216,25 @@ class BaseException(models.AbstractModel):
@api.multi
def _detect_exceptions(self, model_exceptions, sub_exceptions):
self.ensure_one()
+ import pdb; pdb.set_trace()
exception_ids = []
next_state_rule = False
for rule in model_exceptions:
- if self._rule_eval(rule, self.rule_group, self):
+ if rule.type == 'by_py_code' and self._rule_eval(
+ rule, self.rule_group, self):
exception_ids.append(rule.id)
- if rule.next_state:
- if not next_state_rule or \
- rule.sequence < next_state_rule.sequence:
- next_state_rule = rule
+
+ elif rule.type == 'by_domain' and rule.domain:
+ domain = rule._get_domain()
+ domain.append(('id', '=', self.id))
+ if self.search(domain):
+ exception_ids.append(rule.id)
+
+ if rule.next_state:
+ if not next_state_rule or \
+ rule.sequence < next_state_rule.sequence:
+ next_state_rule = rule
+
if sub_exceptions:
for obj_line in self._get_lines():
for rule in sub_exceptions:
@@ -213,8 +244,15 @@ class BaseException(models.AbstractModel):
# (ex sale order line if obj is sale order)
continue
group_line = self.rule_group + '_line'
- if self._rule_eval(rule, group_line, obj_line):
+ if rule.type == 'by_py_code' and self._rule_eval(
+ rule, group_line, obj_line):
exception_ids.append(rule.id)
+ elif rule.type == 'by_domain' and rule.domain:
+ domain = rule._get_domain()
+ domain.append(('id', '=', obj_line.id))
+ if obj_line.search(domain):
+ exception_ids.append(rule.id)
+
# set object to next state
if next_state_rule:
self.state = next_state_rule.next_state
diff --git a/base_exception/views/base_exception_view.xml b/base_exception/views/base_exception_view.xml
index 9526db774..8b4a599b9 100644
--- a/base_exception/views/base_exception_view.xml
+++ b/base_exception/views/base_exception_view.xml
@@ -40,9 +40,10 @@
+
-
+