[PYTHON] Implémenter la possibilité de réserver ce qui se passe régulièrement dans la liste Django Todo

・ 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.

image.png

Avant de créer une tâche récurrente

image.png

J'ai supprimé tous les enregistrements donc il ne reste plus rien

image.png

Exécutez le processus sur l'écran de création

image.png

image.png

La tâche a été créée le deuxième jeudi de novembre!

Recommended Posts

Implémenter la possibilité de réserver ce qui se passe régulièrement dans la liste Django Todo
Comment implémenter la fonctionnalité de type helper Rails dans Django
Spécifiez l'URL de la vue dans le modèle Django
Comment trouver le premier élément qui correspond aux critères de la liste Python
Définissez DateField du formulaire sur type = date dans Django
[Python] Comment afficher les valeurs de liste dans l'ordre
Procédure pour changer le nom de la table et le nom de la colonne du modèle Django en même temps
Créer une liste Django Todo
Comment écrire une validation personnalisée dans Django REST Framework
Définir le format de sortie du type DateTime dans le modèle Django
Comment générer une requête à l'aide de l'opérateur IN dans Django
Comment obtenir la dernière (dernière) valeur d'une liste en Python
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
Je n'arrive pas à me connecter à la page d'administration avec Django 3
Que faire lorsque "En-tête HTTP_HOST non valide" apparaît dans Django
Je veux rendre le type de dictionnaire dans la liste unique
Dans Django, comment abréger la longue chaîne de caractères affichée au milieu ...
Implémenter un bouton d'ajout de formulaire dans l'ensemble de formulaires en ligne Django
Le problème que j'ai dû spécifier SameSite = None dans chrome80, que font tous les utilisateurs de django?