1
1
import uuid
2
2
3
+ from django .apps import apps
3
4
from django .contrib .auth .base_user import AbstractBaseUser
5
+ from django .contrib .auth .base_user import BaseUserManager
4
6
from django .contrib .auth .models import PermissionsMixin
5
- from django .contrib .auth .models import UserManager
6
7
from django .contrib .auth .validators import UnicodeUsernameValidator
7
8
from django .db import models
8
9
from phonenumber_field .modelfields import PhoneNumberField
@@ -27,6 +28,49 @@ def __repr__(self):
27
28
return f"<{ self .__class__ .__name__ } { self .uuid } >"
28
29
29
30
31
+ class UserManager (BaseUserManager ):
32
+ """
33
+ This is based on the UserManager from django 4.2
34
+ """
35
+
36
+ use_in_migrations = True
37
+
38
+ def _create_user (self , username , password , ** extra_fields ):
39
+ """
40
+ Create and save a user with the given username, email, and password.
41
+ """
42
+
43
+ # Lookup the real model class from the global app registry so this
44
+ # manager method can be used in migrations. This is fine because
45
+ # managers are by definition working on the real model.
46
+ if not username :
47
+ raise ValueError ("The given username must be set" )
48
+ global_user_model = apps .get_model (
49
+ self .model ._meta .app_label , self .model ._meta .object_name
50
+ )
51
+ username = global_user_model .normalize_username (username )
52
+ user = self .model (username = username , ** extra_fields )
53
+ user .set_password (password )
54
+ user .save (using = self ._db )
55
+ return user
56
+
57
+ def create_user (self , username , password = None , ** extra_fields ):
58
+ extra_fields .setdefault ("is_staff" , False )
59
+ extra_fields .setdefault ("is_superuser" , False )
60
+ return self ._create_user (username , password , ** extra_fields )
61
+
62
+ def create_superuser (self , username , password , ** extra_fields ):
63
+ extra_fields .setdefault ("is_staff" , True )
64
+ extra_fields .setdefault ("is_superuser" , True )
65
+
66
+ if extra_fields .get ("is_staff" ) is not True :
67
+ raise ValueError ("Superuser must have is_staff=True." )
68
+ if extra_fields .get ("is_superuser" ) is not True :
69
+ raise ValueError ("Superuser must have is_superuser=True." )
70
+
71
+ return self ._create_user (username , password , ** extra_fields )
72
+
73
+
30
74
class User (PermissionsMixin , AbstractBaseUser , AbstractBaseModel ):
31
75
"""
32
76
Table contains cognito-users & django-users.
@@ -61,7 +105,9 @@ class User(PermissionsMixin, AbstractBaseUser, AbstractBaseModel):
61
105
62
106
# Django-user related fields #
63
107
# password is inherited from AbstractBaseUser
64
- email_intake = models .EmailField ("Email address" , blank = True ) # allow non-unique emails
108
+ email_intake = models .EmailField (
109
+ "Email address" , blank = True
110
+ ) # allow non-unique emails
65
111
is_staff = models .BooleanField (
66
112
"staff status" ,
67
113
default = False ,
@@ -78,11 +124,15 @@ class User(PermissionsMixin, AbstractBaseUser, AbstractBaseModel):
78
124
"UserStatusType" , null = True , on_delete = models .PROTECT
79
125
)
80
126
# current_practice_area = models.ManyToManyField("PracticeArea")
81
- # target_practice_area = models.ManyToManyField("PracticeArea")
82
- practice_area_primary = models .ManyToManyField ("PracticeArea" , related_name = "primary_users" )
83
- practice_area_secondary = models .ManyToManyField ("PracticeArea" , related_name = "secondary_users" )
84
- practice_area_target_intake = models .ManyToManyField ("PracticeArea" , related_name = "target_intake_users" )
85
-
127
+ practice_area_primary = models .ManyToManyField (
128
+ "PracticeArea" , related_name = "primary_users" , blank = True
129
+ )
130
+ practice_area_secondary = models .ManyToManyField (
131
+ "PracticeArea" , related_name = "secondary_users" , blank = True
132
+ )
133
+ practice_area_target_intake = models .ManyToManyField (
134
+ "PracticeArea" , related_name = "target_intake_users" , blank = True
135
+ )
86
136
87
137
job_title_current_intake = models .CharField (max_length = 255 , blank = True )
88
138
job_title_target_intake = models .CharField (max_length = 255 , blank = True )
0 commit comments