~widelands-dev/widelands-website/django_staticfiles

« back to all changes in this revision

Viewing changes to wlprofile/views.py

  • Committer: franku
  • Date: 2018-09-19 18:30:17 UTC
  • mfrom: (497.2.17 delete_user)
  • Revision ID: somal@arcor.de-20180919183017-0mhtkxmycgn3b4lz
make it possible for a user to delete himself, anonymize his data

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
from django.urls import reverse
5
5
from django.contrib.auth.decorators import login_required
6
6
from django.contrib.auth.models import User
7
 
from django.shortcuts import render
 
7
from django.shortcuts import render, redirect
8
8
from django.http import HttpResponseRedirect
9
9
from django.shortcuts import get_object_or_404
 
10
from django.conf import settings
10
11
 
11
12
from forms import EditProfileForm
12
 
import settings
13
 
 
14
 
# Settings
 
13
 
 
14
 
 
15
@login_required
 
16
def delete_me(request):
 
17
    """Show a page to inform the user what deleting means."""
 
18
 
 
19
    context = {
 
20
        'user': request.user
 
21
    }
 
22
    return render(request, 'wlprofile/delete_me.html',
 
23
                  context)
 
24
 
 
25
 
 
26
@login_required
 
27
def do_delete(request):
 
28
    """Delete user specific data.
 
29
 
 
30
    We can't really delete a user who has posted some valid posts (no spam) because otherwise
 
31
    we have foreign keys constraints in the database. All we can do is to do some cleanup and
 
32
    anonymization.
 
33
    """
 
34
 
 
35
    from django.contrib.auth import logout
 
36
    from wlprofile.models import Profile
 
37
    from notification.models import NoticeSetting
 
38
 
 
39
    user = get_object_or_404(User, username=request.user)
 
40
 
 
41
    # Log the user out. We do this as early as possible but after
 
42
    # we get the User object.
 
43
    logout(request)
 
44
 
 
45
    # Clean possible Playtime availabilities
 
46
    from wlscheduling.models import Availabilities
 
47
    try:
 
48
        events = Availabilities.objects.filter(user=user)
 
49
        for event in events:
 
50
            event.delete()
 
51
    except:
 
52
        pass
 
53
            
 
54
    # Clean the Online gaming password
 
55
    from wlggz.models import GGZAuth
 
56
    try:
 
57
        ggz_user = GGZAuth.objects.get(user=user)
 
58
        ggz_user.delete()
 
59
    except:
 
60
        pass
 
61
 
 
62
    # Clean the profile
 
63
    profile = user.wlprofile
 
64
    upload_to = Profile._meta.get_field('avatar').upload_to
 
65
    
 
66
    if upload_to in profile.avatar.name:
 
67
        # Delete the avatar file
 
68
        profile.avatar.delete()
 
69
    
 
70
    # Delete the profile and recreate it to get a clean profile page
 
71
    # We create a new one to have the anymous.png as avatar
 
72
    profile.delete()
 
73
    profile = Profile(user=user, deleted=True)
 
74
    profile.save()
 
75
 
 
76
    # Deactivate all subscriptions
 
77
    notice_settings = NoticeSetting.objects.filter(user=user)
 
78
    for setting in notice_settings:
 
79
        setting.send = False
 
80
        setting.save()
 
81
 
 
82
    # Put all PMs in the trash of the user. They stay as long in the trash until the sender or recipient
 
83
    # has also put the message in the trash.
 
84
    from django_messages.models import Message
 
85
    from datetime import datetime
 
86
    messages = Message.objects.inbox_for(user)
 
87
    for message in messages:
 
88
        message.recipient_deleted_at = datetime.now()
 
89
        message.save()
 
90
    messages = Message.objects.outbox_for(user)
 
91
    for message in messages:
 
92
        message.sender_deleted_at = datetime.now()
 
93
        message.save()
 
94
 
 
95
    # Do some settings in django.auth.User
 
96
    user.is_active = False
 
97
    user.is_staff = False
 
98
    user.is_superuser = False
 
99
    user.email = settings.DELETED_MAIL_ADDRESS
 
100
    user.save()
 
101
 
 
102
    return redirect('mainpage')
15
103
 
16
104
 
17
105
@login_required