2013-02-15 24 views
6

Czy istnieje sposób wstrzymania/wznowienia działającego przepływu pracy utworzonego za pomocą łańcuchów z selekcji 3.0?Django Seler Workflow Chain Pause/Resume

Zasadniczo mamy dwa różne rodzaje zadań w naszym systemie: interaktywne i nieinteraktywne. Te nieinteraktywne, dla których mamy wszystkie parametry, ale te interaktywne wymagają wkładu użytkownika. Zauważ, że w przypadku zadań interaktywnych możemy poprosić użytkownika o wprowadzenie danych tylko wtedy, gdy wszystkie poprzednie zadania w łańcuchu zostały zakończone, ponieważ ich wyniki wpłyną na zadania interaktywne (tj. Nie możemy poprosić o dane wejściowe użytkownika przed utworzeniem rzeczywistego łańcucha).

Wszelkie sugestie, jak się do tego podejść? Naprawdę ze stratą tutaj ..

Aktualne pomysłów:

  • Utwórz dwie podklasy zadań (z selera importu zadania). Dodaj zmienną dodatkowej instancji (członka klasy) do podklasy zadań interaktywnych, która jest domyślnie ustawiona na wartość false i oznacza, że ​​niektóre dane wejściowe użytkownika są nadal potrzebne. Jakoś mieć dostęp do instancji zadania i ustawić ją na wartość true spoza pracownika selera (Chociaż trochę tego sprawdziłem i nie ma możliwości dostępu do obiektów zadań bezpośrednio z innego modułu)
  • Podziel łańcuch na wiele łańcuchów rozdzielanych przez zadania interaktywne. Gdy jakiś łańcuch dotrze do końca, wykryje jakiś mechanizm znajdujący się poza robotnikiem selekcji i wywoła interaktywny komponent po stronie klienta interaktywnego zadania. Po wprowadzeniu przez użytkownika wszystkich tych danych, pobierz dane i uruchom nowy łańcuch, w którym zadanie interaktywne znajduje się na czele nowego łańcucha.

Odpowiedz

2

Wdrożyliśmy coś w rodzaju twojego drugiego pomysłu w naszym projekcie & działa dobrze. Oto sedno wdrożenia.

Dodaj nowe pole status do swojego modelu & zastąp metodę zapisu.

models.py:

class My_Model(models.Model): 
    # some fields 
    status = models.IntegerField(default=0) 

    def save(self, *args, **kwargs): 
     super(My_Model, self).save(*args, **kwargs) 
     from .functions import custom_func 
     custom_func(self.status) 

tasks.py

@celery.task() 
def non_interactive_task(): 
    #do something. 

@celery.task() 
def interactive_task(): 
    #do something. 

functions.py

def custom_func(status): 
    #Change status after non interactive task is completed. 
    #Based on status, start interactive task. 

Przełęcz status Zmienna do szablonu, która jest przydatna do wyświetlania elementu interfejsu użytkownika w celu wprowadzenia informacji. Gdy użytkownik wprowadzi wymagane informacje, zmień status. To wywołuje custom_func, co wyzwala Twój interactive_task.