combine foreign key with fsm field in django-fsm

42 Views Asked by At
import datetime

from django.db import models
from django_fsm import FSMField, transition


class WorkFlowState(models.Model):
    name = models.CharField(max_length=64, unique=True)
    preceding = models.ForeignKey(
        'self', on_delete=models.CASCADE,
        blank=True, null=True)
    # postAction = models.CharField(max_length=64, null=True, blank=True)
    default_warn1 = models.DurationField(
        blank=False, null=False, default=datetime.timedelta(hours=12))
    default_warn2 = models.DurationField(
        blank=False, null=False, default=datetime.timedelta(days=1))
    default_duration = models.DurationField(
        blank=False, null=False, default=datetime.timedelta(days=1))

    def __str__(self):
        return self.name


class Transition(models.Model):
    name = models.CharField(max_length=64)
    source_state = models.ForeignKey(WorkFlowState, on_delete=models.CASCADE, related_name='transitions_from')
    target_state = models.ForeignKey(WorkFlowState, on_delete=models.CASCADE, related_name='transitions_to')

    def __str__(self):
        return self.name


class Task(models.Model):
    name = models.CharField(max_length=100)
    assigned_on = models.DateTimeField(auto_now=True)
    created_on = models.DateTimeField(auto_now_add=True)
    task_state = FSMField(models.ForeignKey(WorkFlowState, on_delete=models.PROTECT), protected=True)

    def __str__(self):
        return self.task_state

    def perform_transition(self, transition_name):
        try:
            transition = Transition.objects.get(name=transition_name, source_state=self.task_state)
            setattr(self, 'assigned_to', transition.target_state)
            self.save()
            return True
        except Transition.DoesNotExist:
            return False

I want to have a workflow state the that is a foriegn key to worlflowstate. first i create a transition model that can define states for fsm transition andi tried to define it as you see but it doent work. it store task status like a string

1

There are 1 best solutions below

0
kmmbvnr On

Django-fsm was designed over a decade ago, and its design is unable to accommodate many current requirements.

As the author of Django-fsm, I recommend transitioning to its successor, the viewflow.fsm package. For more information, please visit https://docs.viewflow.io/fsm/index.html.

This package separates model and FSM, and permits the use of any target field for the FSM state.