diff --git a/statechart/models/statechart_mixin.py b/statechart/models/statechart_mixin.py index 0a3487e..8e68b5c 100644 --- a/statechart/models/statechart_mixin.py +++ b/statechart/models/statechart_mixin.py @@ -330,15 +330,16 @@ class can override the statechart with another one adding new events, return res @api.model - def _get_sc_event_allowed_field_names(self): - event_names = self._statechart.events_for() + def _get_sc_event_allowed_field_names(self, events_to_ignore=None): + event_names = set(self._statechart.events_for()) - set(events_to_ignore or []) return [ _sc_make_event_allowed_field_name(event_name) for event_name in event_names ] @api.depends("sc_state") def _compute_sc_has_allowed_events(self): - sc_fields = self._get_sc_event_allowed_field_names() + events_to_ignore = self.env.context.get("ignore_for_has_allowed_events") + sc_fields = self._get_sc_event_allowed_field_names(events_to_ignore) for rec in self: rec.sc_has_allowed_events = any([rec[f] for f in sc_fields]) diff --git a/test_statechart/models/test_statechart.yml b/test_statechart/models/test_statechart.yml index 39a63a0..0b26470 100644 --- a/test_statechart/models/test_statechart.yml +++ b/test_statechart/models/test_statechart.yml @@ -10,10 +10,18 @@ statechart: target: confirmed1 - target: confirmed1 guard: o.amount < 1 + - target: canceled + event: cancel - name: confirmed1 transitions: - target: confirmed2 guard: o.amount < 100 - target: confirmed2 event: confirm2 + - target: canceled + event: cancel - name: confirmed2 + transitions: + - target: canceled + event: cancel + - name: canceled diff --git a/test_statechart/tests/test_basic.py b/test_statechart/tests/test_basic.py index 90e915b..56adcd7 100644 --- a/test_statechart/tests/test_basic.py +++ b/test_statechart/tests/test_basic.py @@ -35,3 +35,34 @@ def test_automatic_transition_on_create(self): record = model.create({"amount": 0.5}) # very small amount, step 1 and 2 done automatically self.assertScState(record.sc_state, ["confirmed2", "root"]) + + def test_get_sc_sc_has_allowed_events(self): + """ + Test that we can ignore certain events based on a context + key (ignore_for_has_allowed_events) + """ + model = self.env["scobidoo.test.model"] + record = model.create({"amount": 200}) + record.confirm1() + self.assertScState(record.sc_state, ["confirmed1", "root"]) + + # 2 events are allowed: confirmed2 and cancel + self.assertEqual(record.sc_has_allowed_events, True) + + # 1 event is allowed: confirmed2 + record.invalidate_recordset() + self.assertEqual( + record.with_context( + ignore_for_has_allowed_events=["cancel"] + ).sc_has_allowed_events, + True, + ) + + # no event allowed + record.invalidate_recordset() + self.assertEqual( + record.with_context( + ignore_for_has_allowed_events=["cancel", "confirm2"] + ).sc_has_allowed_events, + False, + )