1717from django .db .models .query_utils import DeferredAttribute
1818from django .db .models .signals import class_prepared
1919
20+ from .exceptions import ConcurrentTransition
21+ from .exceptions import InvalidResultState
22+ from .exceptions import InvalidTransition
23+ from .exceptions import NoTransition
24+ from .exceptions import TransitionConditionsUnmet
25+ from .exceptions import TransitionNotAllowed
2026from .signals import post_transition
2127from .signals import pre_transition
2228
6470 "FSMIntegerField" ,
6571 "FSMKeyField" ,
6672 "FSMModelMixin" ,
73+ "InvalidTransition" ,
74+ "NoTransition" ,
75+ "TransitionConditionsUnmet" ,
6776 "TransitionNotAllowed" ,
6877 "can_proceed" ,
6978 "has_transition_perm" ,
7584ANY_OTHER_STATE = "+"
7685
7786
78- class TransitionNotAllowed (Exception ): # noqa: N818
79- """Raised when a transition is not allowed"""
80-
81- @override
82- def __init__ (self , * args : typing .Any , ** kwargs : typing .Any ) -> None :
83- self .object = kwargs .pop ("object" , None )
84- self .method = kwargs .pop ("method" , None )
85- self .failed_condition = kwargs .pop ("failed_condition" , None )
86- super ().__init__ (* args , ** kwargs )
87-
88-
89- class InvalidResultState (Exception ): # noqa: N818
90- """Raised when we got invalid result state"""
91-
92-
93- class ConcurrentTransition (Exception ): # noqa: N818
94- """
95- Raised when the transition cannot be executed because the
96- object has become stale (state has been changed since it
97- was fetched from the database).
98- """
99-
100-
10187class Transition :
10288 def __init__ (
10389 self ,
@@ -148,7 +134,8 @@ def __eq__(self, other: object) -> bool:
148134
149135
150136def get_available_FIELD_transitions ( # noqa: N802
151- instance : _FSMModel , field : FSMFieldMixin
137+ instance : _FSMModel ,
138+ field : FSMFieldMixin ,
152139) -> typing .Generator [Transition ]:
153140 """
154141 List of transitions available in current model state
@@ -164,7 +151,8 @@ def get_available_FIELD_transitions( # noqa: N802
164151
165152
166153def get_all_FIELD_transitions ( # noqa: N802
167- instance : _FSMModel , field : FSMFieldMixin
154+ instance : _FSMModel ,
155+ field : FSMFieldMixin ,
168156) -> typing .Generator [Transition ]:
169157 """
170158 List of all transitions available in current model state
@@ -173,7 +161,9 @@ def get_all_FIELD_transitions( # noqa: N802
173161
174162
175163def get_available_user_FIELD_transitions ( # noqa: N802
176- instance : _FSMModel , user : UserWithPermissions , field : FSMFieldMixin
164+ instance : _FSMModel ,
165+ user : UserWithPermissions ,
166+ field : FSMFieldMixin ,
177167) -> typing .Generator [Transition ]:
178168 """
179169 List of transitions available in current model state
@@ -256,7 +246,7 @@ def conditions_met(self, instance: _FSMModel, state: _StateValue) -> bool:
256246
257247 return all (condition (instance ) for condition in transition .conditions )
258248
259- def _get_first_unmet_condition (
249+ def get_first_unmet_condition (
260250 self , instance : _FSMModel , state : _StateValue
261251 ) -> _Condition | None :
262252 """
@@ -290,15 +280,15 @@ def next_state(self, current_state: _StateValue) -> _StateValue:
290280 transition = self .get_transition (current_state )
291281
292282 if transition is None :
293- raise TransitionNotAllowed (f"No transition from { current_state } " )
283+ raise NoTransition (f"No transition from { current_state } " )
294284
295285 return transition .target
296286
297287 def exception_state (self , current_state : _StateValue ) -> _StateValue | None :
298288 transition = self .get_transition (current_state )
299289
300290 if transition is None :
301- raise TransitionNotAllowed (f"No transition from { current_state } " )
291+ raise NoTransition (f"No transition from { current_state } " )
302292
303293 return transition .on_error
304294
@@ -390,14 +380,14 @@ def change_state(
390380 current_state = self .get_state (instance )
391381
392382 if not meta .has_transition (current_state ):
393- raise TransitionNotAllowed (
383+ raise InvalidTransition (
394384 f"Can't switch from state '{ current_state } ' using method '{ method_name } '" ,
395385 object = instance ,
396386 method = method ,
397387 )
398- unmet = meta ._get_first_unmet_condition (instance , current_state )
388+ unmet = meta .get_first_unmet_condition (instance , current_state )
399389 if unmet is not None :
400- raise TransitionNotAllowed (
390+ raise TransitionConditionsUnmet (
401391 f"Transition conditions have not been met for method '{ method_name } ': "
402392 f"{ getattr (unmet , '__name__' , repr (unmet ))} " ,
403393 object = instance ,
0 commit comments