zds-site icon indicating copy to clipboard operation
zds-site copied to clipboard

Refactoriser Profile pour faciliter la gestion des sanctions par du code client

Open Arnaud-D opened this issue 2 years ago • 0 comments

Actuellement, la récupération du statut des sanctions sur un profil se fait de différentes manières dans le code :

  • soit via une abstraction qui est essentiellement celle de la BDD, avec deux champs qu'on manipule ensemble pour découvrir ce qui est appliqué actuellement ;
  • soit via une fonction du genre can_read_now ou can_write_now, qui est effectivement un miroir des sanctions, mais qui ne sont pas explicites dans tous les contextes et sont un peu plus compliquées que nécessaire, et ne sont pas utilisées partout.

Pour l'application des sanctions, le code est actuellement dans les modèles de sanction (qui est un log des actions de sanction concrètement) qui n'est pas le meilleur selon moi. On y retrouve du code qui touche aux profils :

profile.end_ban_write = None
profile.can_write = False
profile.save()`

Il serait mieux dans le profil, et ça peut aussi aider à mieux normaliser/garantir les invariants.

Je propose donc de changer pour plus de simplicité, en ayant des interfaces explicites renvoyant directement aux concepts du site pour le code client. Quelque chose du genre :

  • pour récupérer le statut : is_banned, is_permanently_banned, is_temporarily_banned, is_readonly, etc.
  • pour appliquer les sanctions : apply_permanent_ban, apply_temporary_readonly, etc.
  • pour supprimer les sanctions : lift_ban, lift_readonly.

Ça recentrerait chaque modèle sur son job :

  • Profile sert à stocker le statut de sanction d'un membre.
  • Ban (qui a un nom bof) sert à loguer l'application et la levée des sanctions.

Il y aurait peut être à réfléchir aussi du côté de MemberSanctionState, qui est probablement simplifiable. Actuellement, ça sert de support à la vue modify_profile, mais ça me paraît un peu compliqué pour ce que ça fait.

Arnaud-D avatar Jul 18 '22 16:07 Arnaud-D