Skip to content

Commit 2084054

Browse files
committed
wip
1 parent 1316f4c commit 2084054

File tree

3 files changed

+38
-16
lines changed

3 files changed

+38
-16
lines changed

django_fsm/admin.py

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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)

tests/testapp/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ def secret_transition(self, by=None, description=None):
299299
@fsm_log_description
300300
@transition(
301301
field=state,
302-
source=[AdminBlogPostState.CREATED],
302+
source=AdminBlogPostState.CREATED,
303303
target=AdminBlogPostState.REVIEWED,
304304
)
305305
def moderate(self, by=None, description=None):

tests/testapp/tests/test_admin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def test_get_fsm_object_transitions(self):
5151
assert state_transition.fsm_field == "state"
5252
assert state_transition.block_label == "Transition (state)"
5353
assert sorted([t.name for t in state_transition.available_transitions]) == [
54+
"complex_transition",
5455
"hide",
5556
"publish",
5657
]

0 commit comments

Comments
 (0)