Completed
Pull Request — master (#10)
by Camille
58s
created

User.has_object_write_permission()   A

Complexity

Conditions 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 1
dl 0
loc 5
rs 9.4286
1
from django.db import models
2
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
3
4
from dry_rest_permissions.generics import allow_staff_or_superuser, authenticated_users
5
6
7
class UserManager(BaseUserManager):
8
    def create_user(self, email, lastname, firstname, password=None):
9
        """
10
        Creates and saves a User with the given email, lastname, firstname and password
11
        TODO - Generate a unique username.
12
        """
13
        if not email:
14
            raise ValueError('Users must have an email address')
15
16
        # username = email # TODO - Generate unique username
17
18
        user = self.model(
19
            email=self.normalize_email(email),
20
            lastname=lastname,
21
            firstname=firstname
22
        )
23
24
        user.set_password(password)
25
        user.save()
26
        return user
27
28
    def create_superuser(self, email, lastname, firstname, password):
29
        """
30
        Creates and saves a superuser with the given email, lastname, firstname and password.
31
        """
32
        user = self.create_user(email, lastname, firstname, password)
33
        user.is_superuser = True
34
        user.is_staff = True
35
        user.save()
36
        return user
37
38
39
class User(AbstractBaseUser):
40
    """
41
    User are identified by their email. Lastname and firstname are required.
42
    """
43
    email = models.EmailField(max_length=254, unique=True)
44
    lastname = models.CharField(max_length=255)
45
    firstname = models.CharField(max_length=128)
46
    # username = models.CharField(max_length=128, unique=True) # TODO - Add unique username for frontend URLs
47
    phone = models.CharField(max_length=20, blank=True)
48
49
    is_active = models.BooleanField(default=True)
50
    last_modified = models.DateTimeField(auto_now=True)
51
    join_date = models.DateTimeField(auto_now_add=True)
52
53
    is_superuser = models.BooleanField(default=False)
54
    is_staff = models.BooleanField(default=False)
55
56
    objects = UserManager()
57
58
    USERNAME_FIELD = 'email'
59
    REQUIRED_FIELDS = ['lastname', 'firstname']
60
61
    def __str__(self):
62
        return self.email
63
64
    def get_full_name(self):
65
        return "{} {}".format(self.lastname, self.firstname)
66
67
    def get_short_name(self):
68
        return self.email
69
70
    # Perms for admin site
71
    def has_perm(self, perm, obj=None):
72
        return True
73
74
    def has_module_perms(self, app_label):
75
        return True
76
77
    # Permissions
78
    @staticmethod
79
    @authenticated_users
80
    def has_read_permission(request):
81
        """
82
        Only authenticated users can retrieve an users list.
83
        """
84
        return True
85
86
    @authenticated_users
87
    def has_object_read_permission(self, request):
88
        """
89
        Only authenticated users can retrieve an user.
90
        """
91
        return True
92
93
    @staticmethod
94
    def has_write_permission(request):
95
        """
96
        Everybody can edit or create users, but with certain restraints specified in below functions.
97
        """
98
        return True
99
100
    @staticmethod
101
    @allow_staff_or_superuser
102
    def has_create_permission(request):
103
        """
104
        Only Sigma admins can create users.
105
        """
106
        return False
107
108
    def has_object_write_permission(self, request):
109
        """
110
        Nobody has all write permissions on an user (espacially, nobody can delete an user).
111
        """
112
        return False
113
114
    @allow_staff_or_superuser
115
    def has_object_update_permission(self, request):
116
        """
117
        Only Sigma admin and oneself can edit an user.
118
        """
119
        return request.user.id == self.id
120