Expose REST Interface

PRO Only

FlowRESTMixin adds REST endpoints for state transitions.

from viewflow.fsm import FlowRESTMixin

class ReviewViewSet(FlowRESTMixin, viewsets.ModelViewSet):
    flow_state = ReviewFlow.state_field
    queryset = Review.objects.all()
    serializer_class = ReviewSerializer

    def get_object_flow(self, request, obj):
        """Custom flow initialization"""
        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 REST interface discovers it automatically.

Custom Serializer Per Transition

def get_serializer_class(self):
    if self.action in ('approve', 'reject'):
        return ReviewAuditSerializer
    return super().get_serializer_class()

Custom Transition Action

@action(methods=['POST'], detail=True, url_path='transition/approve')
def approve(self, request, *args, **kwargs):
    instance = self.get_object()
    flow = self.get_object_flow(request, instance)

    if not flow.approve.has_perm(request.user):
        raise PermissionDenied

    if not flow.approve.can_proceed():
        raise ValidationError(_('Transition is not allowed'))

    serializer = self.get_serializer(instance, data=request.data, partial=True)
    serializer.is_valid(raise_exception=True)
    self.perform_update(serializer)

    flow.approve()

    return Response(serializer.data)