Completed
Pull Request — master (#12)
by Camille
56s
created

UserViewSet   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 27
Duplicated Lines 0 %
Metric Value
dl 0
loc 27
rs 10
wmc 8
1
import random
2
import string
3
4
from django.core.mail import send_mail
5
from django.http import Http404
6
7
from rest_framework import viewsets, decorators, status
8
from rest_framework.response import Response
9
from dry_rest_permissions.generics import DRYPermissions
10
11
from sigma_core.models.user import User
12
from sigma_core.serializers.user import UserSerializer
13
14
15
reset_mail = {
16
    'from_email': '[email protected]',
17
    'subject': 'Mot de passe Sigma',
18
    'message': u"""
19
Bonjour,
20
Ton mot de passe Sigma a été réinitialisé.
21
C'est maintenant "{password}".
22
Cordialement,
23
L'équipe Sigma.
24
"""
25
}
26
27
28
class UserViewSet(viewsets.ModelViewSet):
29
    permission_classes = (DRYPermissions, )
30
    queryset = User.objects.all()
31
    serializer_class = UserSerializer
32
33
    def update(self, request, pk=None):
34
        try:
35
            user = User.objects.get(pk=pk)
36
        except User.DoesNotExist:
37
            return Http404()
38
39
        if ((request.data['lastname'] != user.lastname or request.data['firstname'] != user.firstname)) and not (request.user.is_staff or request.user.is_superuser):
40
            return Response('You cannot change your lastname or firstname', status=status.HTTP_400_BAD_REQUEST)
41
42
        return super(UserViewSet, self).update(request, pk)
43
44
    @decorators.list_route(methods=['get'])
45
    def me(self, request):
46
        """
47
        Give the data of the current user.
48
        """
49
        if request.user.__class__.__name__ == 'AnonymousUser':
50
            return Response(status=status.HTTP_401_UNAUTHORIZED)
51
        else:
52
            serializer = self.get_serializer_class()(request.user, context={'request': request})
53
            return Response(serializer.data)
54
55
    @decorators.list_route(methods=['put'])
56
    def change_password(self, request):
57
        """
58
        Allow current user to change his password.
59
        ---
60
        omit_serializer: true
61
        parameters_strategy:
62
            form: replace
63
        parameters:
64
            - name: old_password
65
              type: string
66
            - name: password
67
              type: string
68
        """
69
        if request.user.__class__.__name__ == 'AnonymousUser':
70
            return Response(status=status.HTTP_401_UNAUTHORIZED)
71
72
        user = request.user
73
        data = request.data
74
        if not user.check_password(data['old_password']):
75
            return Response("Wrong password", status=status.HTTP_403_FORBIDDEN)
76
        if data['password'] == "":
77
            return Response("'password' field cannot be empty", status=status.HTTP_400_BAD_REQUEST)
78
79
        user.set_password(data['password'])
80
        user.save()
81
        return Response('Password successfully changed', status=status.HTTP_200_OK)
82
83
    @decorators.list_route(methods=['post'])
84
    def reset_password(self, request):
85
        """
86
        Reset current user's password and send him an email with the new one.
87
        ---
88
        omit_serializer: true
89
        parameters_strategy:
90
            form: replace
91
        parameters:
92
            - name: email
93
              type: string
94
        """
95
        email = request.data.get('email')
96
        if email == '':
97
            return Response("'email' field cannot be empty", status=status.HTTP_400_BAD_REQUEST)
98
99
        try:
100
            user = User.objects.get(email=email)
101
        except User.DoesNotExist:
102
            return Response('No user found with this email', status=status.HTTP_404_NOT_FOUND)
103
104
        password = ''.join(random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for _ in range(10))
105
106
        mail = reset_mail.copy()
107
        mail['recipient_list'] = [user.email]
108
        mail['message'] = mail['message'].format(email=user.email, password=password, name=user.get_full_name())
109
        send_mail(**mail)
110
111
        user.set_password(password)
112
        user.save()
113
114
        return Response('Password reset', status=status.HTTP_200_OK)
115