Bug #55279
Trace sur import : TimePeriodExceptionSource créé deux fois
0%
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
Historique
Mis à jour par Emmanuel Cazenave il y a presque 3 ans
- Fichier 0001-agendas-create-exceptions-holder-desk-in-the-manager.patch 0001-agendas-create-exceptions-holder-desk-in-the-manager.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
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 unDesk
plusTimePeriodExceptionSource
'holidays' associé mais désactivé - plus loin
Desk.import_json
qui appelleTimePeriodExceptionSource.import_json
qui fait un update_or_create qui ne retrouve pas laTimePeriodExceptionSource
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.
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)
Mis à jour par Emmanuel Cazenave il y a presque 3 ans
- Fichier 0001-agendas-stop-creating-exceptions-holder-desk-in-the-.patch 0001-agendas-stop-creating-exceptions-holder-desk-in-the-.patch ajouté
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.
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 :)
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)
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
agendas: stop creating exceptions holder desk in the 'save' method (#55279)