Projet

Général

Profil

Bug #25962

mettre à jour/créer les exceptions en fonction des dates et non du sommaire de l'evenement

Ajouté par Serghei Mihai il y a plus de 5 ans. Mis à jour il y a 5 mois.

Statut:
Rejeté
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
30 août 2018
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Pour des fichiers d'exception qui contiennent des evenements avec le même nom, mais UIDs différents.


Fichiers


Demandes liées

Lié à Chrono - Development #29209: matérialiser les sources d'exceptionsFermé19 décembre 2018

Actions

Historique

#2

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

Comme c'est le cas pour les exceptions importées depuis un ics distant, l'ajout/mise à jour des exceptions depuis un fichier devrait également se faire en se basant sur l'uid.

#3

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

La mise à jour de l'exception se base sur l'uid s'il est défini pour un evenement.

#4

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

Le premier ICS que tu modifies dans le test montre qu'il reste un autre cas problématique, à savoir des événements sans UID et qui ont le même nom. Ton patch ici ne concerne que le second cas (même nom mais heureusement, uid différentes).

Il faut donc régler le premier cas, et je pense que la seule solution est de dire que l'import a raté, ics mal formatté, il manque des uid.

#5

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

À rererelire ensemble, non, c'est pas comme ça qu'il faut faire, en fait le bug est plus profond, on fait du "update_or_create" sur l'import d'un ICS à la main, alors que non, faut pas faire d'update, ça n'a pas de sens, faut juste ajouter tout ce que l'ics comporte.

Et ne surtout par utiliser external_id qui est une indication qui veut dire "ça vient d'un ICS distant"

#6

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

  • Statut changé de Solution proposée à En cours
#7

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

Yep.
Sans toucher aux evenements réccurents qui se mettent à jour en fonction du titre et numéro de séquence.

#8

Mis à jour par Anonyme il y a plus de 5 ans

Serghei Mihai a écrit :

Yep.
Sans toucher aux evenements réccurents qui se mettent à jour en fonction du titre et numéro de séquence.

  • Je crois que la ligne 534 soit redondante avec 527 dans chrono/agendas/models.py
  • Si je comprends bien, et comme je ne connais pas bien chrono je dis ce que j'ai compris, mais c'est peut-être/sûrement pas ce que tu as cherché à faire : ligne 538, label='' permet de filtrer sur les objets à label == '' et **kwargs, mais mettre à jour avec le dict event comme paramètre pour default. C'est donc pour ça que tu as bien forcé la ligne 534 pour être sûr de ne pas avoir kwargs['label'] dans le filtre. Or là j'ai l'impression que tu te sers de filtrer sur label='' pour être sûr de ne rien trouver d'existant dans la base ?
  • tox=OK.
#9

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

Elias Showk a écrit :

Or là j'ai l'impression que tu te sers de filtrer sur label='' pour être sûr de ne rien trouver d'existant dans la base ?

Même avis, et pour moi c'est juste une bidouille... pas bien :)

#11

Mis à jour par Anonyme il y a plus de 5 ans

  • Statut changé de Solution proposée à Solution validée
  • Assigné à mis à Serghei Mihai

Ok, ça me va.
JE crois que le cas keep_synced_by_uid=True est du coup testé par l'existant test_timeperiodexception_creation_from_remote_ics c'est couvert à priori.

#12

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

  • Statut changé de Solution validée à En cours

Pour moi ça va pas, le TimePeriodException.objects.create(desk=self, **event) va créer des doublons quand la personne va importer son ics local x fois (avec des petits upgrades au fur et à mesure).

#13

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

Pour mieux s'entendre, faut (d'abord) revoir les tests :

Sur un ICS local :
  • import d'un ics avec un "event 1" : un seul élément doit être créé (event 1)
  • ajouter un event2 dans cet ics, l'importer : un seul élément doit être créé (event 2), l'autre pas touché
  • modifier le titre de l'event 1, importer l'ics : un seul élément doit être mis à jour (event 1, nouveau titre)
  • modifier la date de l'event 1, importer l'ics : un seul élément doit être créé (event 1 qui en fait n'a rien à voir avec l'ancien, qui reste là, tranquille)
  • à la fin, vérifier qu'il y a 3 events : event 1, event 2, event 1
Sur un ICS distant :
  • pareil
  • (et je suis pas du tout convaincu par l'usager des UID, au contraire, mais c'est un autre sujet ; pour le même algo basé sur dtstart/dtend/label devrait s'appliquer et voilà)

Sur les récurrents, mon avis c'est que l'algo devrait les traiter comme des event classiques, ie avoir une méthode "add_exception(event)" générique, qui gère les events ou leur récurrence, tout pareil. En fait, allez, de mon point de vue, l'algo m'est pas assez élégant actuellement pour permettre de faire un patch clair.

#14

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

Je propose ici de reprendre le fonctionnement pour l'ics local et traiter le cas de l'ics distant à part.

#15

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

Je modifie le sujet du ticket pour aller dans le sens des discussions.

Effectivement en l'état ça me semble un peu compliqué de séparer le code de création d'un evenement.
Je colle le premier patch permettant de créer et/ou mettre à jour un evenement en fonction de ces dates, même s'il s'agit d'un evenement recurrent qui contient une exception déjà définie par un evenement "classique".

#16

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

Pour moi la modification du kwargs dans la boucle des évènements récurrents va créer des doublons, la clé pour un évènement récurrent d'une source distante c'est (external_id, recurrence_id), ça ne doit pas changer, il faudrait au minimum protéger ces deux ligne par un if keep_synced_by_uid: juste avant.

Mais avant tout ça j'aimerai qu'on écrive noir sur blanc le comportement attendu:
  • pour un .ics distant, les exceptions avec external_id sont entièrement esclaves de celui-ci on supprime, on met à jour, on crée.
  • pour un .ics uploadé on fonctionne uniquement en ajout, mais donc jusqu'à présent via le label on pouvait éviter les doublons, là on veut remplacer ça par une recherche via start/end, soit.

Je me dis qu'en fait on devrait prendre chaque vevent et voir ce dont on dispose, si on a un uid même pour un .ics uploadé on s'en sert et on gère ça comme pour un .ics distant, si pas d'uid on fonctionne en simple ajout en vérifiant auparavant qu'on a pas une exception à la même date pour éviter les doublons évidents.

#17

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

Benjamin Dauvergne a écrit :

Je me dis qu'en fait on devrait prendre chaque vevent et voir ce dont on dispose, si on a un uid même pour un .ics uploadé on s'en sert et on gère ça comme pour un .ics distant, si pas d'uid on fonctionne en simple ajout en vérifiant auparavant qu'on a pas une exception à la même date pour éviter les doublons évidents.

Et donc pour continuer :
.ics distant .ics uploadé
uid pas uid uid pas uid
vevent ponctuel update-create(ext_id=uid,rec_id=0) raise update-create(ext_id=uid,rec_id=0) update_create(start=vevent.dtstart, end=vevent.dtend)
vevent récurrent update-create(ext_id=uid,rec_id=<counter>) raise update-create(ext_id=uid,rec_id=0) update-create(start=recevent.start, end=recevent.end)
nettoyage suppression des ext_id=id inconnus, et des ext_id=uid,rec_id><counter_last> impossible rien rien

À noter qu'il est impossible d'avoir un .ics uploadé avec UID mélangé avec un .ics distant pour un même guichet, les évènements uploadés seront nettoyés à chaque synchro de l'.ics distant car leur UID n'est pas présent (tout ce que ça indique c'est qu'une source unique serait vraiment mieux dans tous les cas).

#18

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

#19

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

  • Statut changé de Solution proposée à En cours
#20

Mis à jour par Valentin Deniaud il y a 5 mois

  • Statut changé de En cours à Rejeté

Serghei Mihai a écrit :

Comme c'est le cas pour les exceptions importées depuis un ics distant, l'ajout/mise à jour des exceptions depuis un fichier devrait également se faire en se basant sur l'uid.

Fonctionnement homogénéisé dans #29209, à peu près sûr qu'il n'y a plus de problème.

Formats disponibles : Atom PDF