2017-12-06 12 views
3

Grundsätzlich habe ich eine Aufgabe, Rechnung zu generieren. Also habe ich eine Funktion generate_invoice() in meiner tasks.py Datei erstellt.Wie Sie Sellerie periodische Aufgabe an jedem Ende des Monats ausführen

Jetzt verwende ich @periodic_task, um die Funktion aufzurufen. Aber ich brauche meine Aufgabe nur am letzten Tag des Monats zu laufen um 23:55 Uhr - 23:57 Uhr.

Ich bin den letzten Tag des Monats mit dieser Funktion bekommen:

def get_last_date(): 
     today = timezone.now() 
     year = today.year 
     month = today.month 
     last_date = calendar.monthrange(year, month)[1] 
     return str(last_date) 

Mein Code für Aufgabe wie folgt aussieht:

@periodic_task(run_every=(crontab(day_of_month=get_last_date())), name="invoice_simulation", ignore_result=True) 
def invoice_simulation(): 
    generate_invoice() 

Aber das funktioniert nicht!

Oder gibt es eine bessere Möglichkeit, diese Funktion zu implementieren, dann schlagen Sie bitte vor.

+1

Wie ich diese Aufgabe gemacht habe: Erhalten Sie den ersten Tag des nächsten Monats (00.01 Uhr), konvertieren in dt obj und subtrahieren Sie 5 Minuten. Ich glaube nicht, dass es einen leichten "Lauf alle" gibt, da das relativ zum Monat ist. Wenn Sie "laufen" kann dies funktionieren. Mein Exp ist nicht in Sellerie, da ich meine eigenen Wrapper und Cron-Aufgaben im Allgemeinen von Grund auf geschrieben habe, so dass diese Lösung nicht sauber konvertieren kann. Wir hatten genau das gleiche Problem in einem Start-up und dieser Ansatz hat gut funktioniert. –

Antwort

1

Eine einfachere Lösung wäre es, den Zeitplan jeden Tag um 23:55 Uhr auszuführen und die Aufgabe zu überprüfen, wenn heute der letzte Tag des Monats ist. Wenn ja, generieren Sie die Rechnung. Wenn nicht, dann tu einfach nichts.

Etwas wie:

@periodic_task(run_every=(crontab(hour=23, minute=55)), name="invoice_simulation", ignore_result=True) 
def invoice_simulation(): 
    if timezone.now().day == get_last_date(): 
     generate_invoice() 

nur sicherstellen, dass timezone und crontab einander nicht widersprechen. Beide müssen entweder TZ-bewusst (oder in UTC) sein oder für beide eine naive Zeit verwenden.

+0

zum Testen zurückkehrt, habe ich '' 'crontab gegeben (Stunde = 1, Minute = 22) '' 'so, dass es jetzt läuft und ich kann sehen, aber es ist nicht um diese Zeit ausgeführt. –

+1

Es funktioniert. Es dauert tz UTC. Danke .. :) –

+0

@ ShubhamSrivastava Gern geschehen. Könnten Sie es als eine Antwort markieren, wenn es Ihre Frage löst? Danke^_ ^ – oxalorg

0

Aktualisieren Sie Ihre Funktion get_last_date() wie folgt.

def get_last_date(): 
    today = datetime.date.today() 
    year = today.year 
    month = today.month 
    last_date = calendar.monthrange(year, month) 
    return str(last_date) 
+0

Wurffehler: '' 'ValueError: Ungültiges Wochentagsliteral '(4'''', wenn dieser Wert zu' '' @ periodic_tasks''' –

Verwandte Themen