Projet

Général

Profil

Development #16798

alimentation des exceptions via un ics

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

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
09 juin 2017
Echéance:
30 août 2017
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

De Thomas dans #12550 :

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


Fichiers

0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch (11,6 ko) 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch Serghei Mihai, 03 septembre 2017 16:07
0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch (13,6 ko) 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch Serghei Mihai, 06 septembre 2017 09:46
0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch (13,8 ko) 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch Serghei Mihai, 19 septembre 2017 18:37
agendas_manager.png (194 ko) agendas_manager.png Serghei Mihai, 19 septembre 2017 18:48
Screenshot-2017-9-19 Chrono.png (17 ko) Screenshot-2017-9-19 Chrono.png Frédéric Péters, 19 septembre 2017 19:44
0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch (14,2 ko) 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch Serghei Mihai, 20 septembre 2017 11:07
0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch (14,7 ko) 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch Serghei Mihai, 21 septembre 2017 21:25
0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch (14,7 ko) 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch Serghei Mihai, 27 septembre 2017 10:11
0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch (17 ko) 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch Serghei Mihai, 27 septembre 2017 15:01
0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch (17,5 ko) 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch Serghei Mihai, 27 septembre 2017 17:15
0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch (17,3 ko) 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch Serghei Mihai, 27 septembre 2017 17:25
0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch (18,2 ko) 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch Serghei Mihai, 27 septembre 2017 18:14
Screenshot-2017-9-27 Chrono.png (418 ko) Screenshot-2017-9-27 Chrono.png Frédéric Péters, 27 septembre 2017 20:54
0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch (18,6 ko) 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch Serghei Mihai, 28 septembre 2017 09:36
0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch (18,7 ko) 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch Serghei Mihai, 28 septembre 2017 11:10

Demandes liées

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

Actions
Lié à Gadjo - Development #18807: possibilité d'avoir un lien "upload" dans un listingFermé20 septembre 2017

Actions

Révisions associées

Révision d10a22d5 (diff)
Ajouté par Serghei Mihai il y a plus de 6 ans

agenda: import timeperiod exceptions from .ics (#16798)

Historique

#1

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

#2

Mis à jour par Serghei Mihai il y a plus de 6 ans

  • Echéance mis à 30 août 2017
  • Assigné à mis à Serghei Mihai
#3

Mis à jour par Serghei Mihai il y a plus de 6 ans

Première version avec tests de la fonction d'import, basée sur la branche wip/exception_multi_guichet_18111.
Il manque les tests du manager que j'ajouterai une fois que la GUI soit un peu plus claire.

#4

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

Ça ajoute un has_overlap(a, b) dont tu n'as que faire. (erreur lors d'un rebase)

create_timeperiod_exceptions_from_ics, si on décide de ne pas gérer la récurrence qui peut être définie dans l'ics, il faut lever une erreur quand une telle règle est définie (et si on veut gérer, dateutil.rrule fournit le nécessaire).

La gestion des erreurs : refuser le calendrier sur le moindre truc inattendu ou charger un maximum et fournir l'info sur ce qui n'a pas pu être chargé ? (

Côté UI on commence à avoir trop d'actions, il faudrait les réunir dans un menu (extra-actions-menu).

Ça relève du patch de gestion des exceptions mais autant déjà le noter ici, le modèle TimePeriodException est mauvais, ne devrait pas avoir d'attribut agenda (vu qu'on l'a via "desk").

event['start_datetime'] = vevent.dtstart.value

vevent.dtstart.value peut être un datetime.date() (cf https://www.mozilla.org/media/caldata/FrenchHolidays.ics, qui est l'exemple même de l'ics qu'on souhaiterait importer).

#5

Mis à jour par Serghei Mihai il y a plus de 6 ans

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

Ça ajoute un has_overlap(a, b) dont tu n'as que faire. (erreur lors d'un rebase)

Yep, je vais refaire le patch une fois les 2 branches wip validées et poussées.

create_timeperiod_exceptions_from_ics, si on décide de ne pas gérer la récurrence qui peut être définie dans l'ics, il faut lever une erreur quand une telle règle est définie (et si on veut gérer, dateutil.rrule fournit le nécessaire).

Il faudrait à cette occasion avoir des attributs dans TimePeriodException permettant de marquer la périodicité.

La gestion des erreurs : refuser le calendrier sur le moindre truc inattendu ou charger un maximum et fournir l'info sur ce qui n'a pas pu être chargé ? (

J'étais parti sur l'idée de "tout ou rien" car un .ics qui pour un event ne contient pas la date de début et de fin me semble invalide (sans lire la spec).

Côté UI on commence à avoir trop d'actions, il faudrait les réunir dans un menu (extra-actions-menu).

Ça relève du patch de gestion des exceptions mais autant déjà le noter ici, le modèle TimePeriodException est mauvais, ne devrait pas avoir d'attribut agenda (vu qu'on l'a via "desk").

Oui, j'en avais discuté avec Josué. C'était une première version se basant sur son code.

[...]

vevent.dtstart.value peut être un datetime.date() (cf https://www.mozilla.org/media/caldata/FrenchHolidays.ics, qui est l'exemple même de l'ics qu'on souhaiterait importer).

Ok.

#6

Mis à jour par Serghei Mihai il y a plus de 6 ans

Patch à jour par rapport à la branche wip/exception_multi_guichet_18111 sans gestion des reccurences (pour l'instant).

#7

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

                raise ICSError(_('Reccurent events not handled.'))

typo.

end_dt = datetime.datetime.combine(end_dt,
                                            datetime.datetime.max.time

Malheureusement non, cf l'ics avec les jours fériés :

SUMMARY:Lundi de Pâques
CATEGORIES:Jour férié
DTSTART;VALUE=DATE:20170417
DTEND;VALUE=DATE:20170418

→ la fin ne doit pas être le 18 avril à 23:59, ça ferait deux jours de congés.

J'étais parti sur l'idée de "tout ou rien" car un .ics qui pour un event ne contient pas la date de début et de fin me semble invalide (sans lire la spec).

Pourtant la spec serait pas mal. Mais même sans ça, regarde les ics https://www.data.gouv.fr/fr/datasets/le-calendrier-scolaire/ , il y a dedans un mélange d'événements (dtstart, pas de dtend, genre "Rentrée scolaire") et les vrais moments de congés (qui ont dtstart et dtend)

<li><a class="add" rel="popup" href="{% url 'chrono-manager-desk-add-import-time-period-exceptions' pk=desk.pk }">{ trans 'Import exceptions from .ics' %}</a></li>

Dans le ticket #12550 sur les exceptions, à parler d'ui, j'écrivais : « Et ouverture pour le ticket #16798, le choix d'un fichier ics se ferait dans la même boite de dialogue "Ajouter une exception". ».

#8

Mis à jour par Serghei Mihai il y a plus de 6 ans

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

<li><a class="add" rel="popup" href="{% url 'chrono-manager-desk-add-import-time-period-exceptions' pk=desk.pk }">{ trans 'Import exceptions from .ics' %}</a></li>

Dans le ticket #12550 sur les exceptions, à parler d'ui, j'écrivais : « Et ouverture pour le ticket #16798, le choix d'un fichier ics se ferait dans la même boite de dialogue "Ajouter une exception". ».

Ça donne un formulaire formulaire pas clair, à mon avis: on peut soit saisir une exception, soit importer un fichier qui crée plusieurs exceptions. Comment l'usager saura ce qu'il doit remplir? Une date ou un fichier? Lequel des deux sera pris en compte?
Et en deuxième temps il faudra rajouter un champ de type URL pour synchroniser les exceptions à partir d'une ressource webcal ou autre. Le formulaire sera trop chargé.

On pourrait envisager de placer les liens "Add a time period exception" et "Import exceptions from .ics" côte à côté?

#9

Mis à jour par Serghei Mihai il y a plus de 6 ans

Quelque chose comme dans la capture.

#10

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

Quelque chose comme dans la capture.

Gadjo pas à jour, ta tournée à l'eocamp. (les liens "remove" comme ça, horribles).

Ça donne un formulaire formulaire pas clair, à mon avis: on peut soit saisir une exception, soit importer un fichier qui crée plusieurs exceptions. Comment l'usager saura ce qu'il doit remplir? Une date ou un fichier? Lequel des deux sera pris en compte?

Les dialogues d'import de formulaire/workflow dans w.c.s. proposent champ fichier et url et je ne me souviens pas avoir lu quelqu'un poser cette question.

On pourrait envisager de placer les liens "Add a time period exception" et "Import exceptions from .ics" côte à côté?

Aujourd'hui on a calé cet affichage pour tenir cinq guichets, ça ne tiendra pas avec ces longs liens côte à côte. Plutôt, idée d'ajouter une icône http://fontawesome.io/icon/upload/ à droite, sur la ligne de titre "Exceptions", cf capture.

#11

Mis à jour par Serghei Mihai il y a plus de 6 ans

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

Aujourd'hui on a calé cet affichage pour tenir cinq guichets, ça ne tiendra pas avec ces longs liens côte à côte. Plutôt, idée d'ajouter une icône http://fontawesome.io/icon/upload/ à droite, sur la ligne de titre "Exceptions", cf capture.

Ok: #18807.

Patch à jour en gardant: <strong>{% trans 'Exceptions' %}</strong> dans manager_agenda_view.html

#12

Mis à jour par Serghei Mihai il y a plus de 6 ans

  • Lié à Development #18807: possibilité d'avoir un lien "upload" dans un listing ajouté
#15

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

@@ -37,12 +38,15 @@ AGENDA_KINDS = (
     ('meetings', _('Meetings')),
 )

-
 def is_midnight(dtime):
     dtime = localtime(dtime)
     return dtime.hour == 0 and dtime.minute == 0

Il y'a une suppression inutile de ligne.

Les lignes 397 à 403 ne sont pas couvertes par les tests, sinon ça m'a l'air ok.

#16

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

Les lignes 397 à 403 ne sont pas couvertes par les tests

(que ça soit clair, c'est un prérequis)

#18

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

"Recurrent events not handled", "Event "%s" without start date", ces messages vont être affichés à l'usager, faisons des phrases.

        messages.info(self.request, _('%d exceptions have been imported.') % exceptions)

Utiliser ngettext. Et afficher un message différent quand le fichier était vide.

#19

Mis à jour par Serghei Mihai il y a plus de 6 ans

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

"Recurrent events not handled", "Event "%s" without start date", ces messages vont être affichés à l'usager, faisons des phrases.
Utiliser ngettext.

Ok.

Et afficher un message différent quand le fichier était vide.

C'est déjà géré par Django. Il affiche "Le fichier soumis est vide.".

#21

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

C'est déjà géré par Django. Il affiche "Le fichier soumis est vide.".

Je voulais dire, quand il n'y a pas d'événement dedans.

#23

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

recurrent (un c deux r).

containing events with periods to exclude → ICS file where events will be considered as exceptions; une phrase complète se lira mieux, ça évite :

  Fichier ICS
  Parcourir
  contenant des événements...
        message = ungettext('%d exception has been imported.',
                    '%d exceptions have been imported.', exceptions)
        message = message % exceptions

Tant qu'à faire, aussi améliorer la phrase du cas solitaire :

        message = ungettext('An exception has been imported.',
                    '%(count)d exceptions have been imported.', exceptions)
        message = message % {'count': exceptions}

Capture amusante en pièce jointe, qui m'a laissé interloqué un certain temps, n'arrivant pas à comprendre comment le message "14 exceptions importées" avait pu être créé avec une si longue liste importée; une erreur dans la manière de compter, une gestion malgré tout de la récurrence amenée quelque part dans vobject ?

Mais au final non, c'est que lors d'un import l'erreur "rrule pas géré" peut venir après que quantités d'événements aient été enregistrés. Faut faire ça dans une transaction.

#25

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

+    ics_file = forms.FileField(label=_('ICS File'),
+                               help_text=_('where events will be considered as exceptions'))
ICS FILE
Browse
where events will be considered as exceptions
</rep>

Une phrase complète se lira mieux, vraiment.
#26

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

Et adapter les tests.

>       assert '1 exception has been imported.' in resp.content
E       assert '1 exception has been imported.' in '<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset="utf-8"/>\n    <title>\n  \n  Agendas\n</title>\n    <link rel="...  <div id="footer">\n    Chrono \xe2\x80\x94 Copyright \xc2\xa9 Entr\'ouvert\n  </div>\n\n  \n  \n  </body>\n</html>\n'
#28

Mis à jour par Serghei Mihai il y a plus de 6 ans

Oublié de commenter: help_text modifié et test corrigé

#29

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

Ok alors; ack.

#30

Mis à jour par Serghei Mihai il y a plus de 6 ans

  • Statut changé de En cours à Résolu (à déployer)
commit d10a22d564dc9f08c54e68571413bb357bc28a5b (HEAD -> master, origin/master, origin/HEAD)
Author: Serghei Mihai <smihai@entrouvert.com>
Date:   Sun Sep 3 13:28:50 2017 +0200

    agenda: import timeperiod exceptions from .ics (#16798)
#31

Mis à jour par Serghei Mihai il y a plus de 6 ans

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

Formats disponibles : Atom PDF