zestedesavoir / zds-site

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

On ne gère pas les demandes de mise en avant associées à des contenus supprimés #6625

Closed Situphen closed 4 months ago

Situphen commented 4 months ago

Les demandes de mises en avant sont représentées par l'objet FeaturedRequested qui peut faire référence à différents objets (contenu, sujet du forum...) grâce à la table l'infrastructure des types de contenus. Au lieu d'utiliser seulement un champ models.ForeignKey classique, on utilise un champ virtuel GenericForeignKey qui combine un champ models.ForeignKey pour stocker le type de contenu et un champ models.PositiveIntegerField pour stocker l'objet :

https://github.com/zestedesavoir/zds-site/blob/3505295ff9cf11d4026d9ef9cf2334f16ada8d9a/zds/featured/models.py#L59-L61

Lorsqu'on supprime un objet en base de données, les conséquences sur les autres objets sont généralement gérés par Django (via l'attribut on_delete sur les champs). Ce n'est pas le cas avec l'infrastructure des types de contenus. Dans notre cas, si un des objets (contenu, sujet du forum...) est supprimé, l'objet FeaturedRequested n'est pas supprimé en base de données et son champ content_object renvoie simplement None. Il faut donc prendre en compte que ce champ peut être nul dans notre code.

Ce n'est pas le cas dans le code de la vue FeaturedRequestedList qui correspond à l'URL /mise-en-avant/unes/requetes/ car cette ligne renvoie une AttributeError lorsque content_object est nul pour l'un des objets :

https://github.com/zestedesavoir/zds-site/blob/3505295ff9cf11d4026d9ef9cf2334f16ada8d9a/zds/featured/views.py#L257

À noter qu'il est possible (probable ?) que ce soucis soient présent ailleurs dans le code aussi !


Pour reproduire :

  1. (n'importe quel utilisateur) aller sur un contenu publié et cliquer sur "proposer la mise en une" dans la barre latérale
  2. (un staff) dépublier le contenu
  3. (l'auteur) enlever les éventuels autres auteurs et supprimer le contenu
philippemilink commented 4 months ago

Corrigé avec #6626