zestedesavoir/zds-site

Supprimer un contenu ne supprime pas les alertes sur ses commentaires

philippemilink opened this issue · 1 comments

Comment reproduire ?

La liste des étapes qui permet de reproduire le bug :

  1. Signaler un commentaire sur un billet (ça devrait être pareil sur un article ou tutoriel, mais je trouve ça plus simple sur un billet)
  2. Se connecter avec le compte de l'auteur du billet
  3. Dépublier le billet
  4. Supprimer le billet
  5. En tant qu'admin, aller sur la page des alertes : une erreur 500 apparaît, parce que le commentaire associé à l'alerte est nul.

Origine du problème

La suppression du billet supprime en cascade les commentaires qui y ont été postés (ces commentaires sont représentés par la classe ContentReaction, qui hérite de Comment). Par contre, lors de la suppression des commentaires, les alertes associées ne sont pas supprimées, l'attribut comment prend alors la valeur None :

comment = models.ForeignKey(
Comment,
verbose_name="Commentaire",
related_name="alerts_on_this_comment",
db_index=True,
null=True,
blank=True,
on_delete=models.SET_NULL,
)

Je ne sais pas pourquoi c'est le cas. Si c'est juste une erreur, il suffit (a priori) d'utiliser models.CASCADE pour corriger le bug.

En fait lors du passage à Django 2.1 (#5233) où ont été introduit les on_delete, il y a eu pas mal d'hésitations sur quelle valeur donner à ce paramètre pour certains champs. Certains champs ont donc été mis à SET_NULL par mesure de précaution car c'est moins destructeur que CASCADE (qui comme son nom l'indique peut éventuellement tout supprimer en cascade).

Pour ce champ en particulier, je suppose que c'était soit une précaution à l'époque soit une erreur. Peut-être que @artragis se souvient ? En tous cas, je ne vois pas de contre-indication particulière qui empêcherait de mettre CASCADE ici.