43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
from datetime import datetime
|
|
from typing import Literal
|
|
|
|
from tortoise import fields
|
|
from tortoise.models import Model
|
|
from tortoise.validators import MinLengthValidator
|
|
|
|
from service.core.security import get_password_hash
|
|
from service.database.validators import EmailValidator
|
|
|
|
__all__ = [
|
|
"User",
|
|
"AnonymousUser",
|
|
]
|
|
|
|
|
|
class TimestampMixin(Model):
|
|
id: int = fields.BigIntField(pk=True)
|
|
created_at: datetime = fields.DatetimeField(null=True, auto_now_add=True)
|
|
modified_at: datetime = fields.DatetimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
|
|
class User(TimestampMixin, Model):
|
|
email = fields.CharField(max_length=255, validators=[MinLengthValidator(5), EmailValidator(False)], unique=True)
|
|
username = fields.CharField(max_length=32, unique=True)
|
|
password = fields.CharField(max_length=256)
|
|
is_superuser = fields.BooleanField(default=False, description="Is user a SuperUser?")
|
|
|
|
# Helper for auto-complete and typing
|
|
# model_set: fields.ReverseRelation["DatabaseModel"]
|
|
|
|
def set_password(self, new_password: str) -> None:
|
|
self.password = get_password_hash(new_password)
|
|
|
|
|
|
class AnonymousUser:
|
|
id: Literal[0] = 0
|
|
email: Literal[""] = ""
|
|
username: Literal[""] = ""
|