Projet

Général

Profil

Development #12550

exception aux récurrences

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

Statut:
Fermé
Priorité:
Normal
Assigné à:
Josué Kouka
Catégorie:
-
Version cible:
-
Début:
12 juillet 2016
Echéance:
29 août 2017
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

-


Fichiers

0001-add-booking-exception-management-12550.patch (16,7 ko) 0001-add-booking-exception-management-12550.patch Josué Kouka, 23 août 2017 12:06
0001-add-booking-exception-management-12550.patch (17,3 ko) 0001-add-booking-exception-management-12550.patch Josué Kouka, 23 août 2017 16:13
0001-add-time-period-exception-management-18111.patch (22,6 ko) 0001-add-time-period-exception-management-18111.patch Josué Kouka, 04 septembre 2017 21:57
Screenshot-2017-9-5 Chrono(2).png (22,6 ko) Screenshot-2017-9-5 Chrono(2).png Frédéric Péters, 05 septembre 2017 08:57
Screenshot-2017-9-5 Chrono(1).png (17,7 ko) Screenshot-2017-9-5 Chrono(1).png Frédéric Péters, 05 septembre 2017 08:57
0001-add-time-period-exception-management-18111.patch (27,6 ko) 0001-add-time-period-exception-management-18111.patch Josué Kouka, 05 septembre 2017 19:03
0001-add-time-period-exception-management-18111.patch (32,9 ko) 0001-add-time-period-exception-management-18111.patch Josué Kouka, 19 septembre 2017 18:05
0001-add-time-period-exception-management-18111.patch (32,9 ko) 0001-add-time-period-exception-management-18111.patch Josué Kouka, 19 septembre 2017 18:34
0001-add-time-period-exception-management-18111.patch (33,4 ko) 0001-add-time-period-exception-management-18111.patch Josué Kouka, 19 septembre 2017 22:09
Capture d’écran 2017-09-20 à 10.44.47.png (58 ko) Capture d’écran 2017-09-20 à 10.44.47.png Frédéric Péters, 20 septembre 2017 10:44
Capture d’écran 2017-09-20 à 10.44.38.png (148 ko) Capture d’écran 2017-09-20 à 10.44.38.png Frédéric Péters, 20 septembre 2017 10:44
Capture d’écran 2017-09-20 à 10.44.28.png (156 ko) Capture d’écran 2017-09-20 à 10.44.28.png Frédéric Péters, 20 septembre 2017 10:44
0001-add-time-period-exception-management-18111.patch (33,5 ko) 0001-add-time-period-exception-management-18111.patch Josué Kouka, 20 septembre 2017 13:38
0001-add-time-period-exception-management-18111.patch (33,5 ko) 0001-add-time-period-exception-management-18111.patch Josué Kouka, 20 septembre 2017 15:04
0001-add-time-period-exception-management-12550.patch (33,7 ko) 0001-add-time-period-exception-management-12550.patch Josué Kouka, 21 septembre 2017 14:12
0001-add-time-period-exception-management-12550.patch (33,6 ko) 0001-add-time-period-exception-management-12550.patch Josué Kouka, 21 septembre 2017 16:01
0001-add-time-period-exception-management-12550.patch (33,6 ko) 0001-add-time-period-exception-management-12550.patch Josué Kouka, 21 septembre 2017 16:40
0001-add-time-period-exception-management-12550.patch (34,4 ko) 0001-add-time-period-exception-management-12550.patch Josué Kouka, 22 septembre 2017 17:39
0001-add-time-period-exception-management-12550.patch (34,3 ko) 0001-add-time-period-exception-management-12550.patch Josué Kouka, 22 septembre 2017 18:30
chrono_tpe1.png (34,4 ko) chrono_tpe1.png Josué Kouka, 22 septembre 2017 18:30
chrono_tpe2.png (47,9 ko) chrono_tpe2.png Josué Kouka, 22 septembre 2017 18:30
0001-add-time-period-exception-management-12550.patch (35,6 ko) 0001-add-time-period-exception-management-12550.patch Josué Kouka, 25 septembre 2017 15:32
0001-add-time-period-exception-management-12550.patch (35,5 ko) 0001-add-time-period-exception-management-12550.patch Josué Kouka, 25 septembre 2017 18:44
0001-add-time-period-exception-management-12550.patch (34,3 ko) 0001-add-time-period-exception-management-12550.patch Josué Kouka, 26 septembre 2017 12:35

Demandes liées

Lié à Chrono - Development #16798: alimentation des exceptions via un icsFermé09 juin 201730 août 2017

Actions
Lié à Chrono - Bug #18111: Gestion des exceptions par Guichet.Rejeté23 août 2017

Actions
Lié à Gadjo - Bug #18887: Popup non affiché si aucun élement @form@ n'existeFermé21 septembre 2017

Actions
Lié à Chrono - Development #18904: Jours fériés automatiques (poser systématiquement des exceptions aux récurrences dans les agendas de nos utilisateurs)Fermé22 septembre 2017

Actions
Lié à Chrono - Bug #18937: breadcrumb ne s'affiche pas correctement sur la page d'édition d'une periode horaireFermé25 septembre 2017

Actions
Dupliqué par Chrono - Bug #15005: Gérer les exclusions sur un agenda de rendez-vousRejeté15 février 2017

Actions
Bloqué par Chrono - Development #12549: récurrence des événementsRejeté12 juillet 2016

Actions

Révisions associées

Révision 9d773892 (diff)
Ajouté par Josué Kouka il y a plus de 6 ans

add time period exception management (#12550)

Historique

#1

Mis à jour par Frédéric Péters il y a presque 8 ans

#2

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

idée : les exceptions pourraient venir d'un calendrier type iCalendar/ics qui, typiquement, présenterait les moments où la personne est déjà occupée. Idéalement un fichier ics accessible via URL et mis à jour automatiquement ; mais dans un premier temps plutôt un dépot local.

#3

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

Pour le moment ça va plutôt être un modèle réfléchi pour chrono et alimenté via un formulaire web dans chrono.

#4

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

  • Dupliqué par Bug #15005: Gérer les exclusions sur un agenda de rendez-vous ajouté
#6

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

Et si jamais une exception est posée alors qu'il y a des rendez-vous pris sur la période, il faut les notifier (pour qu'un trigger wcs puisse faire le nécessaire).

#7

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

En terme d'UI, il s'agirait d'une action "Nouvelle exclusion" au niveau de l'agenda, une boite de dialogue où choisir une date, une heure de début et une heure de fin (alternativement une date/heure de début et une date/heure de fin, pour gérer en un coup une semaine de congés).

Ensuite, lorsque la liste des créneaux possibles est générée (api/views/MeetingDatetimes), retirer ce qui doit l'être.

Et comme noté juste au-dessus, si jamais une exception est posée alors qu'il y a des rendez-vous pris sur la période, il faut les notifier (pour qu'un trigger wcs puisse faire le nécessaire).

#8

Mis à jour par Josué Kouka il y a presque 7 ans

  • Echéance mis à 28 juillet 2017
  • Assigné à mis à Josué Kouka
#9

Mis à jour par Frédéric Péters il y a presque 7 ans

#11

Mis à jour par Serghei Mihai (congés, retour 15/05) il y a plus de 6 ans

  • Echéance changé de 28 juillet 2017 à 29 août 2017
#12

Mis à jour par Josué Kouka il y a plus de 6 ans

Un patch sur la gestion des exceptions au niveau interface et au niveau api.
Par contre j'ai gardé en suspens la notification vers wcs, lorsqu'une exception est posée alors qu'il y'a une ou plusieurs réservations.
Je ne pense pas avoir le maximum d'information. L'idéal serait comme pour le paiement d'avoir un source_url envoyé lors de la réservation, afin de l'utiliser pour la notification.
Besoin d'un autre avis pour affirmer ou infirmer ce que je pense.

#13

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

Je dirais de commencer alors par un truc totalement indépendant de w.c.s., qui simplement refuserait les exceptions sur les espaces déjà occupés. (mais ça veut dire que dans le patch, il ne doit pas y avoir de référence à w.c.s.).

Déjà pointé, il y a plein d'avantages à faire une chose et puis l'autre; ici j'ai souvenir d'un message de Serghei disant que la gestion des exceptions devrait se faire par guichet. (si ça se confirme, on peut dire que ce ne serait pas ici mais faut alors créer un autre ticket pour que ça soit fait).

            if BookingException.objects.filter(
                    start_datetime__lte=slot.start_datetime,
                    end_datetime__gt=slot.start_datetime):

Au moins les exceptions doivent être liées à agenda, elles le sont du côté du modèle mais ce n'est pas exploité, et plouf.

Autre plouf, au moment de la prise de rendez-vous (fillslot), il faut prendre les exceptions en compte.

#14

Mis à jour par Josué Kouka il y a plus de 6 ans

  • Lié à Bug #18111: Gestion des exceptions par Guichet. ajouté
#15

Mis à jour par Josué Kouka il y a plus de 6 ans

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

Je dirais de commencer alors par un truc totalement indépendant de w.c.s., qui simplement refuserait les exceptions sur les espaces déjà occupés. (mais ça veut dire que dans le patch, il ne doit pas y avoir de référence à w.c.s.).

Déjà pointé, il y a plein d'avantages à faire une chose et puis l'autre; ici j'ai souvenir d'un message de Serghei disant que la gestion des exceptions devrait se faire par guichet. (si ça se confirme, on peut dire que ce ne serait pas ici mais faut alors créer un autre ticket pour que ça soit fait).

Ok je vois. Ticket créé #18111

[...]

Au moins les exceptions doivent être liées à agenda, elles le sont du côté du modèle mais ce n'est pas exploité, et plouf.

Autre plouf, au moment de la prise de rendez-vous (fillslot), il faut prendre les exceptions en compte.

#16

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

@@ -28,6 +29,7 @@ from django.utils.translation import ugettext_lazy as _

 from jsonfield import JSONField

+
 AGENDA_KINDS = (
     ('events', _('Events')),
     ('meetings', _('Meetings')),

Please, je ne veux pas relire des patchs qui ajoutent des espaces sans rapport avec l'histoire.

#17

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

+KNOWN_SERVICES = {
+    'wcs': {
+        'default': {'title': 'test', 'url': 'http://wcs.example.net/',
+                    'secret': 'combo', 'orig': 'combo', 'secondary': False,
+                    'backoffice-menu-url': 'http://wcs.example.net/backoffice/'}
+    }
+}

Plus de rapport avec ce ticket non plus.

#18

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

Plutôt TimePeriodException.

#19

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

Couverture du code par les tests unitaires. (ok, j'avais zappé le test_manager.py, qui ne s'était pas appliqué correctement sur origin/master).

#20

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

@@ -162,6 +163,15 @@ class MeetingDatetimes(GenericAPIView):
                 start_datetime__lte=max_datetime + datetime.timedelta(meeting_type.duration))
         busy_time_slots = list(busy_time_slots)

+        # Search for excluded time slots
+        time_slots_list = []
+        for slot in all_time_slots:
+            if agenda.bookingexception_set.filter(start_datetime__lte=slot.start_datetime,
+                                                  end_datetime__gt=slot.start_datetime):

J'ai récemment travaillé à optimiser les perfs de cet appel, on peut très facilement se trouver avec des centaines de créneaux, et ce code donnera autant d''appels à la db en plus.

#21

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

Si le plan est désormais d'attaquer directement sur #18111, le noter ici.

#22

Mis à jour par Josué Kouka il y a plus de 6 ans

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

Si le plan est désormais d'attaquer directement sur #18111, le noter ici.

Je confirme que je vais pour les exceptions par guichet.
(J'ai poussé la branche parce que Serghei avait besoin du model d'exception)

#23

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

Ok j'ai plutôt fermé l'autre vu que l'historique est ici.

#24

Mis à jour par Josué Kouka il y a plus de 6 ans

Patch avec test_manager.py qui doit échouer.
Je n'ai pas ajouté l'affichage des exceptions sur manager_agenda_view à cause du changement fait dans #18414.
Est ce que l'on reste sur l'idée d'ajouter les exceptions juste en dessous des time periods ? Si oui comment on les distingue l'un de l'autre ?

#25

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

Pourquoi le retour d'un manuel has_overlap après avoir introduit une dépendance sur intervaltree ? Proche, pourquoi ne pas gérer les exceptions lors du get_open_slots ?

Patch avec test_manager.py qui doit échouer.

Ça va avec le reste, genre ça échoue parce que tu as laissé un test d'une UI qui n'est plus présente parce que tu as des question, où c'est autre chose ?

Je n'ai pas ajouté l'affichage des exceptions sur manager_agenda_view à cause du changement fait dans #18414.

Dans #18414 il y a différentes choses, je ne vois pas précisément la modif là-dedans qui te perturbe ici.

Est ce que l'on reste sur l'idée d'ajouter les exceptions juste en dessous des time periods ? Si oui comment on les distingue l'un de l'autre ?

Cela étant, plus généralement, les commentaires précédents dans ce ticket, quand il est question d'interface, c'était avant la gestion multi-guichet, dans son intégralité, et donc oui, il faut réfléchir à ce point.

#26

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

Et donc ma proposition côté interface, cf captures attachées :

  • à partir du moment où il y a une période horaire, inclure un lien "Ajouter une exception" sous la liste.
  • quand des exceptions sont présentes,
    • afficher celles des deux semaines à venir (ou la suivante peu importe sa date si aucune dans les semaines à venir)
    • inclure un lien permettant d'obtenir l'ensemble des exceptions (futures) (là j'imagine l'ouverture d'une popup qui présentera cette liste, avec comme seule action la possibilité de supprimer une exception)
  • à noter l'ajout de la possibilité d'un libellé aux exceptions

Je laisse par contre de côté pour le moment quelque chose qui me semblera important pour la suite, une gestion plus globale des exceptions, pour ne pas devoir déclarer les jours fériés une fois par guichet.

Et ouverture pour le ticket #16798, le choix d'un fichier ics se ferait dans la même boite de dialogue "Ajouter une exception".

#27

Mis à jour par Josué Kouka il y a plus de 6 ans

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

Et donc ma proposition côté interface, cf captures attachées :

  • à partir du moment où il y a une période horaire, inclure un lien "Ajouter une exception" sous la liste.
  • quand des exceptions sont présentes,
    • afficher celles des deux semaines à venir (ou la suivante peu importe sa date si aucune dans les semaines à venir)
    • inclure un lien permettant d'obtenir l'ensemble des exceptions (futures) (là j'imagine l'ouverture d'une popup qui présentera cette liste, avec comme seule action la possibilité de supprimer une exception)
  • à noter l'ajout de la possibilité d'un libellé aux exceptions

Je fais le patch qui correspond

Je laisse par contre de côté pour le moment quelque chose qui me semblera important pour la suite, une gestion plus globale des exceptions, pour ne pas devoir déclarer les jours fériés une fois par guichet.

Et ouverture pour le ticket #16798, le choix d'un fichier ics se ferait dans la même boite de dialogue "Ajouter une exception".

#28

Mis à jour par Josué Kouka il y a plus de 6 ans

Patch avec les modifications correspondantes au mockup.
J'ai ajouté les tests pour le manager.

#29

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

def has_overlap(x, y):

J'avais fait un commentaire à ce sujet.

    label = models.CharField(_('Label'), max_length=150)

« possibilité d'un libellé aux exceptions » → optionnel.

    import pdb; pdb.set_trace()

passera pas.

#30

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

Sur l'UI; cf les captures :

  • les exceptions sont dans la même liste.
  • je notais « ou la suivante peu importe sa date si aucune dans les semaines à venir » et ce n'est pas le cas.
  • c'est le lien "(voir toutes les exceptions)" qui permet de voir toutes les exceptions (pas un clic sur "Exceptions"),
    • et ce lien est en italique.
    • dans la situation où toutes les exceptions sont déjà affichées, il n'est pas utile, ne doit pas être affiché.
  • quand il y a un libellé, bien sûr qu'il faut un espace entre le libellé et la parenthèse avec les dates.
    • quand le début ou la fin n'est pas minuit, il faut également afficher les heures.

Comme noté dans le commentaire au-dessus, le libellé doit être optionnel, doit du coup arriver après start_datetime et end_datetime, et l'ui pourrait afficher "Optional Label", que ça soit bien clair.

Patch avec les modifications correspondantes au mockup.

Ce serait sans doute plus facile si tu précisais d'emblée ce en quoi tu as décidé de dévier, plutôt qu'annoncer une conformité.

#31

Mis à jour par Josué Kouka il y a plus de 6 ans

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

Sur l'UI; cf les captures :

  • les exceptions sont dans la même liste.
  • je notais « ou la suivante peu importe sa date si aucune dans les semaines à venir » et ce n'est pas le cas.
  • c'est le lien "(voir toutes les exceptions)" qui permet de voir toutes les exceptions (pas un clic sur "Exceptions"),
    • et ce lien est en italique.
    • dans la situation où toutes les exceptions sont déjà affichées, il n'est pas utile, ne doit pas être affiché.
  • quand il y a un libellé, bien sûr qu'il faut un espace entre le libellé et la parenthèse avec les dates.
    • quand le début ou la fin n'est pas minuit, il faut également afficher les heures.

Comme noté dans le commentaire au-dessus, le libellé doit être optionnel, doit du coup arriver après start_datetime et end_datetime, et l'ui pourrait afficher "Optional Label", que ça soit bien clair.

Patch avec les modifications correspondantes au mockup.

Ce serait sans doute plus facile si tu précisais d'emblée ce en quoi tu as décidé de dévier, plutôt qu'annoncer une conformité.

Ok. Je refais le patch.

#32

Mis à jour par Josué Kouka il y a plus de 6 ans

  • Modification de la récupération des time slots. Au lieu d'avoir get_time_slot appelé à la fois dans MeetingDatetimes and get_open_slots (changé en get_all_slots)
  • Dans test_data_migrations.test_time_period_data_migration j'ai enlevé la fixture transactional_db parce qu'avec cette fixture ce test supprimait la migration 0019 relative au model TimePeriodException.
  • Les exceptions sont maintenant dans la meme liste que les periode horaires
  • Correction sur l'affichage des libelés des exceptions faites
  • Si toutes les exceptions sont déja affichées, on a plus le lien "see all exceptions".
#34

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

Précise ce qui change dans le fichier, stp.

En attendant, le commentaire qui était en cours d'écriture :

Essayer de garder les import triés; regarder la couverture du code par les tests unitaires et constater qu'il manque un bout.

Ce serait sans doute plus facile si tu précisais d'emblée ce en quoi tu as décidé de dévier, plutôt qu'annoncer une conformité.

Toujours le cas, toujours à moi d'être attentif sur les commentaires passés et de noter que "et ce lien est en italique" a été zappé.

+            'label': forms.TextInput(attrs={'placeholder': _('Optional Label')})

Pas de placeholder, jamais.

+        exc_repr = u'(%s → %s)' % (DateFormat(self.start_datetime).format(date_format),
+                                   DateFormat(self.end_datetime).format(date_format))
+        if self.label:
+            exc_repr = '%s %s' % (self.label, exc_repr)

Quand il n'y a pas de libellé on se trouve avec du texte entre parenthèses uniquement, ce n'est pas souhaitable.

+        if not exceptions:
+            return []
+        return list(exceptions)

Le if not exception: return [] apporte quelque chose que je ne capte pas ?

+    all_time_slots = reduce(operator.__or__, deepcopy(open_slots_by_desk).values())

En dix mots, ça fait quoi ? Plutôt que me répondre le mettre en commentaire au-dessus de cette ligne. (ou écrire ça d'une manière plus lisible).

+{% endblock %}
+

Sur une fin de fichier, commentaire obligatoire sur une ligne blanche malheureuse.

+        url(r'^time-period-exceptions/(?P<pk>\w+)/exception-list$', views.time_period_exception_list,
+            name='chrono-manager-time-period-exception-list'),
+
+
         url(r'^agendas/events.csv$', views.agenda_import_events_sample_csv,
             name='chrono-manager-sample-events-csv'),

Sur un milieu de fichier, commentaire obligatoire sur une ligne blanche malheureuse.

#35

Mis à jour par Josué Kouka il y a plus de 6 ans

J'ai glissé une erreur lors de l'ajout des exceptions aussi. Je corrige avec en prenant en compte les remarques dessus.

#36

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

La gestion des timezones a un problème j'ai ajouté une exception de 8h à 18h et ça a été enregistré comme étant de 8 à 18 UTC, et le résultat c'est que l'horaire normal, qui affiche "8h → 18h", et bien les deux premières heures sont restées disponibles.

#37

Mis à jour par Josué Kouka il y a plus de 6 ans

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

Précise ce qui change dans le fichier, stp.

En attendant, le commentaire qui était en cours d'écriture :

Essayer de garder les import triés; regarder la couverture du code par les tests unitaires et constater qu'il manque un bout.

Ce serait sans doute plus facile si tu précisais d'emblée ce en quoi tu as décidé de dévier, plutôt qu'annoncer une conformité.

Toujours le cas, toujours à moi d'être attentif sur les commentaires passés et de noter que "et ce lien est en italique" a été zappé.

Corrigé

[...]

Pas de placeholder, jamais.

Ok, remplacé par une help_text

[...]

Quand il n'y a pas de libellé on se trouve avec du texte entre parenthèses uniquement, ce n'est pas souhaitable.

Corrigé, les parenthèses ne sont présentes que quand un label est présent.

[...]

Le if not exception: return [] apporte quelque chose que je ne capte pas ?

Gestion du cas ou aucune exception n'existe à partir de la date d'aujourd'hui.

[...]

En dix mots, ça fait quoi ? Plutôt que me répondre le mettre en commentaire au-dessus de cette ligne. (ou écrire ça d'une manière plus lisible).

Commentaire ajouté dans le code.

[...]

Sur une fin de fichier, commentaire obligatoire sur une ligne blanche malheureuse.

[...]

Sur un milieu de fichier, commentaire obligatoire sur une ligne blanche malheureuse.

#38

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

Essayer de garder les import triés; regarder la couverture du code par les tests unitaires et constater qu'il manque un bout.

Tu as décidé que non ?

Le if not exception: return [] apporte quelque chose que je ne capte pas ?

Gestion du cas ou aucune exception n'existe à partir de la date d'aujourd'hui.

Mais le return list(query set qui retourne rien), qui est juste derrière, il fera pareil, retournera une liste vide.

Mais je note que le code est désormais différent,

        exceptions = self.timeperiodexception_set.filter(
            start_datetime__gte=now()).order_by('start_datetime').first()
        if exceptions:
            return [exceptions]

Pareil qu'en d'autres occasions, soudainement "exceptions" qui était avant utilisé pour tenir un queryset avec plusieurs éléments se met avec le même nom à contenir un élément unique, ça n'aide vraiment pas la lecture d'avoir comme ça la nature d'une variable changer.

La gestion des timezones a un problème j'ai ajouté une exception de 8h à 18h et ça a été enregistré comme étant de 8 à 18 UTC, et le résultat c'est que l'horaire normal, qui affiche "8h → 18h", et bien les deux premières heures sont restées disponibles.

Comme il n'y a aucune indication et que je ne vois pas différence dans les fichiers sous /manager/ qui seraient en lien, je me dis que ce commentaire a été zappé ?

#39

Mis à jour par Josué Kouka il y a plus de 6 ans

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

Essayer de garder les import triés; regarder la couverture du code par les tests unitaires et constater qu'il manque un bout.

Tu as décidé que non ?

J'ai amelioré la couverture de tests et couvert tout ce qu'il y'avait dans agendas.models. C'est bien dans ce fichier que tout le code n'était pas couvert.
Pour les imports, encore dans ce fichier, je les ai remis par ordre alphabetique. Si je ne me trompe pas, c'était le django.utils.dateformat qui n'était pas à la bonne position au niveau des imports.

Le if not exception: return [] apporte quelque chose que je ne capte pas ?

Gestion du cas ou aucune exception n'existe à partir de la date d'aujourd'hui.

Mais le return list(query set qui retourne rien), qui est juste derrière, il fera pareil, retournera une liste vide.

Dans une de tes notes, tu demandais à ce que les exceptions dans les 2 semaines avenir soient affichées, dans le cas ou celle ci n'existent, afficher la prochaine exception dans le futur. La liste pour gère le cas ou il n'y a aucune exceptions dans le futur à partir de la date d'aujourd'hui, dans la mesure ou l'on n'affiche pas celles dans le passé.

Mais je note que le code est désormais différent,

[...]

Pareil qu'en d'autres occasions, soudainement "exceptions" qui était avant utilisé pour tenir un queryset avec plusieurs éléments se met avec le même nom à contenir un élément unique, ça n'aide vraiment pas la lecture d'avoir comme ça la nature d'une variable changer.

La gestion des timezones a un problème j'ai ajouté une exception de 8h à 18h et ça a été enregistré comme étant de 8 à 18 UTC, et le résultat c'est que l'horaire normal, qui affiche "8h → 18h", et bien les deux premières heures sont restées disponibles.

Comme il n'y a aucune indication et que je ne vois pas différence dans les fichiers sous /manager/ qui seraient en lien, je me dis que ce commentaire a été zappé ?

Je ne comprends pas. Est ce au niveau de l'affichage ? En local quand j'ai les bon affichage et au niveau de l'api les bons timeslots filtrés. Je rate surement quelque chose parce que je n'arrive pas à reproduire.

#40

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

Pour les imports, encore dans ce fichier, je les ai remis par ordre alphabetique. Si je ne me trompe pas, c'était le django.utils.dateformat qui n'était pas à la bonne position au niveau des imports.

  from django.core.urlresolvers import reverse
+ from django.core.exceptions import ValidationError

Dans une de tes notes, tu demandais à ce que les exceptions dans les 2 semaines avenir soient affichées, dans le cas ou celle ci n'existent, afficher la prochaine exception dans le futur. La liste pour gère le cas ou il n'y a aucune exceptions dans le futur à partir de la date d'aujourd'hui, dans la mesure ou l'on n'affiche pas celles dans le passé.

Mais je note que le code est désormais différent,

Je notais que ce code a été changé entre les deux passages; le commentaire qui a suivi c'est que réutiliser la variable "exceptions" pour un contenu qui est de nature différente, ce n'est pas top.

Je ne comprends pas. Est ce au niveau de l'affichage ? En local quand j'ai les bon affichage et au niveau de l'api les bons timeslots filtrés. Je rate surement quelque chose parce que je n'arrive pas à reproduire.

Le comportement est un peu différent du patch que je testais hier soir (je teste ce qu'il y a dans le dépôt, 43b5866d); d'abord deux captures dans le /manage/, où j'ajoute une exception, on voit que je précise 8h/18h et que dans la capture suivante c'est 6h/16h qui apparait. Ensuite, à regarder les résultats de l'API, si c'était vraiment 6h/16h qui était pris en compte, il resterait des créneaux à partir de 16h mais non ça zappe toute la journée. Par rapport au bug que je rencontrais hier, donc, ça me semble désormais devenu uniquement un bug d'affichage dans le /manage/ (modulo le code, que je ne viens pas de relire)

#41

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

Toujours le cas, toujours à moi d'être attentif sur les commentaires passés et de noter que "et ce lien est en italique" a été zappé.

Corrigé

C'est le titre "Exceptions" qui a été passé en italique, pas le lien "(see all exceptions)".

cf https://dev.entrouvert.org/attachments/download/18878/Screenshot-2017-9-5%20Chrono(2).png

#42

Mis à jour par Josué Kouka il y a plus de 6 ans

Le comportement est un peu différent du patch que je testais hier soir (je teste ce qu'il y a dans le dépôt, 43b5866d); d'abord deux captures dans le /manage/, où j'ajoute une exception, on voit que je précise 8h/18h et que dans la capture suivante c'est 6h/16h qui apparait. Ensuite, à regarder les résultats de l'API, si c'était vraiment 6h/16h qui était pris en compte, il resterait des créneaux à partir de 16h mais non ça zappe toute la journée. Par rapport au bug que je rencontrais hier, donc, ça me semble désormais devenu uniquement un bug d'affichage dans le /manage/ (modulo le code, que je ne viens pas de relire)

J'ai rajouté la localisation au niveau de unicode pour l'affichage.

Je notais que ce code a été changé entre les deux passages; le commentaire qui a suivi c'est que réutiliser la variable "exceptions" pour un contenu qui est de nature différente, ce n'est pas top.

Variable renommée en next_exception

C'est le titre "Exceptions" qui a été passé en italique, pas le lien "(see all exceptions)".

Corrigé.

#43

Mis à jour par Josué Kouka il y a plus de 6 ans

Ajout de la correction de l'ordre sur les imports qui a été oubliée.

#44

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

(la référence au ticket dans le commit n'est pas correcte)

À lire le début j'ai l'impression que open_slots ne change pas de nature.

     open_slots = reduce(operator.__or__, open_slots_by_desk.values())
-    return open_slots
+    return open_slots, all_time_slots

pourtant plus loin il y a ce changement :

-            open_slots = get_open_slots(agenda, MeetingType.objects.get(id=meeting_type_id))
+            open_slots, _ = get_all_slots(agenda, MeetingType.objects.get(id=meeting_type_id))
             slot = open_slots[event.start_datetime:event.end_datetime]
             if slot:
-                available_desk = slot.pop().data
+                available_desk = slot.pop().data.desk

Je ne vois pas ce qui est à l'origine de ce changement.

+                        <a href="#"><strong>{% trans 'Exceptions' %}</strong></a>

Pas un lien pas de <a>. (et oui ça veut sans doute dire gérer le padding d'un <strong> tapé là direct.) (bon, je peux oublier)

+                    {% if not desk.are_all_exceptions_displayed %}
+                    <li><a rel="popup" href="{% url 'chrono-manager-time-period-exception-list' pk=desk.id %}"><i>({% trans 'see all

L'italique ici aurait plutôt dû être amené par une classe sur le lien; j'oublie.

+{% block content %}
+<div class="timeperiod">
+    <form>

J'imagine le <form> présent ici pour le bénéfice de la popup, il faut lire gadjo.js et utiliser data-selector="..." pour plutôt préciser un sélecteur différent.

+    # exception within hours
+    TimePeriodException.objects.create(
+        desk=desk, start_datetime=datetime.datetime(2017, 5, 22, 9, 00),
+        end_datetime=datetime.datetime(2017, 5, 22, 12, 00))
+    resp2 = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
+    assert len(resp.json['data']) == len(resp2.json['data']) + 4

Déjà noté en d'autres occasions, il est pas mal utile de tester les bornes, basiquement ici, tester une exception qui commence au moment de la tranche horaire (qui est ici 10h/12h), assurer qu'elle ne laisse pas passer le créneau de 10h, tester une autre exception qui termine à 11h, assurer qu'elle ne "mange" pas aussi la tranche 11h/11h30.

+from django.core.management import call_command

Ajout de cet import mais il n'est pas utilisé.

Dans test_data_migrations.test_time_period_data_migration j'ai enlevé la fixture transactional_db parce qu'avec cette fixture ce test supprimait la migration 0019 relative au model TimePeriodException.

Quel était son rôle avant ? Tant qu'à toucher cette ligne, y corriger le nom du test ? (priod → period)

-    resp = resp.click('Add')
+    resp = resp.click(href="/manage/agendas/%d/desk/%d/add-time-period" % (agenda.pk, desk.pk), index=0)

Si vraiment il faut passer par préciser une URL plutôt qu'un texte de lien, utiliser reverse(). (on ne garantit pas d'URL stable ici).

+def test_meetings_agenda_delete_time_period_exception(app, admin_user):

Particulièrement celui-ci, faut le faire respirer un peu, mettre des commentaires pour décrire le déroulé. Alternative raisonnable ici, créer de manière rapide le contexte d'exécution du test en créant les objets nécessaires, et faire les manipulations d'UI uniquement pour la partie concernée par le test ("delete time period exception").

+    label = models.CharField(_('Label'), max_length=150, blank=True, null=True, help_text=_('Optional Label'))

Très sérieusement, ça fait un formulaire avec un champ "Libellé" suivi d'une description "Libellé optionnel"; gagnons du temps et de l'espace en mettant directement "Libellé optionnel" comme nom du champ.

#45

Mis à jour par Josué Kouka il y a plus de 6 ans

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

(la référence au ticket dans le commit n'est pas correcte)

À lire le début j'ai l'impression que open_slots ne change pas de nature.

Non pas du tout. Juste que le data des intervals contiennent maintenant des timeslots

[...]

pourtant plus loin il y a ce changement :

[...]

Je ne vois pas ce qui est à l'origine de ce changement.

Ce changement est introduit par le fait que open_slots et all_time_slots dérivent de open_slot_by_desk et que pour all_time_slots on a besoin d'avoir les données sur le time_slot et non juste l'id du desk.

[...]

Pas un lien pas de <a>. (et oui ça veut sans doute dire gérer le padding d'un <strong> tapé là direct.) (bon, je peux oublier)

J'ai ajouté de la css pour

[...]

L'italique ici aurait plutôt dû être amené par une classe sur le lien; j'oublie.

idem

[...]

J'imagine le <form> présent ici pour le bénéfice de la popup, il faut lire gadjo.js et utiliser data-selector="..." pour plutôt préciser un sélecteur différent.

ok. data-selector="div.timeperiod" est maintenant utilisé.

[...]

Déjà noté en d'autres occasions, il est pas mal utile de tester les bornes, basiquement ici, tester une exception qui commence au moment de la tranche horaire (qui est ici 10h/12h), assurer qu'elle ne laisse pas passer le créneau de 10h, tester une autre exception qui termine à 11h, assurer qu'elle ne "mange" pas aussi la tranche 11h/11h30.

Corrigé

[...]

Ajout de cet import mais il n'est pas utilisé.

Supprimé

Dans test_data_migrations.test_time_period_data_migration j'ai enlevé la fixture transactional_db parce qu'avec cette fixture ce test supprimait la migration 0019 relative au model TimePeriodException.

Quel était son rôle avant ? Tant qu'à toucher cette ligne, y corriger le nom du test ? (priod → period)

[...]

Si vraiment il faut passer par préciser une URL plutôt qu'un texte de lien, utiliser reverse(). (on ne garantit pas d'URL stable ici).

Un texte et un index suffisent.

[...]

Particulièrement celui-ci, faut le faire respirer un peu, mettre des commentaires pour décrire le déroulé. Alternative raisonnable ici, créer de manière rapide le contexte d'exécution du test en créant les objets nécessaires, et faire les manipulations d'UI uniquement pour la partie concernée par le test ("delete time period exception").

Corrigé.

[...]

Très sérieusement, ça fait un formulaire avec un champ "Libellé" suivi d'une description "Libellé optionnel"; gagnons du temps et de l'espace en mettant directement "Libellé optionnel" comme nom du champ.

Corrigé

#46

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

Quel était son rôle avant ?

Mystère, passons.

fields = ['desk', 'start_datetime', 'end_datetime', 'label']
...
exclude = []

Si fields est renseigné, exclude n'a pas besoin de l'être.

Question subsidiaire, trouve toi-même deux tickets à créer sur des détails à améliorer.

#47

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

Pas un lien pas de <a>. (et oui ça veut sans doute dire gérer le padding d'un <strong> tapé là direct.) (bon, je peux oublier)

J'ai ajouté de la css pour

Mais ça a décalé les noms des guichet. (vallait mieux oublier comme je le faisais)

#48

Mis à jour par Josué Kouka il y a plus de 6 ans

Mais ça a décalé les noms des guichet. (vallait mieux oublier comme je le faisais)

J'ai supprimé le bloque définissant le padding de la css

Si fields est renseigné, exclude n'a pas besoin de l'être.

Vrai, supprimé.

Question subsidiaire, trouve toi-même deux tickets à créer sur des détails à améliorer.

En cours de reflexion

#49

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

J'ai supprimé le bloque définissant le padding de la css

Soupir. Sans remettre le <a> et donc "Exceptions" se trouve collé au bord. Quand je notais "je peux oublier" c'était une suggestion de ne rien faire, parce que j'imaginais trop bien comment ça allait repartir pour trois tours.

#50

Mis à jour par Josué Kouka il y a plus de 6 ans

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

J'ai supprimé le bloque définissant le padding de la css

Soupir. Sans remettre le <a> et donc "Exceptions" se trouve collé au bord. Quand je notais "je peux oublier" c'était une suggestion de ne rien faire, parce que j'imaginais trop bien comment ça allait repartir pour trois tours.

Corrigé.

#51

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

J'ai voulu tester une dernière fois et d'un mauvais clic j'ai oublié d'entrer une date de fin et ça a explosé avec TypeError at /manage/agendas/82/desk/1/add-time-period-exception / can't compare datetime.datetime to NoneType.

#52

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

J'imagine le <form> présent ici pour le bénéfice de la popup, il faut lire gadjo.js et utiliser data-selector="..." pour plutôt préciser un sélecteur différent.

ok. data-selector="div.timeperiod" est maintenant utilisé.

Mais le <form> est resté :/ (je fatigue à devoir être continuellement attentif aux mêmes points)

#53

Mis à jour par Josué Kouka il y a plus de 6 ans

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

Mais le <form> est resté :/ (je fatigue à devoir être continuellement attentif aux mêmes points)

gadjo cherche un form en dessous du selector défini (http://git.entrouvert.org/gadjo.git/tree/gadjo/static/js/gadjo.js#n141-n148), enfin c'est ce que j'ai compris de ce bout de code.

#54

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

         * The dialog content is extracted from "form" (this selector can be
         * changed with a @data-selector attribute).

Si ça ne fonctionne pas, ça se corrige en commençant par un ticket dans gadjo.

#55

Mis à jour par Josué Kouka il y a plus de 6 ans

  • Lié à Bug #18887: Popup non affiché si aucun élement @form@ n'existe ajouté
#56

Mis à jour par Josué Kouka il y a plus de 6 ans

J'ai voulu tester une dernière fois et d'un mauvais clic j'ai oublié d'entrer une date de fin et ça a explosé avec TypeError at /manage/agendas/82/desk/1/add-time-period-exception / can't compare datetime.datetime to NoneType.

J'ai corrigé en ajoutant un control clean_end_datetime au niveau du formulaire

J'ai supprimé la balise form de la page listant les exceptions (en attendant le patch gadjo).

#57

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

J'avais posé une exception lors d'un test passé, qui couvrait encore aujourd'hui et demain et plus tard, et alors qu'elle est d'application elle n'apparait pas (get_exceptions_within_two_weeks devrait plutôt se baser sur end_time pour la borne basse).

Pire, j'ai commencé à jouer à partir de cette situation et j'ai découvert un bug majeur :

 id | label |     start_datetime     |      end_datetime      | desk_id 
----+-------+------------------------+------------------------+---------
 12 |       | 2017-10-21 00:00:00+02 | 2017-10-30 00:00:00+02 |       1
 13 |       | 2017-10-23 00:00:00+02 | 2017-10-24 00:00:00+02 |       1

Ces deux-là étant présentes, on s'attendrait à l'équivalent d'une exception allant du 21 au 30 (la première), mais non, ça fait comme si l'exclusion était du 21 au 24.

#58

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

Question subsidiaire, trouve toi-même deux tickets à créer sur des détails à améliorer.

Comme on est parti pour le weekend, je préviens déjà que je ne vais pas oublier ce point.

#59

Mis à jour par Josué Kouka il y a plus de 6 ans

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

J'avais posé une exception lors d'un test passé, qui couvrait encore aujourd'hui et demain et plus tard, et alors qu'elle est d'application elle n'apparait pas (get_exceptions_within_two_weeks devrait plutôt se baser sur end_time pour la borne basse).

Corrigé

Pire, j'ai commencé à jouer à partir de cette situation et j'ai découvert un bug majeur :

[...]

Ces deux-là étant présentes, on s'attendrait à l'équivalent d'une exception allant du 21 au 30 (la première), mais non, ça fait comme si l'exclusion était du 21 au 24.

Corrigé. Ce patch s'assure que les datetime min et max soient utilisés.

Comme on est parti pour le weekend, je préviens déjà que je ne vais pas oublier ce point.

Pour le moment je vois breadcrumb de TimePeriod et TimePeriodException. Je vais apporter les correctifs d'ici peu.

#60

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

J'avais posé une exception lors d'un test passé, qui couvrait encore aujourd'hui et demain et plus tard, et alors qu'elle est d'application elle n'apparait pas (get_exceptions_within_two_weeks devrait plutôt se baser sur end_time pour la borne basse).

Corrigé

Mais une exception qui est en cours mais se termine le mois prochain n'apparait plus. (genre fermeture d'un guichet pendant l'été, je n'invente pas de truc fantaisiste).

#61

Mis à jour par Josué Kouka il y a plus de 6 ans

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

J'avais posé une exception lors d'un test passé, qui couvrait encore aujourd'hui et demain et plus tard, et alors qu'elle est d'application elle n'apparait pas (get_exceptions_within_two_weeks devrait plutôt se baser sur end_time pour la borne basse).

Corrigé

Mais une exception qui est en cours mais se termine le mois prochain n'apparait plus. (genre fermeture d'un guichet pendant l'été, je n'invente pas de truc fantaisiste).

Je pense que c'est ok cette fois-ci.

#62

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

  • Lié à Development #18904: Jours fériés automatiques (poser systématiquement des exceptions aux récurrences dans les agendas de nos utilisateurs) ajouté
#63

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

Capture qui montre un gadjo pas à jour, tournée à l'eocamp. Je ne comprends pas comment vous continuez à vivre ainsi.

#64

Mis à jour par Josué Kouka il y a plus de 6 ans

Corrigé dans ce patch:
  • breadcrumb
  • le fait que Edit time period exception s'affichait lors de la création.

Je fais le ticket pour corriger le template TimePeriod.

#65

Mis à jour par Josué Kouka il y a plus de 6 ans

  • Lié à Bug #18937: breadcrumb ne s'affiche pas correctement sur la page d'édition d'une periode horaire ajouté
#66

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

-<a href="{% url 'chrono-manager-agenda-view' pk=desk.agenda.id %}">{{desk.agenda.label}}</a>
+<a href="{% url 'chrono-manager-agenda-view' pk=object.id %}">{{desk.label}}</a>

Ça me semble aussi peu correct avant (lien vers l'agenda alors que ce lien existe déjà dans le fil d'ariane via chrono/manager_agenda_view.html) qu'après, lien vers l'agenda mais avec le nom du guichet comme libellé. Pour un lien qui n'apparait pas. Ce qu'il faut, c'est que le dernier élément du fil d'ariane pointe vers la page en cours (cf agenda_view, dont le dernier lien est l'agenda).

Aussi, quand je demandais deux trucs à améliorer, c'était pour avoir des idées d'évolutions, de détails à affiner, plus tard, pas des bugs à corriger aujourd'hui. (mais oublions pour l'instant)

#67

Mis à jour par Josué Kouka il y a plus de 6 ans

Ok, file d'ariane corrigée.

#68

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

+{% if object.id %}
+<a href="{% url 'chrono-manager-agenda-view' pk=object.agenda.pk %}">{{object.label}}</a>
+{% endif %}

Affichage d'un lien vers l'agenda qui répète celui posé dans manager_agenda_view.html.

+{% endblock %}
+
+

Ligne blanche gratuite.

+{% if timeperiodexception.id %}
+<a href="{% url 'chrono-manager-time-period-exception-edit' pk=timeperiodexception.pk %}">{{timeperiodexception.label|default:timeperiodexception.pk}}</a>

Libellé / identifiant numérique alors qu'il y a eu unicode pour avoir une représentation.

Ahlala, je suggérerais d'oublier, d'arrêter d'essayer, de reprendre sur l'état en commentaire 61.

#70

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

Tu peux crier "Pour Brice" en poussant ça. Reste des améliorations que j'aimerais bien que tu imagines et notes dans de nouveaux tickets.

#71

Mis à jour par Josué Kouka il y a plus de 6 ans

  • Statut changé de En cours à Résolu (à déployer)

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

Tu peux crier "Pour Brice" en poussant ça. Reste des améliorations que j'aimerais bien que tu imagines et notes dans de nouveaux tickets.

Ok

commit 9d7738929cdcf99c6f19e70a983fb9cf02594965
Author: Josue Kouka <jkouka@entrouvert.com>
Date:   Thu Aug 24 14:15:18 2017 +0200

    add time period exception management (#12550)
#72

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

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF