Projet

Général

Profil

Bug #44676

rendez-vous : empecher au niveau base la création de conflit sur des rdv

Ajouté par Thomas Noël il y a presque 4 ans. Mis à jour il y a plus de 3 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
01 juillet 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

Lié à Chrono - Bug #44644: Crash sur /api/agenda/foo/meetings/bar/datetimes/ si des événements se chevauchent pour un même guichet Fermé30 juin 2020

Actions
Lié à Chrono - Bug #66374: IntegrityError: ERREUR: la valeur d'une clé en conflit rompt la contrainte d'exclusion « tstzrange_constraint »Fermé17 juin 2022

Actions

Révisions associées

Révision 6efa344f (diff)
Ajouté par Lauréline Guérin il y a presque 4 ans

agendas: PG constraint to prevent event overlaping (#44676)

Historique

#1

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 &&)
#2

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é
#3

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.

#4

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).

#5

Mis à jour par Benjamin Dauvergne il y a presque 4 ans

Frédéric Péters a écrit :

Il faut aussi que ça n'éclate pas les mises à jour de systèmes qui auraient de telles réservations, svp.

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é :
  • 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.

#6

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

  • Assigné à mis à Lauréline Guérin
#7

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

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 ?

#8

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.

#9

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

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)

#10

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

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

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)
#12

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
#13

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é

Formats disponibles : Atom PDF