-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathuser.py
More file actions
122 lines (92 loc) · 3.79 KB
/
user.py
File metadata and controls
122 lines (92 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
from types import SimpleNamespace
from typing import Optional
from allauth.account.models import EmailAddress
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.base_user import BaseUserManager
from django.db import models
from django.conf import settings
class UserManager(BaseUserManager):
def get_queryset(self):
return super().get_queryset().select_related("organization")
def create_user(self, email, password, **extra_fields):
if email is None:
raise ValueError("Users must have an email address")
normalized_email = self.normalize_email(email)
user = self.model(
username=normalized_email, email=normalized_email, **extra_fields
)
user.is_ownership_allowed = (
user.is_superuser or settings.ACCOUNT_OWNERSHIP_ENABLED
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault("is_staff", True)
extra_fields.setdefault("is_superuser", True)
extra_fields.setdefault("user_type", "Admin")
user = self.create_user(email, password, **extra_fields)
EmailAddress.objects.create(user=user, email=email, verified=True, primary=True)
return user
class User(AbstractUser):
email = models.EmailField(unique=True)
middle_name = models.CharField(max_length=30, blank=True, null=True)
phone = models.CharField(max_length=15, blank=True, null=True)
address = models.CharField(max_length=255, blank=True, null=True)
link = models.URLField(max_length=2000, blank=True, null=True)
user_type = models.CharField(max_length=255)
organization = models.OneToOneField(
"Organization",
on_delete=models.SET_NULL,
blank=True,
null=True,
related_name="user",
)
is_ownership_allowed = models.BooleanField(default=False)
@property
def permissions(self):
# TODO: Will be replaced by updated permissions system.
return SimpleNamespace(enabled=lambda: False)
@property
def name(self):
return self.__str__
@property
def organization_name(self):
return self.organization.name if self.organization else None
@property
def account_type(self):
if self.is_superuser:
return "admin"
elif self.is_ownership_allowed:
return "standard"
else:
return "limited"
objects = UserManager()
USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["first_name", "last_name"]
def save(self, *args, **kwargs):
if self.email:
self.username = self.email
super().save(*args, **kwargs)
def delete(self, *args, **kwargs):
self.delete_contents(filter_arg=self, filter_suffix="")
if self.organization:
self.organization.delete()
super().delete(*args, **kwargs)
@staticmethod
def delete_contents(filter_arg: models.Model, filter_suffix: Optional[str]):
from domains.iam.models import Workspace, Collaborator
user_relation_filter = f"user__{filter_suffix}" if filter_suffix else "user"
owner_relation_filter = f"owner__{filter_suffix}" if filter_suffix else "owner"
Collaborator.objects.filter(**{user_relation_filter: filter_arg}).delete()
Workspace.delete_contents(
filter_arg=filter_arg, filter_suffix=owner_relation_filter
)
Workspace.objects.filter(**{owner_relation_filter: filter_arg}).delete()
def __str__(self):
return f"{self.first_name} {self.last_name}".strip()
class UserType(models.Model):
name = models.CharField(max_length=255, unique=True)
public = models.BooleanField(default=True)
def __str__(self):
return self.name