Désinscription

| Q                         | R
| ------------------------- | -------------------------------------------
| Correction de bugs ?      | Oui
| Nouvelle Fonctionnalité ? | Oui
| Tickets concernés         | #818

Cette PR est la suite de la #1400 initiée par @artragis mais qui est directement sur le dépôt principal permettant ainsi à chacun d'y contribuer plus directement au vu de la complexité de celle-ci.

Elle également là suite à une erreur de ma part alors que j'ai souhaité corrigé un template sans lien avec cette PR.

Note : cette PR est basée sur `dev` et non plus sur `master` comme l'était la PR #1400.

En ayant une branche sur le dépôt principal, il faut donc faire des PR sur cette branche qui sera elle-même mergée via cette présente PR. Procéder ainsi permet de valider étape par étape les diverses modifications plutôt que de devoir revalider toutes les modifications. Aussi, chacun peu contribuer s'il le souhaite.



# QA

## Interface utilisateur (front)

- Lien de désinscription accessible via **Paramètres** (en en haut à droite de toute les pages sur l'avatar / roue dentée) puis **Désinscription** dans la barre latérale ;
- Le lien mène alors vers une page expliquant les conséquences de sa désinscription avec un bouton rouge en bas de celle-ci ;
- Le clic sur le bouton rouge ouvre une boite modale qui constitue le dernier avertissement avant le déclenchement du processus de désinscription.

## Effets de la désinscription (back)

- Suppression du profil, libèrant le pseudo et l'adresse courriel pour les futures inscriptions ;
- Le membre est déconnecté ;
- Les données du membre sont anonymisées : 
    - messages du forum ayant comme pseudo "Anonyme" ;
    - les sujets du forum restent ouverts mais ont comme auteur "Anonyme" ;
    - les galeries non liées à un tutoriel sont données à "Auteur externe" (puisque l'image peut être considérée comme venant d'un "auteur") avec droit de lecture et d'écriture ;
    - les MP sont anonymisés et le membre quitte les discussions auxquelles il participait ;
    - les commentaires de tutoriels/articles ont comme pseudo "Anonyme" ;
    - les articles et tutoriels suivent ces règles : 
        - si le tutoriel/article a été écrit par **plusieurs personne**; le membre est retiré de la liste des auteurs ;
        - si le tutoriel/article est **publié***, il passe sur le compte "Auteur externe", une demande expresse sera nécessaire au retrait complet de ses contenus ;
        - si le tutoriel/article n'est pas publié (brouillon, bêta, validation) il est supprimé ainsi que la galerie associée.


# Historique

Pour lire/voir/comprendre les diverses évolutions, il est possible que la réponse se trouve dans la PR #1400, passer rapidement dessus (Ctrl+F est votre ami :) pourra peut-être vous apporter des réponses.
En quoi cela pose-t-il problème?

Le principe (et je pense que le commentaire est assez claire, non?)
c'est que ce ne sont que des galeries sur le *forum*. On ne les garde
que pour éviter d'avoir des 404 sur les messages du forum qui ont été
anonymisés.

A priori, sauf si la gallerie a été partagée en écriture, il n'y a aucun
besoin à ce que quelqu'un récupère l'écriture puisque le but de garder
cette galerie est justement d'éviter des problèmes de *lecture* uniquement.
Le 17/09/2014 00:12, firm1 a écrit :
>
> In zds/member/views.py:
>
> > +    # - unpublished articles with only the unregistering member as an author
> > +    # - all category associated with those entites (have a look on article.delete_entity_and_tree
> > +    #   and tutorial.delete_entity_and_tree
> > +    # So concerning galleries, we just have for us
> > +    # - "personnal galleries" with only one owner (unregistering user)
> > +    # - "personnal galleries" with more than one owner
> > +    # so we will just delete the unretistering user ownership and give it to anonymous in the only case
> > +    # he was alone so that gallery is not lost
> > +    for gallery in UserGallery.objects.filter(user=current):
> > +        if gallery.gallery.get_users().count() == 1:
> > +            anonymousGallery = UserGallery()
> > +            anonymousGallery.user = external
> > +            anonymousGallery.mode = "w"
> > +            anonymousGallery.gallery = gallery.gallery
> > +            anonymousGallery.save()
> > +        gallery.delete()
>
> Petit souci avec ce code. Tel qu'il est écrit, ça signifique que si
> j'ai un user |A| avec les droits d'écritures, et un user |B| avec les
> droits de lectures sur la gallerie, si l'user |A| décide de partir, il
> ne restera plus qu'un user |B| dans la galerie et ce dernier n'aura
> plus les droits d'écriture sur cette gallerie.
>
> Il faut rajouter external dans la gallerie, s'il n'y a plus personne
> qui a les droits d'écriture sur cette gallerie
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/zestedesavoir/zds-site/pull/1469/files#r17634166>.
>