FlowAdminMixin adds transition actions to Django admin.
from django.contrib import admin
from viewflow import fsm
from .flows import ReviewFlow
from .models import Review
@admin.register(Review)
class ReviewFlowAdmin(fsm.FlowAdminMixin, admin.ModelAdmin):
readonly_fields = ('state', )
flow_state = ReviewFlow.state
def get_object_flow(self, request, obj):
return ReviewFlow(
obj, user=request.user,
ip_address=request.META.get('REMOTE_ADDR')
)
If your flow class takes only the model instance in its constructor, the admin
discovers it automatically. Override get_object_flow for custom
initialization.
Let admins edit fields alongside transitions:
def get_transition_fields(self, request, obj, slug):
if slug == 'approve':
return ['text', 'comment']
Override a transition view completely:
def get_urls(self):
return [path(
'<path:object_id>/transition/reject/',
self.admin_site.admin_view(self.reject_view),
)] + super().get_urls()
def reject_view(self, request, object_id):
obj = get_object_or_404(self.model, pk=object_id)
flow = self.get_object_flow(request, obj)
if not flow.reject.has_perm(request.user) or not flow.reject.can_proceed():
raise PermissionDenied
if request.method == "POST":
flow.reject()
obj.save()
return redirect('../../')
return render(request, ...)
FlowAdminMixin works with reversion.admin.VersionAdmin.