2015-02-26 15 views
6

SynopsisJak stworzyć proces Django ViewFlow programowo

Zajmuję się tworzeniem aplikacji internetowych, aby dowiedzieć się Django (Python 3.4 & Django 1.6.10). Aplikacja internetowa ma złożone i często aktualizowane przepływy pracy. Zdecydowałem się zintegrować bibliotekę Django-Viewflow (https://github.com/viewflow/viewflow/), ponieważ wydaje się, że jest to bardzo wygodny sposób obsługi przepływów pracy i nie uwzględnia logiki przepływu pracy w modelach aplikacji.

W tym przypadku utworzyłem przepływ pracy w celu gromadzenia informacji o autorze i prawach autorskich przy użyciu biblioteki Django-Viewflow. Przepływ pracy powinien być inicjowany za każdym razem, gdy autor jest dodawany do książki.

mój problem

Dokumentacja oferuje krok po kroku wytycznych do zintegrować end-to-end rozwiązania worklfow (frontend i backend). Mój problem polega na tym, że mam trudności z programową kontrolą przepływu pracy (w szczególności z modelu Book).

Opis aplikacji

Mam modelu Book (model Core) z wiele do wielu relacji autorów.

myApp/models.py

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    authors = models.ManyToManyField(Author) 
    publisher = models.ForeignKey(Publisher) 
    publication_date = models.DateField() 

Składniki cykl pracy są:

myFlow/models.py

from viewflow.models import Process 

class AuthorInvitation(process)  
    consent_confirmed = models.BooleanField(default=False) 
    signature = models.CharField(max_length=150) 

myFlow/flows.py

from viewflow import flow 
from viewflow.base import this, Flow 
from viewflow.contrib import celery 
from viewflow.views import StartProcessView, ProcessView 
from . import models, tasks 

class AuthorInvitationFlow(Flow): 
    process_cls = models.AuthorInvitation 

    start = flow.Start(StartProcessView) \ 
     .Permission(auto_create=True) \ 
     .Next(this.notify) 

    notify = celery.Job(tasks.send_authorship_request) \ 
     .Next(this.approve) 

    approve = flow.View(ProcessView, fields=["confirmed","signature"]) \ 
     .Permission(auto_create=True) \ 
     .Next(this.check_approve) 

    check_approve = flow.If(cond=lambda p: p.confirmed) \ 
     .OnTrue(this.send) \ 
     .OnFalse(this.end) 

    send = celery.Job(tasks.send_authorship) \ 
     .Next(this.end) 

    end = flow.End() 

Pytanie

Jak można kontrolować proces przepływu pracy programowo (aktywować potwierdzają czynności, powtórzyć kroki anulować proces ....)? Próbowałem zagłębić się w kod biblioteki. Wygląda na to, że class activate zawiera właściwą metodę, ale nie ma pewności, jak należy zaaranżować całość.

Z góry dziękuję!

Odpowiedz

7

Istnieją dwa Wbudowany Zadania dodatkowe: Start dostępne dla przepływów

StartFunction - zaczyna płynąć, gdy funkcja nazywa się gdzieś:

@flow_start_func 
def create_flow(activation, **kwargs): 
    activation.prepare() 
    activation.done() 
    return activation 

class FunctionFlow(Flow): 
    start = flow.StartFunction(create_flow) \ 
     .Next(this.end) 

# somewhere in the code 
FunctionFlow.start.run(**some_kwargs) 

StartSignal - zaczyna płynąć na Django sygnał otrzymują:

class SignalFlow(Flow): 
    start = flow.StartSignal(some_signal, create_flow) \  
     .Next(this.end) 

Możesz sprawdzić ich wykorzystanie i resztę wbudowanego zadania w this viewflow test suite.

Aby ręcznie przetworzyć stan zadania, najpierw należy pobrać zadanie z bazy danych, aktywować je i wywołać dowolną metodę aktywacji.

task = MyFlow.task_cls.objects.get(...) 
activation = task.activate() 
if activation.undo.can_proceed(): 
    activation.undo() 

Każde przejście aktywacja mieć .can_proceed() metody, pozwala sprawdzić, jest zadaniem w stanie, który umożliwia przejście.

+0

Łącze github daje 404, FWIW –

+1

AttributeError: Obiekt "StartFunction" nie ma atrybutu "przygotować" –

+1

Tak, w najnowszej wersji @flow_start_func wymagane jest dodatkowo dekorator. – kmmbvnr