from django.contrib.auth.models import BaseUserManager from .mobile import normalize_mobile class UserManager(BaseUserManager): """Users are identified by mobile number, not username.""" use_in_migrations = True def _create_user(self, mobile, password=None, **extra_fields): if not mobile: raise ValueError("A mobile number is required.") user = self.model(mobile=normalize_mobile(mobile), **extra_fields) if password: user.set_password(password) else: user.set_unusable_password() user.save(using=self._db) return user def create_user(self, mobile, password=None, **extra_fields): extra_fields.setdefault("is_staff", False) extra_fields.setdefault("is_superuser", False) return self._create_user(mobile, password, **extra_fields) def create_superuser(self, mobile, password=None, **extra_fields): extra_fields.setdefault("is_staff", True) extra_fields.setdefault("is_superuser", True) extra_fields.setdefault("is_active", True) extra_fields.setdefault("status", self.model.Status.APPROVED) extra_fields.setdefault("auth_method", self.model.AuthMethod.PASSWORD) if not extra_fields["is_staff"] or not extra_fields["is_superuser"]: raise ValueError("Superusers must have is_staff and is_superuser set.") return self._create_user(mobile, password, **extra_fields) def get_by_natural_key(self, username): return self.get(mobile=normalize_mobile(username))