Completed
Pull Request — master (#17)
by Camille
01:23
created

User.is_group_member()   A

Complexity

Conditions 2

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 2.5
Metric Value
cc 2
dl 0
loc 6
ccs 1
cts 2
cp 0.5
crap 2.5
rs 9.4285
1
from django.db import models
2
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
3
from dry_rest_permissions.generics import allow_staff_or_superuser
4
5
from sigma_core.models.group import Group
6
7
class UserManager(BaseUserManager):
8
    # TODO: Determine whether 'memberships' fields needs to be retrieved every time or not...
9
    # def get_queryset(self):
10
    #     return super(UserManager, self).get_queryset().prefetch_related('memberships', 'invited_to_groups')
11
12
    def create_user(self, email, lastname, firstname, password=None):
13
        """
14
        Creates and saves a User with the given email, lastname, firstname and password
15
        TODO - Generate a unique username.
16
        """
17
        if not email:
18
            raise ValueError('Users must have an email address')
19
20
        # username = email # TODO - Generate unique username
21
22
        user = self.model(
23
            email=self.normalize_email(email),
24
            lastname=lastname,
25
            firstname=firstname
26
        )
27
28
        user.set_password(password)
29
        user.save()
30
        return user
31
32
    def create_superuser(self, email, lastname, firstname, password):
33
        """
34
        Creates and saves a superuser with the given email, lastname, firstname and password.
35
        """
36
        user = self.create_user(email, lastname, firstname, password)
37
        user.is_superuser = True
38
        user.is_staff = True
39
        user.save()
40
        return user
41
42
43
class User(AbstractBaseUser):
44
    """
45
    User are identified by their email. Lastname and firstname are required.
46
    """
47
    email = models.EmailField(max_length=254, unique=True)
48
    lastname = models.CharField(max_length=255)
49
    firstname = models.CharField(max_length=128)
50
    # username = models.CharField(max_length=128, unique=True) # TODO - Add unique username for frontend URLs
51
    phone = models.CharField(max_length=20, blank=True)
52
53
    is_active = models.BooleanField(default=True)
54
    last_modified = models.DateTimeField(auto_now=True)
55
    join_date = models.DateTimeField(auto_now_add=True)
56
57
    is_superuser = models.BooleanField(default=False)
58
    is_staff = models.BooleanField(default=False)
59
60
    objects = UserManager()
61
62
    invited_to_groups = models.ManyToManyField(Group, blank=True, related_name="invited_users");
63
64
    # Related fields:
65 1
    #   - memberships (model UserGroup)
66
67
    USERNAME_FIELD = 'email'
68
    REQUIRED_FIELDS = ['lastname', 'firstname']
69
70
    def __str__(self):
71
        return self.email
72
73
    def get_full_name(self):
74
        return "{} {}".format(self.lastname, self.firstname)
75
76
    def get_short_name(self):
77
        return self.email
78
79
    def is_sigma_admin(self):
80
        return self.is_staff or self.is_superuser
81
82
    def is_group_member(self, g):
83
        try:
84 1
            mem = self.memberships.get(group=g)
85
        except GroupMember.DoesNotExist:
86
            return False
87
        return mem.is_accepted()
88
89
    def can_invite(self, group):
90
        try:
91 1
            mem = self.memberships.get(group=group)
92
        except GroupMember.DoesNotExist:
93
            return False
94
        return mem.perm_rank >= group.req_rank_invite
95
96
    def can_accept_join_requests(self, group):
97
        try:
98
            mem = self.memberships.get(group=group)
99 1
        except GroupMember.DoesNotExist:
100
            return False
101
        return mem.perm_rank >= group.req_rank_accept_join_requests
102
103
    def can_modify_group_infos(self, group):
104
        try:
105
            mem = self.memberships.get(group=group)
106
        except GroupMember.DoesNotExist:
107 1
            return False
108
        return mem.perm_rank >= group.req_rank_modify_group_infos
109
110
111
    # Perms for admin site
112
    def has_perm(self, perm, obj=None):
113 1
        return True
114
115
    def has_module_perms(self, app_label):
116
        return True
117
118
    # Permissions
119
    @staticmethod
120 1
    def has_read_permission(request):
121
        """
122
        Only authenticated users can retrieve an users list.
123
        """
124
        return True
125
126
    def has_object_read_permission(self, request):
127
        """
128
        Only authenticated users can retrieve an user.
129
        """
130
        return True
131
132
    @staticmethod
133
    def has_write_permission(request):
134
        """
135
        Everybody can edit or create users, but with certain restraints specified in below functions.
136
        By the way, everybody can change one's password or reset it.
137
        """
138
        return True
139
140
    @staticmethod
141
    @allow_staff_or_superuser
142
    def has_create_permission(request):
143
        """
144
        Only Sigma admins can create users.
145
        """
146
        return False
147
148
    def has_object_write_permission(self, request):
149
        """
150
        Nobody has all write permissions on an user (especially, nobody can delete an user).
151
        """
152
        return False
153
154
    @allow_staff_or_superuser
155
    def has_object_update_permission(self, request):
156
        """
157
        Only Sigma admin and oneself can edit an user.
158
        """
159
        return request.user.id == self.id
160