diff --git a/statechart/models/statechart_mixin.py b/statechart/models/statechart_mixin.py index b835e66..bb8e1d1 100644 --- a/statechart/models/statechart_mixin.py +++ b/statechart/models/statechart_mixin.py @@ -315,9 +315,14 @@ class can override the statechart with another one adding new events, @api.model def _get_sc_event_allowed_field_names(self): + ignore_for_has_allowed_events = self.env.context.get( + "ignore_for_has_allowed_events", [] + ) event_names = self._statechart.events_for() return [ - _sc_make_event_allowed_field_name(event_name) for event_name in event_names + _sc_make_event_allowed_field_name(event_name) + for event_name in event_names + if event_name not in ignore_for_has_allowed_events ] @api.depends("sc_state") diff --git a/test_statechart/models/test_statechart.yml b/test_statechart/models/test_statechart.yml index 640657f..30c8a22 100644 --- a/test_statechart/models/test_statechart.yml +++ b/test_statechart/models/test_statechart.yml @@ -8,10 +8,18 @@ statechart: transitions: - event: confirm1 target: confirmed1 + - 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 87caf9d..1f617e2 100644 --- a/test_statechart/tests/test_basic.py +++ b/test_statechart/tests/test_basic.py @@ -37,3 +37,34 @@ def test_automatic_transition(self): record.confirm1() # small amount, step 2 done automatically self.assertScState(record.sc_state, ["confirmed2", "root"]) + + def test_get_sc_event_allowed_field_names(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_cache() + self.assertEqual( + record.with_context( + ignore_for_has_allowed_events=["cancel"] + ).sc_has_allowed_events, + True, + ) + + # no event allowed + record.invalidate_cache() + self.assertEqual( + record.with_context( + ignore_for_has_allowed_events=["cancel", "confirm2"] + ).sc_has_allowed_events, + False, + )