zestedesavoir / zds-site

Cœur du projet technique de Zeste de Savoir
https://zestedesavoir.com
Other
268 stars 161 forks source link

Ajoute une contrainte d'unicité sur PrivateTopicRead #6558

Closed philippemilink closed 11 months ago

philippemilink commented 1 year ago

Sentry nous rapporte que l'erreur suivante s'est produite :

PrivateTopicRead.MultipleObjectsReturned: get() returned more than one PrivateTopicRead -- it returned 2!
[...]
File "zds/mp/views.py", line 215, in get_context_data
    mark_read(self.object, self.request.user)
File "zds/mp/models.py", line 560, in mark_read
    topic = PrivateTopicRead.objects.filter(privatetopic=privatetopic, user=user).get()

En effet, la base de données contient 4 couples privatetopic et user en double.

À défaut de comprendre comment ils ont pu être créés, je rajoute une contrainte d'unicité sur ce couple.

Instructions de QA

coveralls commented 1 year ago

Coverage Status

coverage: 88.811% (-0.02%) from 88.827% when pulling 6f288e977f34d8a0bd0d151a71c3aea31b29d55c on philippemilink:unique_privatetopicread into fbdd9801fb3156b0b2780e49cf9c059c750e3f95 on zestedesavoir:dev.

Arnaud-D commented 1 year ago

Comment ça va se passer avec les potentiels doublons dans la base de prod ? Il faut les gérer avec la migration ?

philippemilink commented 1 year ago

Comment ça va se passer avec les potentiels doublons dans la base de prod ? Il faut les gérer avec la migration ?

Bonne question ! :) Pour chaque couple en double, je vais en supprimer un manuellement.

philippemilink commented 11 months ago

Tu as déjà supprimé les doublons où tu le rajoutes sur ta liste de courses pour le déploiement ?

Je ne fusionne pas tout de suite pour ne pas oublier de noter ça quelque part.

Je viens de supprimer les doublons (enfin, un de chaque doublon, pour que ce ne soit plus des doublons). Pour en garder une trace, voilà les commandes effectuées :

SELECT 
    t.*
FROM mp_privatetopicread t 
INNER JOIN (
    SELECT 
        user_id,
        privatetopic_id,
        COUNT(*) AS nb
    FROM mp_privatetopicread
    GROUP BY user_id, privatetopic_id
    HAVING nb > 1
) g ON t.user_id=g.user_id AND t.privatetopic_id=g.privatetopic_id;

DELETE FROM mp_privatetopicread WHERE id IN(<ids des lignes à supprimer>);

J'ai sauvegardé les lignes supprimées ; si jamais il y a un problème, on pourra les restaurer.

Je rebase et je merge.