Bug #44676
rendez-vous : empecher au niveau base la création de conflit sur des rdv
0%
Description
Actuellement il peut y avoir création dans la base de deux rendez-vous qui entrent en conflit, par exemple un rdv de 13h15 à 13h30 alors que juste avant un rdv 13h-14h est posé sur le même guichet.
Cela peut se produire en cas de demandes quasi simultannées car la vérification du conflit se fait au niveau de l'application (python).
Il faut traduire la contrainte dans le SQL (ou trouver une autre technique "transactionnelle").
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Thomas Noël il y a presque 4 ans
(d'une note de Benjamin sur #44644)
Il y a des index d'exclusion en PostgreSQL : https://www.postgresql.org/docs/9.6/sql-createtable.html#SQL-CREATETABLE-EXCLUDE
Mais ça demanderait que end_datetime soit matérialisé dans la table (on ne peut pas demander à postgres de le calculer à la volée depuis meeting_type__duration comme on le fait dans le code).
Ça donnerait alors quelque chose comme ça :
EXCLUDE USING GIST (desk_id WITH =, tstzrange(start_datetime, end_datetime) WITH &&)
Mis à jour par Thomas Noël il y a presque 4 ans
- Lié à Bug #44644: Crash sur /api/agenda/foo/meetings/bar/datetimes/ si des événements se chevauchent pour un même guichet ajouté
Mis à jour par Frédéric Péters il y a presque 4 ans
Il faut aussi que ça n'éclate pas les mises à jour de systèmes qui auraient de telles réservations, svp.
Mis à jour par Valentin Deniaud il y a presque 4 ans
Support natif depuis django 3.0 des contraintes postgres https://docs.djangoproject.com/en/3.0/ref/contrib/postgres/constraints/ (pour l'anecdote).
Mis à jour par Benjamin Dauvergne il y a presque 4 ans
Frédéric Péters a écrit :
Coté a2 j'ai eu un problème identique sur les liaisons FC qui n'était pas unique la stratégie pour éviter d'avoir à traiter le dédoublonnage a été :Il faut aussi que ça n'éclate pas les mises à jour de systèmes qui auraient de telles réservations, svp.
- ajouter une colonne "order INTEGER" ayant pour valeur par défaut 0
- assigner des valeurs 1, 2.. etc.. pour les doublons
- utiliser comme contrainte d'unicité (desk_id, (start, end), order)
Une fois que les doublons ont disparu ou sont dans le passé, on peut virer order.
Mis à jour par Lauréline Guérin il y a presque 4 ans
- Fichier 0001-agendas-PG-constraint-to-prevent-event-overlaping-44.patch 0001-agendas-PG-constraint-to-prevent-event-overlaping-44.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
note: il faut créer l'extension btree_Gist, et pour cela il faut les droits qui vont bien.
question: si cette solution est retenue, est-ce qu'on drop le support de toute autre DB que PG ?
Mis à jour par Frédéric Péters il y a presque 4 ans
C'est le genre de truc plutôt galère à obtenir, il faudrait pouvoir tourner sans, genre comme ça s'est passé pour l'indexation full text (https://git.entrouvert.org/combo.git/tree/combo/apps/search/migrations/0007_french_fts.py).
-- Add technical columns ALTER TABLE agendas_event ADD COLUMN end_datetime TIMESTAMP WITH TIME ZONE; ALTER TABLE agendas_event ADD COLUMN ignore_reason CHARACTER VARYING(20);
J'ajouterais un préfixe particulier à ces colonnes, pour ne pas risquer un jour conflit avec ce qu'on pourrait ajouter comme attribut. Je n'étais pas sûr de la légalité mais postgresql autorise un _ en premier caractère, je ferais ça.
Mis à jour par Lauréline Guérin il y a presque 4 ans
- Fichier 0001-agendas-PG-constraint-to-prevent-event-overlaping-44.patch 0001-agendas-PG-constraint-to-prevent-event-overlaping-44.patch ajouté
préfix ajouté;
j'ai aussi testé en local pour vérifier que ça tourne bien:
- migration en PG sans les droits pour créer l'extension (les colonnes et triggers ne sont pas créés)
- migration en PG avec les droits pour créer l'extension
- et le rollback de tout ça
- tests en sqlite (tests skippés)
- tests en PG sans les droits pour créer l'extension (tests skippés)
- tests en PG avec les droits (tests ok)
Mis à jour par Frédéric Péters il y a presque 4 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Lauréline Guérin il y a presque 4 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 6efa344ff641e94de43c6a7aad981ed039d9e3a7 Author: Lauréline Guérin <zebuline@entrouvert.com> Date: Fri Jul 17 14:47:31 2020 +0200 agendas: PG constraint to prevent event overlaping (#44676)
Mis à jour par Frédéric Péters il y a plus de 3 ans
- Statut changé de Résolu (à déployer) à Solution déployée
Mis à jour par Lauréline Guérin il y a presque 2 ans
- Lié à Bug #66374: IntegrityError: ERREUR: la valeur d'une clé en conflit rompt la contrainte d'exclusion « tstzrange_constraint » ajouté
agendas: PG constraint to prevent event overlaping (#44676)