Development #18904
Jours fériés automatiques (poser systématiquement des exceptions aux récurrences dans les agendas de nos utilisateurs)
0%
Description
Potentielle évolution future : définir des exceptions qui seraient automatiquement impactées dans les agendas de toutes les instances, ceci pour exclure systématiquement les jours fériés.
Devrait être un choix possible instance par instance (nos amis les belges n'ont pas les mêmes jours fériés), voir agenda par agenda.
Fichiers
Demandes liées
Révisions associées
manager: change semantics of exceptions sources management (#18904)
agendas: add external flag on exception (#18904)
misc: add workalendar translations (#18904)
Historique
Mis à jour par Brice Mallet il y a plus de 6 ans
- Lié à Development #12550: exception aux récurrences ajouté
Mis à jour par Frédéric Péters il y a plus de 6 ans
- Sujet changé de Poser systématiquement des exceptions aux récurrences dans les agendas de nos utiisateurs à Exceptions "globales" (poser systématiquement des exceptions aux récurrences dans les agendas de nos utiisateurs)
Mis à jour par Brice Mallet il y a plus de 6 ans
- Sujet changé de Exceptions "globales" (poser systématiquement des exceptions aux récurrences dans les agendas de nos utiisateurs) à Exceptions "globales" (poser systématiquement des exceptions aux récurrences dans les agendas de nos utilisateurs)
- Description mis à jour (diff)
Mis à jour par Frédéric Péters il y a environ 4 ans
- Sujet changé de Exceptions "globales" (poser systématiquement des exceptions aux récurrences dans les agendas de nos utilisateurs) à Jours fériés automatiques (poser systématiquement des exceptions aux récurrences dans les agendas de nos utilisateurs)
(je reprends dans ce commentaire une description actualisée et plus technique)
Par défaut un agenda (en fait un guichet) pourrait avoir une source d'exceptions correspondant aux jours fériés légaux, dans la fenêtre des exceptions on aurait ainsi :
* Congés légaux [×] (<- une source automatique de jours fériés) * CongesDepartements.ics [×] (<- un fichier uploadé) (il pourrait y en avoir plusieurs) * https://.../whatever.ics [×] (<- une url vers un .ics) (pareil) --- Pour ajouter de nouvelles exceptions... Fichier [browse] URL : [......]
Les congés légaux seraient alimentés par exemple via workalendar, avec sans doute le calendrier à utiliser tiré de settings (ou on pourrait genre HOLIDAYS = 'workalendar.europe.FranceAlsaceMoselle').
Je me dis que la × permettrait juste de désactiver, pas de supprimer pour de vrai.
Par rapport à workalendar, petite question sur les libellés des congés, en regardant vite fait ça serait côté chrono à gérer des traductions.
Mis à jour par Valentin Deniaud il y a environ 4 ans
- Assigné à mis à Valentin Deniaud
La partie charger les données de workalendar en base de donnée est très floue dans ma tête (qu'est-ce qu'on fait au moment d'un changement du setting ?) mais je devrais trouver des trucs.
Mis à jour par Valentin Deniaud il y a environ 4 ans
- Fichier 0001-agendas-add-global-exceptions-sources-18904.patch 0001-agendas-add-global-exceptions-sources-18904.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
- Tous les nouveaux guichets auront désormais les jours fériés ajoutés automatiquement, on ne touche pas aux guichets déjà créés.
- Le rendu est le même qu'avec les jours fériés ajoutés depuis le fichier ICS classique.
- Une différence, ne sont ajoutés que les jours fériés à n+3 années (choix arbitraire), pas n+10. Il y a une commande à faire tourner qui met à jour les exceptions des guichets déjà créés (la faire tourner une fois par an = garantir les jours fériés jusqu'à au moins l'année n+2 à tout le monde¹).
- J'ai repris l'idée du setting, en un peu plus flexible au cas où on ait envie un jour d'utiliser autre chose que workalendar en parallèle.
- C'est un dictionnaire
{slug: (ClasseCalendrier, nom)}
(avec une astuce bizare pour traduire le nom). - Changer
ClasseCalendrier
et lancer la commande de mise à jour -> les exceptions sont mises à jour partout. - Changer
slug
-> les exceptions sont supprimées, les nouvelles ne seront ajoutées que dans les nouveaux guichets.
- C'est un dictionnaire
Je me dis que la × permettrait juste de désactiver, pas de supprimer pour de vrai.
Et pour la réactivation, je tente un truc avec un bouton œil, je trouve que ça passe comme c'est le seul affiché, mais sûrement qu'il y a mieux.
Par rapport à workalendar, petite question sur les libellés des congés, en regardant vite fait ça serait côté chrono à gérer des traductions.
En fouillant il y a du boulot qui a été commencé récemment mais il va falloir les prendre à notre charge en attendant, je crois.
¹ Et intégrer d'éventuelles modification au calendrier des jours fériés, par exemple quand une réforme arrivera à faire bosser ces fainéants de gaulois le premier mai.
Mis à jour par Valentin Deniaud il y a environ 4 ans
- Fichier 0002-manager-change-semantics-of-exceptions-sources-manag.patch 0002-manager-change-semantics-of-exceptions-sources-manag.patch ajouté
- Fichier 0001-agendas-add-global-exceptions-sources-18904.patch 0001-agendas-add-global-exceptions-sources-18904.patch ajouté
Voilà, avec les tests.
Comme j'utilise ce qui était une vue d'upload pour autre chose, je modifie un peu la sémantique et notamment l'icône dans un second patch, pour ne pas compliquer la lecture du premier.
Mis à jour par Lauréline Guérin il y a environ 4 ans
def delete(self, *args, **kwargs):
if self.settings_slug is not None:
self.disable()
return 0, {}
return super().delete(*args, **kwargs)
Je suis pas super fan de la méthode delete
qui ne fait pas un delete dans certains cas; je préfèrerais que ce soit plus explicite: on appelle la méthode disable
dans la vue delete
, ou on ajoute carrément une vue disable
qui fait ce qu'elle annonce: elle disable :) (on peut aussi avoir une vue toggle qui enable/disable en fonction de l'état de la ressource)
Autre remarque: la vue TimePeriodExceptionSourceEnableView
doit vérifier que:
- la ressource est bien du type qui permet un enable (même si c'est vérifié dans la méthode enable
, ceinture et bretelles) (raise 404 si c'est pas le cas)
- éventuellement que la ressource est bien disabled (elle est dans le bon état)
Mis à jour par Valentin Deniaud il y a environ 4 ans
- Fichier 0002-manager-change-semantics-of-exceptions-sources-manag.patch 0002-manager-change-semantics-of-exceptions-sources-manag.patch ajouté
- Fichier 0001-agendas-add-global-exceptions-sources-18904.patch 0001-agendas-add-global-exceptions-sources-18904.patch ajouté
J'aime bien l'idée de la vue toggle, c'est également plus clair niveau UI.
Mis à jour par Lauréline Guérin il y a environ 4 ans
j'ai une juste mini remarque:
_(
'Exception source %(source)s has been %(status)s on desk %(desk)s.'
% {
'source': source,
'status': 'enabled' if source.enabled else 'disabled',
'desk': source.desk,
}
),
Je crois qu'il vaut mieux faire 2 messages distincts, pour le bien-être des traducteurs
Sinon ça me semble OK, je laisse une autre personne valider :)
Mis à jour par Valentin Deniaud il y a environ 4 ans
- Fichier 0002-manager-change-semantics-of-exceptions-sources-manag.patch 0002-manager-change-semantics-of-exceptions-sources-manag.patch ajouté
- Fichier 0001-agendas-add-global-exceptions-sources-18904.patch 0001-agendas-add-global-exceptions-sources-18904.patch ajouté
J'ai fait la modif.
Une interrogation m'est venue de mon côté, la vue toggle fait quand même pas mal d'opérations en db, est-ce qu'un GET suffit vraiment ou un POST serait préférable ?
Mis à jour par Frédéric Péters il y a environ 4 ans
Enfin à tester, c'est curieux de ne pas avoir la ligne dans la popup pour les agendas existants.
Pas fan de l'icône "switch" (notamment parce qu'on ne s'attend du coup pas à une fermeture de la popup), je me dis qu'un libellé expliciter (activer) / (désactiver) serait plus clair.
Une interrogation m'est venue de mon côté, la vue toggle fait quand même pas mal d'opérations en db, est-ce qu'un GET suffit vraiment ou un POST serait préférable ?
Pas choqué par ça.
(il y a rebase avec déplacement de la migration à faire)
Mis à jour par Valentin Deniaud il y a environ 4 ans
Frédéric Péters a écrit :
Enfin à tester, c'est curieux de ne pas avoir la ligne dans la popup pour les agendas existants.
Pas faux, donc carrément un truc du genre
--- a/chrono/agendas/management/commands/sync_desks_timeperiod_exceptions_from_settings.py +++ b/chrono/agendas/management/commands/sync_desks_timeperiod_exceptions_from_settings.py @@ -18,3 +18,3 @@ from django.core.management.base import BaseCommand -from chrono.agendas.models import TimePeriodExceptionSource +from chrono.agendas.models import Desk @@ -25,3 +25,3 @@ class Command(BaseCommand): def handle(self, **options): - for source in TimePeriodExceptionSource.objects.filter(settings_slug__isnull=False): - source.desk.import_timeperiod_exceptions_from_settings() + for desk in Desk.objects.all(): + desk.import_timeperiod_exceptions_from_settings()
À faire tourner manuellement une fois ? (par exemple dans la foulée de l'ajout du cron qui va devoir l'appeler ~tous les ans)
Mis à jour par Valentin Deniaud il y a environ 4 ans
Frédéric Péters a écrit :
Pas fan de l'icône "switch" (notamment parce qu'on ne s'attend du coup pas à une fermeture de la popup), je me dis qu'un libellé expliciter (activer) / (désactiver) serait plus clair.
Et aussi, quelle classe je peux mettre au <a> pour avoir un rendu propre ? (« (activer) » en lieu et place de l'icône et pas une ligne en dessous)
Mis à jour par Frédéric Péters il y a environ 4 ans
Et aussi, quelle classe je peux mettre au <a> pour avoir un rendu propre ? (« (activer) » en lieu et place de l'icône et pas une ligne en dessous)
Je viens de créer #41192 pour te donner une classe link-action-text.
→ <li><a href="...">plop</a> <a class="link-action-text" href="...">activer</a></li>
Mis à jour par Valentin Deniaud il y a environ 4 ans
- Fichier 0002-manager-change-semantics-of-exceptions-sources-manag.patch 0002-manager-change-semantics-of-exceptions-sources-manag.patch ajouté
- Fichier 0001-agendas-add-global-exceptions-sources-18904.patch 0001-agendas-add-global-exceptions-sources-18904.patch ajouté
Rebasé.
J'ai ajouté la nouvelle classe pour le lien (et ça ne rend pas très joli mais tu diras), et la modif de la commande plus haut. Et puis l'ajout d'un cron sous debian/cron, sans être sûr de rien.
En plus de ça, je me suis aperçu qu'il était toujours permis de supprimer ces exceptions individuellement, ce qui je pense est une bonne chose (le lundi de Pentecôte, tout ça). Mais du coup, la commande de mise à jour ne doit pas toucher aux exceptions déjà là, juste en ajouter de nouvelles.
Et du coup, changer la classe dans les settings n'a plus l'effet escompté, c'est à dire changer mettre à jour les exceptions, donc la commande gagne un --force-update pour ce cas d'usage.
Réflexion bonus, on se retrouve quand même à dupliquer toujours les mêmes données, une trentaine d'exceptions dans le cas des jours fériés, une fois par guichet. On pourrait éviter ça en modifiant le modèle TimePeriodException, en passant ForeignKey à ManyToMany, etc... Mais je ne vais pas me lancer là dedans sans confirmation que c'est une vraiment utile.
Mis à jour par Valentin Deniaud il y a environ 4 ans
Reste à décider ce qu'on fait pour les traductions, il y a une PR quasi finie, avec les chaînes fr, qui a bougé pour la dernière fois il y deux semaines ici https://github.com/peopledoc/workalendar/pull/466. Les .po se copient collent probablement, en attendant le merge/release.
Mis à jour par Frédéric Péters il y a environ 4 ans
En plus de ça, je me suis aperçu qu'il était toujours permis de supprimer ces exceptions individuellement, ce qui je pense est une bonne chose (le lundi de Pentecôte, tout ça). Mais du coup, la commande de mise à jour ne doit pas toucher aux exceptions déjà là, juste en ajouter de nouvelles.
Je me dis que plutôt non on ne devrait pas permettre la suppression d'exceptions importées depuis des sources externes; mais si on veut le permettre, ça passerait alors par un flag posé sur l'exception, la marquant "supprimée", plutôt qu'une vraie suppression.
Et je pense que ce ticket pourrait se limiter à ne pas le permettre, et qu'un ticket ultérieur apporterait la possibilité de "supprimer".
Reste à décider ce qu'on fait pour les traductions, il y a une PR quasi finie [...]
Ok, là-dessus à réfléchir je serais pour merger mais avec EXCEPTIONS_SOURCES vide tant qu'il n'y a pas les traductions upstream; ça évite les rebase successifs, pénibles avec des traductions, et ça n'expose pas de bouts pas traduits.
Mis à jour par Valentin Deniaud il y a environ 4 ans
Frédéric Péters a écrit :
En plus de ça, je me suis aperçu qu'il était toujours permis de supprimer ces exceptions individuellement, ce qui je pense est une bonne chose (le lundi de Pentecôte, tout ça). Mais du coup, la commande de mise à jour ne doit pas toucher aux exceptions déjà là, juste en ajouter de nouvelles.
Je me dis que plutôt non on ne devrait pas permettre la suppression d'exceptions importées depuis des sources externes; mais si on veut le permettre, ça passerait alors par un flag posé sur l'exception, la marquant "supprimée", plutôt qu'une vraie suppression.
Et je pense que ce ticket pourrait se limiter à ne pas le permettre, et qu'un ticket ultérieur apporterait la possibilité de "supprimer".
Et ne pas le permettre veut dire ajouter un flag la marquant comme « non supprimable », je me demande si ça ne vaut pas le coup de le faire directement. Et si « source externe » inclut les ics, toucher à ça dans un sens ou dans l'autre sort déjà pas mal du ticket...
Mais je suis aussi curieux de savoir ce qui ne convient pas dans le fonctionnement actuel : on peut supprimer les exceptions, oui elles sont vraiment supprimées, et ? Activer/désactiver la source permet de les remettre comme avant, si on avait posé un flag « supprimé » on pourrait en réactivant ne pas faire ça et garder les exceptions supprimées, mais ce cas d'usage va déjà chercher loin.
Mis à jour par Frédéric Péters il y a environ 4 ans
La situation présente permet d'avoir "jours fériés" activée mais des jours fériés absents, parce que supprimés manuellement, je trouve ça bizarre; et/ou des jours supprimés mais qui vont réapparaitre automatiquement parce qu'un cron sera passé par là.
Mis à jour par Valentin Deniaud il y a environ 4 ans
- Fichier 0002-manager-change-semantics-of-exceptions-sources-manag.patch 0002-manager-change-semantics-of-exceptions-sources-manag.patch ajouté
- Fichier 0001-agendas-add-global-exceptions-sources-18904.patch 0001-agendas-add-global-exceptions-sources-18904.patch ajouté
- Fichier 0003-agendas-add-external-flag-on-exception-18904.patch 0003-agendas-add-external-flag-on-exception-18904.patch ajouté
Frédéric Péters a écrit :
des jours supprimés mais qui vont réapparaitre automatiquement parce qu'un cron sera passé par là.
J'avais fait en sorte que ça n'arrive pas, mais soit.
Donc nouveau patch 0003 qui empêche la suppression de manière légère, juste en affichant pas les boutons.
Mis à jour par Frédéric Péters il y a plus de 3 ans
workalendar et ses dépendances sont désormais packagées; tu pourrais rebaser la branche ?
Si la question de la traduction des jours est toujours présente, soit on maintient la liste des libellés + traductions ici, soit on n'affiche que la date et pas le libellé.
Mis à jour par Valentin Deniaud il y a plus de 3 ans
- Fichier 0002-manager-change-semantics-of-exceptions-sources-manag.patch 0002-manager-change-semantics-of-exceptions-sources-manag.patch ajouté
- Fichier 0001-agendas-add-global-exceptions-sources-18904.patch 0001-agendas-add-global-exceptions-sources-18904.patch ajouté
- Fichier 0003-agendas-add-external-flag-on-exception-18904.patch 0003-agendas-add-external-flag-on-exception-18904.patch ajouté
- Fichier 0004-misc-add-workalendar-translations-18904.patch 0004-misc-add-workalendar-translations-18904.patch ajouté
Rebasé, et 0004 en bonus pour avoir les traductions, car l'affaire côté workalendar n'avance pas depuis 6 mois. Je les ai mises dans un dossier workalendar_locale à part, ça pollue la racine de l'app mais ça a le mérite de ne pas provoquer de conflit, et de pouvoir être rm -r facilement le jour où les trads upstream arrivent.
Mis à jour par Lauréline Guérin il y a plus de 3 ans
0002: on ne change rien sur la page de gestion des exception ? On a toujours "Importer des exceptions" en titre par exemple
0003: ça serait pas mal d'ajouter un filter external=False
dans le queryset au niveau de la vue delete d'une exception, par sécurité.
Mis à jour par Valentin Deniaud il y a plus de 3 ans
- Fichier 0002-manager-change-semantics-of-exceptions-sources-manag.patch 0002-manager-change-semantics-of-exceptions-sources-manag.patch ajouté
- Fichier 0001-agendas-add-global-exceptions-sources-18904.patch 0001-agendas-add-global-exceptions-sources-18904.patch ajouté
- Fichier 0003-agendas-add-external-flag-on-exception-18904.patch 0003-agendas-add-external-flag-on-exception-18904.patch ajouté
- Fichier 0004-misc-add-workalendar-translations-18904.patch 0004-misc-add-workalendar-translations-18904.patch ajouté
Yep
Mis à jour par Lauréline Guérin il y a plus de 3 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Valentin Deniaud il y a plus de 3 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 0c61adf2ed36981955a32d609b915e7198ce9da0 Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Mon Aug 31 18:02:41 2020 +0200 misc: add workalendar translations (#18904) commit c568da89f5c22ead74fd0a623d26213cd3dcea6c Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Thu Apr 2 16:09:28 2020 +0200 agendas: add external flag on exception (#18904) commit 3bbd338b15d61e00cefb4f2559c208fd517b14f6 Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Thu Feb 20 17:35:50 2020 +0100 manager: change semantics of exceptions sources management (#18904) commit bf394e0a073b540922ba3bb67f7a9b3ba4960057 Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Thu Feb 20 11:46:23 2020 +0100 agendas: add global exceptions sources (#18904)
Mis à jour par Frédéric Péters il y a plus de 3 ans
- Statut changé de Résolu (à déployer) à Solution déployée
agendas: add global exceptions sources (#18904)