・ Créez des annonces de Noël à la fin de l'année ・ Préparation des bals du nouvel an ・ Création d'états financiers ・ Traitement des paiements ・ Élimination des incombustibles
Nous créons une fonction qui vous permet de créer des tâches en enregistrant les tâches qui se produisent régulièrement (tous les jours, mercredi de la deuxième semaine, XX jours) en tant que plan et en exécutant le processus de création.
Maintenant, j'ai créé une tâche qui peut être effectuée une fois qu'elle est enregistrée dans le maître. L'écran d'enregistrement principal semble avoir besoin de diverses commandes d'entrée, alors je l'ai désactivé (rires)
Les modèles et les vues ressemblent à ceci.
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
#Créez un ProxyModel,__str__()Passer outre
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='Titre', max_length=100, null=True)
memo = models.TextField(verbose_name='Contenu', null=True)
priority = models.CharField(
verbose_name='priorité',
max_length=50,
choices=(('danger','Haute'),('warning','Pendant ~'),('Light','Faible')),
)
shisetsu_name = models.ForeignKey(Shisetsu, verbose_name='Établissement',on_delete=models.SET_NULL,blank=True, null=True)
user = models.ForeignKey(MyUser, on_delete=models.CASCADE, verbose_name='Personne en charge',blank=True, null=True)
plants_startdate = models.DateField(verbose_name='Date de début prévue', blank=True, null=True)
plants_enddate = models.DateField(verbose_name='Date de fin prévue', blank=True, null=True)
enddate = models.DateField(verbose_name='Date de fin', blank=True, null=True)
create_date = models.DateTimeField(verbose_name='Date d'enregistrement', auto_now_add=True)
create_user = CurrentUserField(verbose_name='Personne inscrite', editable=False, related_name='todo_create_articles')
update_date = models.DateTimeField(verbose_name='Mettre à jour la date et l'heure', auto_now=True)
update_user = CurrentUserField(verbose_name='changeur', editable=False, related_name='todo_update_articles')
def __str__(self):
return self.title
class Todo_PlanModel(models.Model):
title = models.CharField(verbose_name='Titre', max_length=100, null=True)
memo = models.TextField(verbose_name='Contenu', null=True)
priority = models.CharField(
verbose_name='priorité',
max_length=50,
choices=(('danger','Haute'),('warning','Pendant ~'),('Light','Faible')),
)
shisetsu_name = models.ForeignKey(Shisetsu, verbose_name='Établissement',on_delete=models.SET_NULL,blank=True, null=True)
user = models.ForeignKey(MyUser, on_delete=models.CASCADE, verbose_name='Personne en charge',blank=True, null=True)
hyoujijyun = models.IntegerField(verbose_name='Ordre d'affichage',unique=True)
cycle = models.CharField(
verbose_name='période',
max_length=50,
choices=(('daily','tous les jours'),('everyweek','Hebdomadaire'),('monthly','mensuel'),('day','temps'),('week','Hebdomadaire')),
)
youbi = models.CharField(
verbose_name='journée',
max_length=10,
blank=True,
null=True,
choices=(
('0','Mois'),
('1','Feu'),
('2','eau'),
('3','bois'),
('4','Argent'),
('5','sol'),
('6','journée')
),
)
month = models.CharField(
verbose_name='Mois',
max_length=10,
blank=True,
null=True,
choices=(
('1','janvier'),
('2','février'),
('3','Mars'),
('4','avril'),
('5','Peut'),
('6','juin'),
('7','juillet'),
('8','août'),
('9','septembre'),
('10','octobre'),
('11','novembre'),
('12','décembre')
),
)
week = models.IntegerField(verbose_name='Quelle semaine', blank=True, null=True, validators=[MaxValueValidator(5), MinValueValidator(1)])
day = models.IntegerField(verbose_name='Date', blank=True, null=True, validators=[MaxValueValidator(31), MinValueValidator(1)])
create_date = models.DateTimeField(verbose_name='Date d'enregistrement', auto_now_add=True)
create_user = CurrentUserField(verbose_name='Personne inscrite', editable=False, related_name='todo_plan_create_articles')
update_date = models.DateTimeField(verbose_name='Mettre à jour la date et l'heure', auto_now=True)
update_user = CurrentUserField(verbose_name='changeur', 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]
#Traitez le montant défini chaque jour
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()
#Traiter chaque semaine
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()
#Traiter mensuellement
todo_plan = Todo_PlanModel.objects.filter(cycle="monthly").order_by("hyoujijyun")
for todoplan in todo_plan:
#Obtenez la fin du mois cible
lastday = calendar.monthrange(year, month)[1]
#Remplacer si la date spécifiée est postérieure à la fin du mois
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()
#Spécification du mois et de la date du processus
todo_plan = Todo_PlanModel.objects.filter(cycle="day").order_by("hyoujijyun")
for todoplan in todo_plan:
#Obtenez la fin du mois cible
lastday = calendar.monthrange(year, int(todoplan.month))[1]
#Remplacer si la date spécifiée est postérieure à la fin du mois
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()
#Spécifiez la semaine
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 = 'Le traitement est terminé'
context = {
'messages': messages,
}
return render(request,'todo/todoplancreate.html', context)
Cela permettrait d'accéder beaucoup à la base de données, donc j'aimerais l'améliorer, mais je suis un peu réticent à modifier ce qui fonctionne. La cause est que je l'ai fait en regardant le traitement fonctionner correctement un par un ... Tout d'abord, je l'ai fait avec le sentiment que chaque jour marcherait, donc c'est le résultat d'une réflexion un par un (rires)
Tout d'abord, je pense qu'il est idéal de changer le formulaire qui récupère tout de la table Plan dans l'ordre, de l'ajouter à l'objet si possible, et enfin de l'enregistrer immédiatement.
Enregistrez le maître.
Avant de créer une tâche récurrente
J'ai supprimé tous les enregistrements donc il ne reste plus rien
Exécutez le processus sur l'écran de création
La tâche a été créée le deuxième jeudi de novembre!
Recommended Posts