3
3
from django .contrib .auth .models import AbstractBaseUser , PermissionsMixin
4
4
from django .utils import timezone
5
5
from django .conf import settings
6
+ from django .urls import reverse
6
7
7
8
# UserManager imports
8
9
from django .contrib .auth .base_user import BaseUserManager
9
10
10
11
# Common Imports
11
- from django .utils .translation import gettext_lazy as _
12
+ from django .utils .translation import gettext_lazy as _
13
+
12
14
13
15
class UserManager (BaseUserManager ):
14
- def create_user (self , email , username , first_name , last_name ,password = None ):
16
+ def create_user (self , email , username , first_name , last_name , password = None ):
15
17
if not email :
16
18
raise ValueError ('Must have Email' )
17
19
if not username :
@@ -20,50 +22,54 @@ def create_user(self, email, username, first_name, last_name,password=None):
20
22
raise ValueError ('Must have first_name' )
21
23
if not last_name :
22
24
raise ValueError ('Must have last name' )
23
-
24
- user = self .model (
25
- email = self .normalize_email (email ),
26
- username = username ,
27
- first_name = first_name ,
28
- last_name = last_name ,
25
+
26
+ user = self .model (
27
+ email = self .normalize_email (email ),
28
+ username = username ,
29
+ first_name = first_name ,
30
+ last_name = last_name ,
29
31
)
30
32
user .set_password (password )
31
33
user .save (using = self ._db )
32
34
return user
33
35
34
36
def create_superuser (self , email , username , first_name , last_name , password = None ):
35
37
36
- user = self .create_user (
37
- email = email ,
38
- username = username ,
39
- first_name = first_name ,
40
- last_name = last_name ,
41
- password = password ,
38
+ user = self .create_user (
39
+ email = email ,
40
+ username = username ,
41
+ first_name = first_name ,
42
+ last_name = last_name ,
43
+ password = password ,
42
44
)
43
45
user .is_active = True
44
46
user .is_staff = True
45
47
user .is_admin = True
46
48
user .is_superuser = True
47
49
user .save (using = self ._db )
48
50
49
- return user
51
+ return user
52
+
50
53
51
54
class User (AbstractBaseUser ):
52
-
55
+
53
56
# compulsory fields
54
- email = models .EmailField (max_length = 255 ,unique = True )
55
- username = models .CharField (unique = True , max_length = 255 , null = True , blank = False )
56
- first_name = models .CharField (unique = False , max_length = 255 , null = True , blank = False , verbose_name = 'First Name' )
57
- last_name = models .CharField (unique = False , max_length = 255 , null = True , blank = False , verbose_name = 'Last Name' )
58
-
57
+ email = models .EmailField (max_length = 255 , unique = True )
58
+ username = models .CharField (
59
+ unique = True , max_length = 255 , null = True , blank = False )
60
+ first_name = models .CharField (
61
+ unique = False , max_length = 255 , null = True , blank = False , verbose_name = 'First Name' )
62
+ last_name = models .CharField (
63
+ unique = False , max_length = 255 , null = True , blank = False , verbose_name = 'Last Name' )
64
+
59
65
date_joined = models .DateTimeField (default = timezone .now )
60
66
61
- is_staff = models .BooleanField (default = False )
62
- is_admin = models .BooleanField (default = False )
67
+ is_staff = models .BooleanField (default = False )
68
+ is_admin = models .BooleanField (default = False )
63
69
is_superuser = models .BooleanField (default = False )
64
- is_active = models .BooleanField (default = True )
70
+ is_active = models .BooleanField (default = True )
65
71
66
- USERNAME_FIELD = 'email'
72
+ USERNAME_FIELD = 'email'
67
73
REQUIRED_FIELDS = ['first_name' , 'last_name' , 'username' ]
68
74
69
75
objects = UserManager ()
@@ -73,13 +79,50 @@ def __str__(self):
73
79
74
80
def has_perm (self , perm , obj = None ):
75
81
return True
76
-
82
+
77
83
def has_module_perms (self , app_label ):
78
84
return self .is_admin
79
85
86
+
80
87
class Profile (models .Model ):
81
- user = models .OneToOneField (settings .AUTH_USER_MODEL , on_delete = models .CASCADE )
88
+ user = models .OneToOneField (
89
+ settings .AUTH_USER_MODEL , on_delete = models .CASCADE )
82
90
image = models .ImageField (default = 'default.jpg' , upload_to = 'profile_pics' )
83
91
92
+
93
+ '''
94
+ explanation:
95
+ user : me
96
+
97
+ is_following: it is the collection of profile I follow
98
+ followed_by : it is the collection of profile following me,
99
+
100
+ followers: it is the collection of profiles following me, my followers
101
+ follows : it is the collection of profile I follow
102
+
103
+ follows = is_following, followers =
104
+ '''
105
+
106
+ isfollowing = models .ManyToManyField ('Profile' , blank = True , related_name = 'followers' )
107
+ followedby = models .ManyToManyField ('Profile' , blank = True , related_name = 'follows' )
108
+
109
+ def __str__ (self ):
110
+ return f'{ self .user .username } Profile'
111
+
112
+ def get_absolute_url (self ):
113
+ return reverse ('blog-post-user' , kwargs = {'username' : self .user .username })
114
+
115
+
116
+ class Follow (models .Model ):
117
+ to_user = models .ForeignKey (
118
+ settings .AUTH_USER_MODEL , related_name = 'request_from_users' , on_delete = models .CASCADE )
119
+ from_user = models .ForeignKey (
120
+ settings .AUTH_USER_MODEL , related_name = 'request_to_users' , on_delete = models .CASCADE )
121
+
84
122
def __str__ (self ):
85
- return f'{ self .user .username } Profile'
123
+ return f'From { self .from_user } to { self .to_user } '
124
+
125
+ # from django.contrib.auth import get_user_model
126
+ # >>> from users.models import Profile
127
+ # >>> from users.models import FriendRequest
128
+ # >>> User = get_user_model()
0 commit comments