Projet

Général

Profil

Bug #55279

Trace sur import : TimePeriodExceptionSource créé deux fois

Ajouté par Emmanuel Cazenave il y a presque 3 ans. Mis à jour il y a presque 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
30 juin 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

django.db.utils.IntegrityError: duplicate key value violates unique constraint "agendas_timeperiodexcept_desk_id_settings_slug_acda525b_uniq" 
DETAIL:  Key (desk_id, settings_slug)=(22, holidays) already exists

Fichiers

Révisions associées

Révision 886f316e (diff)
Ajouté par Emmanuel Cazenave il y a presque 3 ans

agendas: stop creating exceptions holder desk in the 'save' method (#55279)

Historique

#1

Mis à jour par Emmanuel Cazenave il y a presque 3 ans

La trace plus complète :

ile "/home/cazino/src/chrono/chrono/manager/views.py" in form_valid
  779.             results = import_site(agendas_json, overwrite=False)

File "/home/cazino/src/chrono/chrono/manager/utils.py" in import_site
  71.                 created = cls.import_json(data, overwrite=overwrite)

File "/home/cazino/src/chrono/chrono/agendas/models.py" in import_json
  464.                 Desk.import_json(exceptions_desk)

File "/home/cazino/src/chrono/chrono/agendas/models.py" in import_json
  1935.             TimePeriodExceptionSource.import_json(source)

File "/home/cazino/src/chrono/chrono/agendas/models.py" in import_json
  2313.         source, _ = cls.objects.update_or_create(**data)

Ça se produit lorsque l'on veut importer un agenda de type évènement sur lequel la source d'exception 'holidays' est active :

  • l'import passe dans Agenda.save qui est intelligent et qui crée un Desk plus TimePeriodExceptionSource 'holidays' associé mais désactivé
  • plus loin Desk.import_json qui appelle TimePeriodExceptionSource.import_json qui fait un update_or_create qui ne retrouve pas la TimePeriodExceptionSource précédemment créée parce qu'elle est inactive, il veut alors la créer, boum.

Le fix consiste à rendre Agenda.save bête et à créer Desk et TimePeriodExceptionSource dans la vue du manager. Du coup pleins de tests à modifier mais ça me parait beaucoup mieux sur le long terme que Agenda.save redevienne bête.

#2

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

Du coup pleins de tests à modifier

Et si à la place d'un get dans AgendaSettings.get_context_data, tu mettais un get_or_create ?

Sinon (ou en plus, pour quand même avoir un save plus simple), comme on n'exporte que les sources from settings (celles avec settings_slug non null), et qu'on a un unique_together (desk, settings_slug), il s'agirait de sortir desk et settings_slug lors de l'import:

data = clean_import_data(cls, data)
desk = data.pop('desk')
settings_slug = data.pop('settings_slug')
cls.objects.update_or_create(desk=desk, settings_slug=settings_slug, defaults=data)

(à cause de cette contrainte d'unicité ça serait quand même plus safe)

#3

Mis à jour par Emmanuel Cazenave il y a presque 3 ans

Lauréline Guerin a écrit :

Et si à la place d'un get dans AgendaSettings.get_context_data, tu mettais un get_or_create ?

Fait (je ne repasse pas sur les tests, yen a trop)

Sinon

Fait.

#4

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

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

je ne repasse pas sur les tests, yen a trop

Dommage :)

#5

Mis à jour par Emmanuel Cazenave il y a presque 3 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 886f316e5c5312f1ef6597dcf76f946fbd2478b4
Author: Emmanuel Cazenave <ecazenave@entrouvert.com>
Date:   Wed Jun 30 15:50:00 2021 +0200

    agendas: stop creating exceptions holder desk in the 'save' method (#55279)
#6

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

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF