Projet

Général

Profil

Development #29337

calculs sur les dates dans les gabarits Django

Ajouté par Thomas Noël il y a plus de 5 ans. Mis à jour il y a environ 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
24 décembre 2018
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Ajouter des filtres tels que add/sub/mul/div pour faire des calculs, par exemple 5:add:3 renvoie 8.

Un objectif important est d'obtenir le fonctionnement sur les dates, form_var_x|add:4 ajouterait 4 jours.


Fichiers


Demandes liées

Lié à w.c.s. - Development #57982: Ajouter les filtres add_months et add_years Nouveau19 octobre 2021

Actions

Révisions associées

Révision 853c0e8e (diff)
Ajouté par Thomas Noël il y a environ 5 ans

templatetags: add add_days and add_hours filters (#29337)

Historique

#1

Mis à jour par Thomas Noël il y a plus de 5 ans

Ci-joint un patch dont je ne suis pas pleinement satisfait. Je voulais être un peu magique et permettre que « form_var_date|add:2 » renvoie bien la date + 2 jours. L'usage bien sur est pour une comparaison, de type « form_var_date|add:2 < now ». Mais pépin : Python ne compare pas date et datetime, il faut donc caster pour être sûr de son coup, genre « form_var_date|add:2 < now|datetime » et l'affaire devient vite incompréhensible au néophyte (voir la fin des tests) et également à l'expert qui ne se souviendra par toujours de ce que fait la magie...

Et donc, je suis sur le point de revoir ce patch, supprimer la partie "guess_date", et donc imposer les cast lors des comparaisons de date, qui devront être explicites comme « form_var_date|date|add:2 < now|date » ou « form_var_dateheure|datetime|add:"36h" < now|datetime » (ça semble plus lourd, mais ça ne me semble pas inexplicable).

Je veux bien un petit avis sur le sujet, avant de continuer à creuser, au cas où une bonne idée m'échapperait.

#2

Mis à jour par Thomas Noël il y a plus de 5 ans

Une version avec moins de magie, qui impose de convertir les valeurs en date ou datetime avant de pouvoir y faire un add. On se retrouve ainsi à avoir systématiquement form_var_x|date|add:"2" ou form_var_x|datetime|add:"30m". A cet instant de ma reflexion, peut-être laisser add pour les nombres seulement, et créer des filtres date_add et datetime_add spécialisés.

#3

Mis à jour par Pierre Cros il y a plus de 5 ans

Quand j'essaie de lister mes usages principaux (quasi exclusifs en fait), ça donne :

  • Envoyer un mail x jours avant une date donnée (date de rendez-vous)
  • Comparer deux dates
  • Ajouter/soustraire des jours à une date

Et du coup c'est ça qui devrait être simple/magique. Alors je mets ce que je trouve simple comme syntaxe pour ces 3 exemples, sans présager de la faisabilité (parce que j'ai conscience de mon ignorance).

* form_var_date_envoi == form_var_date_rendez_vous|sub:2
* form_var_date1 == form_var_date2 ou form_var_date1 > form_var_date2
* form_var_date == form_var_date|add:10

Et encore plus simple et sans doute encore moins possible, se serait un filtre unique calc ou calc_date, me permettant de faire |calc_date:"+1" ou |calc_date:"-2"

#4

Mis à jour par Thomas Noël il y a plus de 5 ans

Pierre Cros a écrit :

  • form_var_date_envoi form_var_date_rendez_vous|sub:2
  • form_var_date1 form_var_date2 ou form_var_date1 > form_var_date2
  • form_var_date == form_var_date|add:10

Malheureusement les dates sont stockées sous forme de chaîne de caractères dont le format n'est pas connu, voire d'autres formats, et ça peut être "21/12/2017" ou "2017-12-21" ou "2017-12-21 10:30"... du coup impossible de faire des comparaisons ou des traitements. Il faut passer par de la conversion en objet de type "date", et donc ça donnerait :

* form_var_date_envoi|date == form_var_date_rendez_vous|date|sub:2
* form_var_date1|date == form_var_date2|date ou form_var_date1|date > form_var_date2|date
* form_var_date|date == form_var_date|date|add:10

Ce qui me semble presque explicable, j'imagine quelque chose dans la doc comme : « Quand vous devez comparer des dates ou faire des calculs sur les dates, vous devez d'abord convertir les données en "objet date". Pour cela, après le nom de la variable, ajoutez le filtre "|date". » Et avec des exemples ensuite.

Par ailleurs dans le patch ci-dessus, add permet d'ajouter des minutes ou des heures à des objets de type "datetime", plus précis que la date. Par exemple pour envoyer un mail 24h avant un rendez-vous : « form_var_rdv|datetime|sub:"24h" » qui sera à comparer avec « now|datetime ».

#5

Mis à jour par Frédéric Péters il y a plus de 5 ans

En vrac, dans différentes directions,

  • si les types doivent être explicites, il faut que la notion soit acceptée/assimilée, pour ensuite être bien exposée dans la documentation;
  • si le seul truc qui empêche de commencer l'opération add par un parse_date est l'argument form_var_date|add:2 < now, non comparaison date/datetime, je dirais que ça se joue là en deux parties : 1/ la date c'est "today", pas "now", 2/ peut-on exploiter LazyFieldVarDate, pour se donner de la marge sur les opérateurs ?
  • perso je trouverais plus simple d'avoir add_years/add_days/add_minutes que add: + quantité et unité, plus simple d'expliquer qu'à une date tu peux ajouter des années (add_years), des jours (add_days), des minutes (add_minutes), que d'avoir un gros pavé décrivant tout ce qui peut être tapé dans "add", avec des risques d'explications impossibles parce que "magie".
    • ça permet aussi d'avoir des enchainemente, façon form_date_plop|add_days:2|add_minutes:60, alors que si on part sur un add magique, je crains qu'on tende vers form_var_plop|add:"2d60m".
#6

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Sujet changé de calculs dans les gabartis Django, notamment pour les dates à calculs dans les gabaris Django, notamment pour les dates
#7

Mis à jour par Pierre Cros il y a plus de 5 ans

J'ai édité mon message parce que les

==
avaient été bouffés.

Pour moi l'ajout d'heures ou de minutes c'est un truc tout à fait accessoire, je ne l'ai jamais utilisé. Alors ça ne me gênerait pas que ça reste compliqué (pour les gens qui aiment bien se compliquer la vie pour rien), tandis que les opérations sur les jours resteraient simples.

#8

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

Je trouve que spécifier l'unité dans add me semble plus clair (et ça évite un cast explicite que les gens oublieront), je met mon +1 sur |add_day(s):x.

#9

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Sujet changé de calculs dans les gabarits Django, notamment pour les dates à calculs dans les gabarits Django (uniquement les dates ici)

Dans ce qui est noté aujourd'hui sur https://doc-publik.entrouvert.com/admin-fonctionnel/parametrage-avance/expressions/ :

|days va permettre de soustraire ou d'ajouter des jours à une date. (...) form_var_date|parse_date|days:-2 >= today|parse_date

Ici, si je lis bien, on va arriver à faire form_var_date|add_days:-2 >= today ; correct ?

(penser à ajouter des tests de comparaison dans le commit)

#10

Mis à jour par Thomas Noël il y a plus de 5 ans

Frédéric Péters a écrit :

Dans ce qui est noté aujourd'hui sur https://doc-publik.entrouvert.com/admin-fonctionnel/parametrage-avance/expressions/ :

|days va permettre de soustraire ou d'ajouter des jours à une date. (...) form_var_date|parse_date|days:-2 >= today|parse_date

Ici, si je lis bien, on va arriver à faire form_var_date|add_days:-2 >= today ; correct ?

Oui, ce que je propose dans la branche http://git.entrouvert.org/wcs.git?h=wip/29406-lazy-date-system dont j'extrais le patch ici. Il ajoute juste add_days et add_hours, disons que c'est une phase 1 de l'affaire. Et ça permet :

form_var_date|add_days:-2 >= today
form_var_date|add_days:form_option_delai >= today
form_var_date >= today|add_days:2
form_var_date >= form_var_autredate

J'ai ajouté des tests sur ça, et d'autres.

#11

Mis à jour par Frédéric Péters il y a plus de 5 ans

À relire, l'import de copy est inutile.

#12

Mis à jour par Frédéric Péters il y a environ 5 ans

  • Statut changé de Solution proposée à Solution validée
#13

Mis à jour par Thomas Noël il y a environ 5 ans

  • Statut changé de Solution validée à Résolu (à déployer)

Après suppression de l'import inutile de copy

commit 853c0e8e2b6365e8560ee0576be7c6066d15e668
Author: Thomas NOEL <tnoel@entrouvert.com>
Date:   Fri Jan 18 09:21:09 2019 +0100

    templatetags: add add_days and add_hours filters (#29337)

#14

Mis à jour par Frédéric Péters il y a environ 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée
#15

Mis à jour par Mikaël Ates (de retour le 29 avril) il y a plus de 2 ans

Formats disponibles : Atom PDF