@@ -95,18 +95,32 @@ def get_fsm_object_transitions(self, request: HttpRequest, obj: typing.Any) -> l
95
95
96
96
for field_name in sorted (self .fsm_fields ):
97
97
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
+ ],
106
104
)
107
105
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
+
110
124
def get_fsm_transition_form (self , transition : fsm .Transition ) -> Form | None :
111
125
form = transition .custom .get ("form" )
112
126
if isinstance (form , str ):
@@ -166,9 +180,15 @@ def response_change(self, request: HttpRequest, obj: typing.Any) -> HttpResponse
166
180
)
167
181
168
182
# 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
+
172
192
return redirect (
173
193
reverse (
174
194
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
209
229
level = messages .ERROR ,
210
230
)
211
231
else :
232
+
212
233
obj .save ()
213
234
self .message_user (
214
235
request = request ,
@@ -279,14 +300,14 @@ def fsm_transition_view(self, request, *args, **kwargs):
279
300
except fsm .TransitionNotAllowed :
280
301
self .message_user (
281
302
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 ) ,
283
304
messages .ERROR ,
284
305
)
285
306
else :
286
307
obj .save ()
287
308
self .message_user (
288
309
request ,
289
- _ ( "Transition %(transition)s applied" ) % { "transition" : self . _get_transition_title ( transition )} ,
310
+ fsm_transition_success_msg . format ( transition_name = transition_name ) ,
290
311
messages .SUCCESS ,
291
312
)
292
313
return redirect (f"admin:{ self .model ._meta .app_label } _{ self .model ._meta .model_name } _change" , object_id = obj .id )
0 commit comments