・ 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.
Vor dem Erstellen einer wiederkehrenden Aufgabe
Ich habe alle Datensätze gelöscht, damit nichts mehr übrig ist
Führen Sie den Vorgang auf dem Erstellungsbildschirm aus
Die Aufgabe wurde am zweiten Donnerstag im November erstellt!
Recommended Posts