Projet

Général

Profil

Development #18904

Jours fériés automatiques (poser systématiquement des exceptions aux récurrences dans les agendas de nos utilisateurs)

Ajouté par Brice Mallet il y a plus de 6 ans. Mis à jour il y a plus de 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
22 septembre 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

0001-agendas-add-global-exceptions-sources-18904.patch (13,5 ko) 0001-agendas-add-global-exceptions-sources-18904.patch Valentin Deniaud, 20 février 2020 14:51
0002-manager-change-semantics-of-exceptions-sources-manag.patch (13,3 ko) 0002-manager-change-semantics-of-exceptions-sources-manag.patch Valentin Deniaud, 20 février 2020 17:53
0001-agendas-add-global-exceptions-sources-18904.patch (19,7 ko) 0001-agendas-add-global-exceptions-sources-18904.patch Valentin Deniaud, 20 février 2020 17:53
0002-manager-change-semantics-of-exceptions-sources-manag.patch (13,6 ko) 0002-manager-change-semantics-of-exceptions-sources-manag.patch Valentin Deniaud, 25 février 2020 13:52
0001-agendas-add-global-exceptions-sources-18904.patch (20,1 ko) 0001-agendas-add-global-exceptions-sources-18904.patch Valentin Deniaud, 25 février 2020 13:52
0002-manager-change-semantics-of-exceptions-sources-manag.patch (13,6 ko) 0002-manager-change-semantics-of-exceptions-sources-manag.patch Valentin Deniaud, 05 mars 2020 16:35
0001-agendas-add-global-exceptions-sources-18904.patch (19,9 ko) 0001-agendas-add-global-exceptions-sources-18904.patch Valentin Deniaud, 05 mars 2020 16:35
0002-manager-change-semantics-of-exceptions-sources-manag.patch (13,5 ko) 0002-manager-change-semantics-of-exceptions-sources-manag.patch Valentin Deniaud, 31 mars 2020 14:54
0001-agendas-add-global-exceptions-sources-18904.patch (22,1 ko) 0001-agendas-add-global-exceptions-sources-18904.patch Valentin Deniaud, 31 mars 2020 14:54
0002-manager-change-semantics-of-exceptions-sources-manag.patch (13,5 ko) 0002-manager-change-semantics-of-exceptions-sources-manag.patch Valentin Deniaud, 02 avril 2020 16:15
0001-agendas-add-global-exceptions-sources-18904.patch (19,6 ko) 0001-agendas-add-global-exceptions-sources-18904.patch Valentin Deniaud, 02 avril 2020 16:15
0003-agendas-add-external-flag-on-exception-18904.patch (7,36 ko) 0003-agendas-add-external-flag-on-exception-18904.patch Valentin Deniaud, 02 avril 2020 16:15
0002-manager-change-semantics-of-exceptions-sources-manag.patch (10,8 ko) 0002-manager-change-semantics-of-exceptions-sources-manag.patch Valentin Deniaud, 31 août 2020 18:08
0001-agendas-add-global-exceptions-sources-18904.patch (19,8 ko) 0001-agendas-add-global-exceptions-sources-18904.patch Valentin Deniaud, 31 août 2020 18:08
0003-agendas-add-external-flag-on-exception-18904.patch (7,38 ko) 0003-agendas-add-external-flag-on-exception-18904.patch Valentin Deniaud, 31 août 2020 18:08
0004-misc-add-workalendar-translations-18904.patch (2,38 ko) 0004-misc-add-workalendar-translations-18904.patch Valentin Deniaud, 31 août 2020 18:08
0002-manager-change-semantics-of-exceptions-sources-manag.patch (11,3 ko) 0002-manager-change-semantics-of-exceptions-sources-manag.patch Valentin Deniaud, 01 septembre 2020 17:51
0001-agendas-add-global-exceptions-sources-18904.patch (19,8 ko) 0001-agendas-add-global-exceptions-sources-18904.patch Valentin Deniaud, 01 septembre 2020 17:51
0003-agendas-add-external-flag-on-exception-18904.patch (8 ko) 0003-agendas-add-external-flag-on-exception-18904.patch Valentin Deniaud, 01 septembre 2020 17:51
0004-misc-add-workalendar-translations-18904.patch (2,38 ko) 0004-misc-add-workalendar-translations-18904.patch Valentin Deniaud, 01 septembre 2020 17:51

Demandes liées

Lié à Chrono - Development #12550: exception aux récurrencesFermé12 juillet 201629 août 2017

Actions

Révisions associées

Révision bf394e0a (diff)
Ajouté par Valentin Deniaud il y a plus de 3 ans

agendas: add global exceptions sources (#18904)

Révision 3bbd338b (diff)
Ajouté par Valentin Deniaud il y a plus de 3 ans

manager: change semantics of exceptions sources management (#18904)

Révision c568da89 (diff)
Ajouté par Valentin Deniaud il y a plus de 3 ans

agendas: add external flag on exception (#18904)

Révision 0c61adf2 (diff)
Ajouté par Valentin Deniaud il y a plus de 3 ans

misc: add workalendar translations (#18904)

Historique

#1

Mis à jour par Brice Mallet il y a plus de 6 ans

#2

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)
#3

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)
#4

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.

#5

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.

#6

Mis à jour par Valentin Deniaud il y a environ 4 ans

Patch pour info pendant que j'écris les tests.
  • 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.

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.

#7

Mis à jour par Valentin Deniaud il y a environ 4 ans

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.

#8

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)

#10

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 :)

#11

Mis à jour par Valentin Deniaud il y a environ 4 ans

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 ?

#12

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)

#13

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)

#14

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)

#15

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

Tu peux rebaser la branche ?

#16

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>

#17

Mis à jour par Valentin Deniaud il y a environ 4 ans

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.

#18

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.

#19

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.

#20

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.

#21

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

#22

Mis à jour par Valentin Deniaud il y a environ 4 ans

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.

#23

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

#24

Mis à jour par Valentin Deniaud il y a plus de 3 ans

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.

#25

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

#27

Mis à jour par Lauréline Guérin il y a plus de 3 ans

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

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)
#29

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

Formats disponibles : Atom PDF