[PYTHON] Implementieren Sie die Möglichkeit zu reservieren, was regelmäßig in der Django Todo-Liste passiert

・ Erstellen Sie Weihnachtsankündigungen zum Jahresende ・ Vorbereitung der Neujahrsbälle ・ Jahresabschluss erstellen ・ Zahlungsabwicklung ・ Entsorgung von nicht brennbaren Stoffen

Wir erstellen eine Funktion, mit der Sie Aufgaben erstellen können, indem Sie regelmäßig auftretende Aufgaben (jeden Tag, Mittwoch der zweiten Woche, XX Tage) als Plan registrieren und den Erstellungsprozess ausführen.

Jetzt habe ich eine Aufgabe erstellt, die ausgeführt werden kann, sobald sie im Master registriert ist. Der Hauptregistrierungsbildschirm scheint verschiedene Eingabesteuerungen zu benötigen, also habe ich ihn verschoben (lacht)

Die Modelle und Ansichten sehen so aus.

models.py


from django.db import models
from shisetsu.models import *
from accounts.models import *
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from django_currentuser.db.models import CurrentUserField
from django_currentuser.middleware import (
    get_current_user, get_current_authenticated_user)
from django.core.validators import MaxValueValidator, MinValueValidator

#Erstellen Sie ein ProxyModel,__str__()Überschreiben
class MyUser(User):
    def __str__(self):
           return '%s %s' % (self.last_name, self.first_name)

    class Meta:
        proxy = True

# Create your models here.
class TodoModel(models.Model):
    title = models.CharField(verbose_name='Titel', max_length=100,  null=True)
    memo = models.TextField(verbose_name='Inhalt', null=True)
    priority = models.CharField(
        verbose_name='Priorität',
        max_length=50,
        choices=(('danger','Hoch'),('warning','Während ~'),('Light','Niedrig')),
        )
    shisetsu_name = models.ForeignKey(Shisetsu, verbose_name='Einrichtung',on_delete=models.SET_NULL,blank=True, null=True)
    user = models.ForeignKey(MyUser, on_delete=models.CASCADE, verbose_name='Verantwortliche Person',blank=True, null=True)
    plants_startdate = models.DateField(verbose_name='Geplanter Starttermin', blank=True, null=True)
    plants_enddate = models.DateField(verbose_name='Voraussichtliches Enddatum', blank=True, null=True)
    enddate = models.DateField(verbose_name='Endtermin', blank=True, null=True)
    create_date = models.DateTimeField(verbose_name='Eingetragenes Datum', auto_now_add=True)
    create_user = CurrentUserField(verbose_name='Registrierte Person', editable=False, related_name='todo_create_articles')
    update_date = models.DateTimeField(verbose_name='Datum und Uhrzeit aktualisieren', auto_now=True)
    update_user = CurrentUserField(verbose_name='Wechsler', editable=False, related_name='todo_update_articles')
    def __str__(self):
        return self.title

class Todo_PlanModel(models.Model):
    title = models.CharField(verbose_name='Titel', max_length=100,  null=True)
    memo = models.TextField(verbose_name='Inhalt', null=True)
    priority = models.CharField(
        verbose_name='Priorität',
        max_length=50,
        choices=(('danger','Hoch'),('warning','Während ~'),('Light','Niedrig')),
        )
    shisetsu_name = models.ForeignKey(Shisetsu, verbose_name='Einrichtung',on_delete=models.SET_NULL,blank=True, null=True)
    user = models.ForeignKey(MyUser, on_delete=models.CASCADE, verbose_name='Verantwortliche Person',blank=True, null=True)
    hyoujijyun = models.IntegerField(verbose_name='Bestellung anzeigen',unique=True)
    cycle = models.CharField(
        verbose_name='Zeitraum',
        max_length=50,
        choices=(('daily','jeden Tag'),('everyweek','Wöchentlich'),('monthly','monatlich'),('day','Zeit'),('week','Wöchentlich')),
        )
    youbi = models.CharField(
        verbose_name='Tag',
        max_length=10,
        blank=True,
        null=True,
        choices=(
            ('0','Mond'),
            ('1','Feuer'),
            ('2','Wasser'),
            ('3','Holz'),
            ('4','Geld'),
            ('5','Boden'),
            ('6','Tag')
            ),
        )
    month = models.CharField(
        verbose_name='Mond',
        max_length=10,
        blank=True,
        null=True,
        choices=(
            ('1','Januar'),
            ('2','Februar'),
            ('3','März'),
            ('4','April'),
            ('5','Kann'),
            ('6','Juni'),
            ('7','Juli'),
            ('8','August'),
            ('9','September'),
            ('10','Oktober'),
            ('11','November'),
            ('12','Dezember')
            ),
        )
    week = models.IntegerField(verbose_name='Welche Woche', blank=True, null=True, validators=[MaxValueValidator(5), MinValueValidator(1)])
    day = models.IntegerField(verbose_name='Datum', blank=True, null=True, validators=[MaxValueValidator(31), MinValueValidator(1)])
    create_date = models.DateTimeField(verbose_name='Eingetragenes Datum', auto_now_add=True)
    create_user = CurrentUserField(verbose_name='Registrierte Person', editable=False, related_name='todo_plan_create_articles')
    update_date = models.DateTimeField(verbose_name='Datum und Uhrzeit aktualisieren', auto_now=True)
    update_user = CurrentUserField(verbose_name='Wechsler', editable=False, related_name='todo_plan_update_articles')
    
    def __str__(self):
        return self.title

views.py


def todoplancreatefunc(request):
    if request.method == 'GET':
        return render(request,'todo/todoplancreate.html')
    else:
        yearmonth = request.POST['yearmonth']
        year = int(yearmonth[0:4])
        month= int(yearmonth[5:7])
        lastday = calendar.monthrange(year, month)[1]

        #Verarbeiten Sie den eingestellten Betrag jeden Tag
        todo_plan = Todo_PlanModel.objects.filter(cycle="daily").order_by("hyoujijyun")
        for todoplan in todo_plan:
            for i in range(lastday):
                sakuseiday = datetime.date(year,month,i + 1)
                new_object = TodoModel(
                    title = todoplan.title,
                    memo = todoplan.memo,
                    priority = todoplan.priority,
                    shisetsu_name = todoplan.shisetsu_name,
                    user = todoplan.user,
                    plants_startdate = sakuseiday,
                    plants_enddate = sakuseiday,
                    )
                new_object.save()

        #Wöchentlich verarbeiten
        todo_plan = Todo_PlanModel.objects.filter(cycle="everyweek").order_by("hyoujijyun")
        for todoplan in todo_plan:
            for i in range(5):
                day = get_day_of_nth_dow(year, month, i + 1, int(todoplan.youbi))
                if day != None:
                    sakuseiday = datetime.date(year, month, day)
                    new_object = TodoModel(
                        title = todoplan.title,
                        memo = todoplan.memo,
                        priority = todoplan.priority,
                        shisetsu_name = todoplan.shisetsu_name,
                        user = todoplan.user,
                        plants_startdate = sakuseiday,
                        plants_enddate = sakuseiday,
                    )
                    new_object.save()

        #Monatlich verarbeiten
        todo_plan = Todo_PlanModel.objects.filter(cycle="monthly").order_by("hyoujijyun")
        for todoplan in todo_plan:
            #Holen Sie sich das Ende des Zielmonats
            lastday = calendar.monthrange(year, month)[1]
            #Ersetzen, wenn das angegebene Datum größer als das Monatsende ist
            if todoplan.day > lastday:
                day = lastday
            else:
                day = todoplan.day
            sakuseiday = datetime.date(year, month, day)
            new_object = TodoModel(
                title = todoplan.title,
                memo = todoplan.memo,
                priority = todoplan.priority,
                shisetsu_name = todoplan.shisetsu_name,
                user = todoplan.user,
                plants_startdate = sakuseiday,
                plants_enddate = sakuseiday,
                )
            new_object.save()

        #Prozessmonats- und Datumsspezifikation verarbeiten
        todo_plan = Todo_PlanModel.objects.filter(cycle="day").order_by("hyoujijyun")
        for todoplan in todo_plan:
            #Holen Sie sich das Ende des Zielmonats
            lastday = calendar.monthrange(year, int(todoplan.month))[1]
            #Ersetzen, wenn das angegebene Datum größer als das Monatsende ist
            if todoplan.day > lastday:
                day = lastday
            else:
                day = todoplan.day
            sakuseiday = datetime.date(year, int(todoplan.month), day)
            print(sakuseiday)
            new_object = TodoModel(
                title = todoplan.title,
                memo = todoplan.memo,
                priority = todoplan.priority,
                shisetsu_name = todoplan.shisetsu_name,
                user = todoplan.user,
                plants_startdate = sakuseiday,
                plants_enddate = sakuseiday,
                )
            new_object.save()

        #Woche angeben
        todo_plan = Todo_PlanModel.objects.filter(cycle="week").order_by("hyoujijyun")
        for todoplan in todo_plan:
            day = get_day_of_nth_dow(year, month, todoplan.week, int(todoplan.youbi))
            if day == None:
                day = lastday = calendar.monthrange(year, month)[1]
            sakuseiday = datetime.date(year, month, day)
            new_object = TodoModel(
                title = todoplan.title,
                memo = todoplan.memo,
                priority = todoplan.priority,
                shisetsu_name = todoplan.shisetsu_name,
                user = todoplan.user,
                plants_startdate = sakuseiday,
                plants_enddate = sakuseiday,
            )
            new_object.save()        


        messages = 'Die Verarbeitung ist beendet'

        context = {
            'messages': messages,
            }
        return render(request,'todo/todoplancreate.html', context)

Dies würde viel auf die Datenbank zugreifen, daher würde ich sie gerne verbessern, aber ich zögere ein wenig, das zu ändern, was funktioniert. Die Ursache ist, dass ich es geschafft habe, während ich beobachtete, wie die Verarbeitung nacheinander richtig funktionierte ... Zuallererst habe ich es mit dem Gefühl gemacht, dass jeder Tag funktionieren würde, also ist es das Ergebnis des Nachdenkens (lacht)

Zunächst denke ich, dass es ideal ist, das Formular, in dem alles aus der Plan-Tabelle abgerufen wird, in der richtigen Reihenfolge zu ändern, wenn möglich dem Objekt hinzuzufügen und es schließlich sofort zu speichern.

Registrieren Sie den Master.

image.png

Vor dem Erstellen einer wiederkehrenden Aufgabe

image.png

Ich habe alle Datensätze gelöscht, damit nichts mehr übrig ist

image.png

Führen Sie den Vorgang auf dem Erstellungsbildschirm aus

image.png

image.png

Die Aufgabe wurde am zweiten Donnerstag im November erstellt!

Recommended Posts

Implementieren Sie die Möglichkeit zu reservieren, was regelmäßig in der Django Todo-Liste passiert
So implementieren Sie Rails-Helfer-ähnliche Funktionen in Django
Geben Sie die Ansichts-URL in der Django-Vorlage an
So finden Sie das erste Element, das den Kriterien in der Python-Liste entspricht
Setzen Sie DateField des Formulars in Django auf type = date
[Python] So geben Sie Listenwerte der Reihe nach aus
Verfahren zum gleichzeitigen Ändern des Tabellennamens und des Spaltennamens des Django-Modells
Django Todo Listenerstellung
So schreiben Sie eine benutzerdefinierte Validierung in Django REST Framework
Legen Sie das Ausgabeformat vom Typ DateTime in der Django-Vorlage fest
So generieren Sie eine Abfrage mit dem IN-Operator in Django
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich kann mich mit Django 3 nicht auf der Admin-Seite anmelden
Was tun, wenn in Django "Ungültiger HTTP_HOST-Header" angezeigt wird?
Ich möchte den Wörterbuchtyp in der Liste eindeutig machen
Wie man in Django die angezeigte lange Zeichenkette in der Mitte abkürzt ....
Implementieren Sie eine Schaltfläche zum Hinzufügen eines Formulars im Django-Inline-Formularsatz
Das Problem, dass ich SameSite = None in chrome80 angeben musste, was machen alle Django-Benutzer?