from django.db import models from evolus.models import Version class Process(models.Model): process_type = models.CharField(max_length=50) document_version = models.ForeignKey(Version) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if not self.pk and not self.process_type: self.process_type = self.PROCESS_TYPE def __str__(self): return '{}: {}'.format(self.process_type, self.document_version) def create_task(self, assigned_to): task, created = Task.objects.get_or_create(status=1, assigned_to=assigned_to, process=self) if created: task.save() def allow_tasks_delegation(self): return True def save(self): raise NotImplemented('is_valid has to be implemented on the subprocess') TASK_STATUS = ( (1, 'Created'), (3, 'Completed') ) class Task(models.Model): assigned_to = models.EmailField() process = models.ForeignKey(Process) status = models.IntegerField(choices=TASK_STATUS) def __str__(self): return '{} - {}'.format(self.process, self.assigned_to) class PublishedProcessMixin(object): def save(self, *args, **kwargs): if self.document_version.status == 'Draft': raise TypeError('Review flow cant apply to draft documents') return super().save(*args, **kwargs) class DraftProcessMixin(object): def save(self, *args, **kwargs): if self.document_version.status == 'Published': raise TypeError('Review flow cant apply to published documents') return super().save(*args, **kwargs) class Review(Process, PublishedProcessMixin): PROCESS_TYPE = 'Review' def __str__(self): return 'Review: {}'.format(self.document_version) class Approval(Process, DraftProcessMixin): PROCESS_TYPE = 'Approval' class GatherComments(Process, DraftProcessMixin): PROCESS_TYPE = 'GatherComments' class Knowledge(Process, PublishedProcessMixin): PROCESS_TYPE = 'Knowledge' def allow_tasks_delegation(self): return False