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 MemoStatus(models.TextChoices): Pending = "pending" Processing = "processing" Done = "done" Error = "error" class ImageMemo(models.Model): """Model definition for ImageMemo.""" id = models.UUIDField(primary_key=True, default=uuid4, editable=False) image_mimetype = models.CharField(max_length=256) 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, ) status = models.CharField( max_length=10, choices=MemoStatus.choices, default=MemoStatus.Pending ) error_message = models.TextField(null=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