Development #16798
alimentation des exceptions via un ics
0%
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
Demandes liées
Révisions associées
Historique
Mis à jour par Frédéric Péters il y a presque 7 ans
- Lié à Development #12550: exception aux récurrences ajouté
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Echéance mis à 30 août 2017
- Assigné à mis à Serghei Mihai
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Fichier 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch ajouté
- Statut changé de Nouveau à En cours
- Patch proposed changé de Non à Oui
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.
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).
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.
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Fichier 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch ajouté
Patch à jour par rapport à la branche wip/exception_multi_guichet_18111
sans gestion des reccurences (pour l'instant).
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". ».
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Fichier 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch ajouté
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é?
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Fichier agendas_manager.png agendas_manager.png ajouté
Quelque chose comme dans la capture.
Mis à jour par Frédéric Péters il y a plus de 6 ans
- Fichier Screenshot-2017-9-19 Chrono.png Screenshot-2017-9-19 Chrono.png ajouté
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.
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Fichier 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch ajouté
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
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é
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Fichier 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch ajouté
Patch à jour par rapport à la branche.
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Fichier 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch ajouté
Le même patch rebasé sur master.
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.
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)
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Fichier 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch ajouté
Avec test pour le manager.
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.
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Fichier 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch ajouté
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.".
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Fichier 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch ajouté
Et re-patch à jour avec la bonne file d'ariane.
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.
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Fichier 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch ajouté
Ok.
Mis à jour par Frédéric Péters il y a plus de 6 ans
- Fichier Screenshot-2017-9-27 Chrono.png Screenshot-2017-9-27 Chrono.png ajouté
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.
Mis à jour par Serghei Mihai il y a plus de 6 ans
- Fichier 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch 0001-agenda-import-timeperiod-exceptions-from-.ics-16798.patch ajouté
Avec la transaction et l'amélioration des textes.
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.
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'
Mis à jour par Serghei Mihai il y a plus de 6 ans
Mis à jour par Serghei Mihai il y a plus de 6 ans
Oublié de commenter: help_text modifié et test corrigé
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)
agenda: import timeperiod exceptions from .ics (#16798)