Files
djangocms/accounts/models.py
2024-11-19 13:00:24 +07:00

124 lines
4.5 KiB
Python

from django.db import models
from django.contrib.auth.models import AbstractUser
from accounts.manager import UserManager
from django.contrib.auth.models import BaseUserManager
from django.utils.text import slugify
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils import timezone
import uuid
class User(AbstractUser):
class Role(models.TextChoices):
Admin = 'Admin',"Admin"
Editor = 'Editor',"Editor"
is_verified = models.BooleanField(default=False , verbose_name='Is Verified')
role = models.CharField(max_length=255, verbose_name='Role' , choices=Role.choices, blank=True, null=True)
created = models.DateField(auto_now_add=True)
base_role = Role.Admin
objects = UserManager()
def save(self, *args, **kwargs):
if not self.pk and not self.role:
self.role = self.base_role
return super().save(*args, **kwargs)
def __str__(self):
return self.username
# manager
class CustomerUserManager(BaseUserManager):
def get_queryset(self ,*args, **kwargs) :
reasult = super().get_queryset(*args, **kwargs)
return reasult.filter(role=User.Role.Editor)
def create_user(self, email, password=None, **extra_fields):
if not email :
raise ValueError('Users must have an email address')
email = self.normalize_email(email)
user = self.model(email=email,**extra_fields)
user.set_password(password)
user.save()
return user
# User Profile
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
profile_picture = models.ImageField(upload_to='user_pictures/', blank=True, null=True)
name = models.CharField(max_length=255, blank=True, null=True)
slug = models.SlugField(max_length=255, blank=True, null=True)
email = models.EmailField(max_length=255, blank=True, null=True)
phone = models.CharField(max_length=255, blank=True, null=True)
address = models.CharField(max_length=255, blank=True, null=True)
city = models.CharField(max_length=255, blank=True, null=True)
state = models.CharField(max_length=255, blank=True, null=True)
country = models.CharField(max_length=255, blank=True, null=True)
zipcode = models.CharField(max_length=255, blank=True, null=True)
facebook = models.CharField(max_length=500, blank=True, null=True)
instagram = models.CharField(max_length=500, blank=True, null=True)
linkedin = models.CharField(max_length=500, blank=True, null=True)
def save(self, *args, **kwargs):
if self.pk:
original_profile = UserProfile.objects.get(pk=self.pk)
if original_profile.user.email != self.email:
# Email has changed, update it in the associated User model
original_profile.user.email = self.email
original_profile.user.save()
self.slug = slugify(self.user.username)
super(UserProfile, self).save(*args, **kwargs)
def getUserImage(self):
image_url = ""
if self.profile_picture:
image_url = self.profile_picture.url
else:
image_url = "https://cdn-icons-png.flaticon.com/128/3135/3135715.png"
return image_url
def __str__(self):
return self.user.username
# Password reset token generate
class PasswordResetToken(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
expiration_time = models.DateTimeField()
def __str__(self):
return str(self.token)
def is_expired(self):
now = timezone.now()
return now > self.expiration_time
# Signals
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(
user=instance,
email=instance.email,
name=instance.username,
slug=slugify(instance.username),
)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.userprofile.save()
# signals for User
@receiver(post_save, sender=User)
def create_customer_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.get_or_create(user=instance)
@receiver(post_save, sender=User)
def save_customer_profile(sender, instance, **kwargs):
if hasattr(instance, 'userprofile'):
instance.userprofile.save()