from django.db import models from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin from utils.base_model import BaseModel from django.core.exceptions import ValidationError from utils.validations.mobile import normalize_mobile import uuid class CUserManager(BaseUserManager): def create_user(self, username, password, **extra_fields): if not username: raise ValueError("Please Enter username") extra_fields['mobile'] = normalize_mobile(extra_fields.get('mobile')) user = self.model(username=username, **extra_fields) user.set_password(password) user.full_clean() user.save(using=self._db) return user def create_superuser(self, username, password, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) extra_fields.setdefault('is_active', True) return self.create_user(username, password, **extra_fields) class CUser(BaseModel, AbstractBaseUser, PermissionsMixin): username = models.CharField(max_length=50, null=False, blank=False, unique=True) mobile = models.PositiveBigIntegerField(null=False, blank=False, unique=True) name_family = models.CharField(max_length=100, null=True, blank=True) is_active = models.BooleanField(default=False) is_staff = models.BooleanField(default=False) is_superuser = models.BooleanField(default=False) uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['mobile'] objects = CUserManager() class Meta: permissions = [ ('user_is_workspace_owner', 'user is workspace owner'), ('user_is_workspace_admin', 'user is workspace admin'), ('user_is_workspace_operator', 'user is workspace operator'), ('user_is_workspace_customer', 'user is workspace customer'), ] def __str__(self): return f'{self.name_family} - {self.username}' def clean(self): super().clean() self.mobile = normalize_mobile(self.mobile) if type(self).objects.filter(mobile=self.mobile).exclude(pk=self.pk).exists(): raise ValidationError({"mobile": "کاربری با این شماره موبایل قبلاً ثبت شده است."})