Completed
Pull Request — master (#17)
by Camille
06:10
created

User.is_sigma_admin()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

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