from django.contrib.auth.models import AbstractUser from django.contrib.auth.base_user import BaseUserManager from django.db import models from uuid import uuid4 class UserManager(BaseUserManager): """Define a model manager for User model with no username field.""" use_in_migrations = True def _create_user(self, email, password, **extra_fields): """Create and save a User with the given email and password.""" if not email: raise ValueError("The given email must be set") email = self.normalize_email(email) user = self.model(email=email, **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_user(self, email, password=None, **extra_fields): """Create and save a regular User with the given email and password.""" extra_fields.setdefault("is_staff", False) extra_fields.setdefault("is_superuser", False) return self._create_user(email, password, **extra_fields) def create_superuser(self, email, password, **extra_fields): """Create and save a SuperUser with the given email and password.""" extra_fields.setdefault("is_staff", True) extra_fields.setdefault("is_superuser", True) if extra_fields.get("is_staff") is not True: raise ValueError("Superuser must have is_staff=True.") if extra_fields.get("is_superuser") is not True: raise ValueError("Superuser must have is_superuser=True.") return self._create_user(email, password, **extra_fields) class ImageMemo(models.Model): """Model definition for ImageMemo.""" id = models.UUIDField(primary_key=True, default=uuid4, editable=False) image = models.ImageField(upload_to='uploads/%Y/%m/%d') content = models.TextField() author = models.ForeignKey( 'User', on_delete=models.CASCADE, related_name='memos') created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["-created_at"] class User(AbstractUser): email = models.EmailField(unique=True) username = None first_name = models.CharField(max_length=150, blank=False) last_name = models.CharField(max_length=150, blank=False) USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['full_name'] objects = UserManager() # type: ignore def __str__(self): """ Return string representation of our user """ return self.email