프로젝트에 워크 플로 엔진을 구현하기 위해 노력하고 있습니다. 주로 휴대용 응용 프로그램을 만드는 것이 목적입니다. 뭔가 다른 프로젝트에 배치하고 프로젝트의 다른 모델에 워크 플로를 연결하여 작동시킬 수 있습니다.신호와 Celery-django를 사용하는 Django 워크 플로 엔진
나는 접근법을 생각하려고했지만 완벽한 설정이 아닌 것 같습니다. 내 프로젝트 내에서 워크 플로 응용 프로그램을 만드는 생각, 두 종류의 모델을 첨부, 일부 워크 플로 (워크 플로, 단계, 작업) 및 다른 모델의 인스턴스/트랜잭션을 포함합니다 설치 프로그램이 포함됩니다.
다음은 내 모델 설계뿐만 아니라 개선 할 필요가 있다고 생각 내 워크 플로우/models.py
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
import signals
################################
# Workflow engine models
################################
class Signal_Listener(models.Model):
LISTENING_ON = (
('I', 'INSERT'),
('U', 'UPDATE'),
('D', 'DELETE'),
('S', 'SELECT'),
('A', 'ANY QUERY'),
('L', 'ANY DDL'),
)
table_name = models.CharField(max_length=100)
listening_to = models.CharField(max_length=1, choices=LISTENING_ON)
class Meta:
unique_together = (("table_name", "listening_to"),)
def __unicode__(self):
return '%s - %s' % (self.table_name, self.listening_to)
class Action(models.Model):
ACTION_TYPE_CHOICES = (
('P', 'Python Script' ),
('C', 'Class name' ),
)
name = models.CharField(max_length=100)
action_type = models.CharField(max_length=1, choices=ACTION_TYPE_CHOICES)
audit_obj = generic.GenericRelation('core.Audit', editable=False)
class Steps(models.Model):
sequence = models.IntegerField()
Action = models.ForeignKey(Action)
Signal_Listener = models.ForeignKey(Signal_Listener)
class Process(models.Model):
## TODO: Document
# Processes class is used to store information about the process itself.
# Or in another word, the workflow name.
WF_TYPE_LIST = (
('P', 'Python-API'),
)
name = models.CharField(max_length=30)
is_active = models.BooleanField()
wf_type = models.CharField(max_length=1, choices=WF_TYPE_LIST)
audit_obj = generic.GenericRelation('core.Audit', editable=False)
listening_to = models.ForeignKey(Steps)
################################
# Workflow transactions models
################################
class Instance(models.Model):
## TODO: Document
# Re
INSTANCE_STATUS = (
('I', 'In Progress'),
('C', 'Cancelled' ),
('A', 'Archived' ), # Old completed tasks can be archived
('P', 'Pending' ),
('O', 'Completed' )
)
id = models.CharField(max_length=200, primary_key=True)
status = models.CharField(max_length=1, choices=INSTANCE_STATUS, db_index=True)
audit_obj = generic.GenericRelation('core.Audit', editable=False)
def save(self, *args, **kwargs):
# on new records generate a new uuid
if self.id is None or self.id.__len__() is 0:
import uuid
self.id = uuid.uuid4().__str__()
super(Instances, self).save(*args, **kwargs)
class Task(models.Model):
TASK_STATUS = (
('S', 'Assigned' ),
('I', 'In Progress'),
('P', 'Pending' ),
('C', 'Cancelled' ),
('A', 'Archived' ), # Old completed tasks can be archived
('O', 'Completed' )
)
name = models.CharField(max_length=100)
instance = models.ForeignKey(Instance)
status = models.CharField(max_length=1, choices=TASK_STATUS)
bio = models.CharField(max_length=100)
audit_obj = generic.GenericRelation('core.Audit', editable=False)
와 나는 또한이 워크 플로우/signals.py
"""
Workflow Signals
Will be used to monitor all inserts, update, delete or select statements
If an action is attached to that particular table, it will be inserted Celery-Tasks distribution.
"""
from django.db.models.signals import post_save, post_delete
from django.core.cache import cache
def workflow_post_init_listener(sender, **kwargs):
try:
if cache.get('wf_listner_cache_%s' % kwargs['instance']._meta.db_table):
pass
else:
record = 'Signal_Listener'.objects.get(table_name__exact=kwargs['instance']._meta.db_table)
# am not sure what to do next!
except 'Signal_Listener'.DoesNotExist:
# TODO: Error logging
pass
post_save.connect(workflow_post_init_listener, dispatch_uid="workflow.models.listener.save")
입니다. 여러 시나리오에서 사용할 수 있고 승인주기부터 시작하려고합니다. 예를 들어 signal_listener에 table_name/model_name을 삽입하여 새로운 삽입을 모니터링 할 수 있습니다. 그렇다면 특정 워크 플로를 트리거합니다.
조치에 대해서는 행동을 개발해야한다는 것을 이해합니다. 어쩌면 워크 플로 앱 아래에 작업 폴더를 만들어 각 작업을 클래스에 넣어야합니다. 각자 이메일을 보내고, 보관하고, 데이터베이스 값을 업데이트하는 특별한 작업을 수행합니다.
바퀴를 다시 발명하고 이미 개발 된 것이 있다면 누구나 제안 할 수 있습니다. 나는 행복 할 것입니다. 그것을 통해 갈 수 있습니다. 당신이 zope.wfmc의 모양을 가질 수 있습니다 예를 들어
안부,
나는 귀하의 질문에 대한 답을 얻을 수있을 것이라고 생각합니다. 당신이 정말로 묻는 것이 명확하지 않습니다. – roman