@@ -95,18 +95,32 @@ def get_fsm_object_transitions(self, request: HttpRequest, obj: typing.Any) -> l
9595
9696 for field_name in sorted (self .fsm_fields ):
9797 if func := getattr (obj , f"get_available_user_{ field_name } _transitions" ):
98- fsm_object_transitions .append ( # noqa: PERF401
99- FSMObjectTransition (
100- fsm_field = field_name ,
101- block_label = self .get_fsm_block_label (fsm_field_name = field_name ),
102- available_transitions = [
103- t for t in func (user = request .user ) if t .custom .get ("admin" , self .default_disallow_transition )
104- ],
105- )
98+ yield FSMObjectTransition (
99+ fsm_field = field_name ,
100+ block_label = self .get_fsm_block_label (fsm_field_name = field_name ),
101+ available_transitions = [
102+ t for t in func (user = request .user ) if t .custom .get ("admin" , self .default_disallow_transition )
103+ ],
106104 )
107105
108- return fsm_object_transitions
109-
106+ def get_fsm_transition_by_name (obj : typing .ANY , transition_name : str ) -> fsm .Transition | None :
107+
108+ try :
109+ transition_name = request .POST [self .fsm_post_param ]
110+ transition_func = getattr (obj , transition_name )
111+ except AttributeError :
112+ self .message_user (
113+ request = request ,
114+ message = self .fsm_transition_not_valid_msg .format (
115+ transition_name = transition_name ,
116+ ),
117+ level = messages .ERROR ,
118+ )
119+ return self .get_fsm_response (
120+ request = request ,
121+ obj = obj ,
122+ )
123+
110124 def get_fsm_transition_form (self , transition : fsm .Transition ) -> Form | None :
111125 form = transition .custom .get ("form" )
112126 if isinstance (form , str ):
@@ -166,9 +180,15 @@ def response_change(self, request: HttpRequest, obj: typing.Any) -> HttpResponse
166180 )
167181
168182 # NOTE: if a form is defined on the transition, we redirect to the form view
169- if transition_func ._django_fsm .get_transition (
170- source = transition_func ._django_fsm .field .get_state (obj ),
171- ).custom .get ("form" ):
183+ if self .get_fsm_transition_form (
184+ transition = transition_func ._django_fsm .get_transition (
185+ source = transition_func ._django_fsm .field .get_state (obj ),
186+ )):
187+ print ('✅' * 40 )
188+ print (transition_func ._django_fsm .get_transition (
189+ source = transition_func ._django_fsm .field .get_state (obj ),
190+ ).custom .get ("form" ))
191+
172192 return redirect (
173193 reverse (
174194 f"admin:{ self .model ._meta .app_label } _{ self .model ._meta .model_name } _transition" ,
@@ -209,6 +229,7 @@ def response_change(self, request: HttpRequest, obj: typing.Any) -> HttpResponse
209229 level = messages .ERROR ,
210230 )
211231 else :
232+
212233 obj .save ()
213234 self .message_user (
214235 request = request ,
@@ -279,14 +300,14 @@ def fsm_transition_view(self, request, *args, **kwargs):
279300 except fsm .TransitionNotAllowed :
280301 self .message_user (
281302 request ,
282- _ ( "Transition %(transition)s is not allowed" ) % { "transition" : self . _get_transition_title ( transition )} ,
303+ fsm_transition_not_allowed_msg . format ( transition_name = transition_name ) ,
283304 messages .ERROR ,
284305 )
285306 else :
286307 obj .save ()
287308 self .message_user (
288309 request ,
289- _ ( "Transition %(transition)s applied" ) % { "transition" : self . _get_transition_title ( transition )} ,
310+ fsm_transition_success_msg . format ( transition_name = transition_name ) ,
290311 messages .SUCCESS ,
291312 )
292313 return redirect (f"admin:{ self .model ._meta .app_label } _{ self .model ._meta .model_name } _change" , object_id = obj .id )
0 commit comments