cheesy/moku/models/user.py

103 lines
3 KiB
Python
Raw Normal View History

from django.conf import settings
from django.contrib.auth.models import AbstractUser
2024-03-25 10:36:10 +00:00
from django.db import models
from django.urls import reverse
2024-03-26 12:18:47 +00:00
from django.utils.translation import gettext_lazy as _
2024-03-25 10:36:10 +00:00
2024-03-27 12:28:23 +00:00
from moku.markdown import full_markdown
2024-03-26 12:18:47 +00:00
from moku.validators import validate_username_length, validate_username_regex
2024-03-25 10:36:10 +00:00
2024-03-25 14:11:21 +00:00
def user_avatar_filename(instance, _):
"""Returns the filename that user avatar images should be saved to."""
2024-03-25 14:11:21 +00:00
return f"avatars/{instance.username}.webp"
2024-03-25 10:36:10 +00:00
class User(AbstractUser):
"""Represents a single authenticated user on the site."""
2024-03-25 10:36:10 +00:00
username = models.CharField(
verbose_name=_("username"),
max_length=64,
unique=True,
db_index=True,
validators=[validate_username_regex, validate_username_length],
help_text=_(
"this is the unique identifier you'll use to log in. it may only contain "
"letters, numbers, hyphens, dashes and dots."
2024-03-26 12:18:47 +00:00
),
2024-03-25 10:36:10 +00:00
)
email = models.EmailField(
verbose_name=_("email address"),
max_length=128,
unique=True,
help_text=_(
"this should be your email address. make sure it's valid and that you have "
"access to it."
2024-03-26 12:18:47 +00:00
),
2024-03-25 10:36:10 +00:00
)
2024-03-26 12:18:47 +00:00
email_confirmed_at = models.DateTimeField(blank=True, null=True)
2024-03-25 10:36:10 +00:00
pronouns = models.CharField(
verbose_name=_("pronouns"),
max_length=64,
blank=True,
help_text=_("what pronouns should people use when referring to you?"),
)
location = models.CharField(
verbose_name=_("location"),
max_length=64,
blank=True,
help_text=_("where in the world are you?"),
)
bio = models.TextField(
verbose_name=_("about me"),
blank=True,
help_text=_("write something about yourself!"),
)
2024-03-25 14:11:21 +00:00
avatar = models.ImageField(
verbose_name=_("avatar"),
blank=True,
upload_to=user_avatar_filename,
help_text=_("a little picture to show up on your profile."),
)
2024-03-25 10:36:10 +00:00
last_seen_at = models.DateTimeField(
verbose_name=_("last seen at"),
blank=True,
null=True,
help_text=_("the last time this user accessed the site."),
)
first_name = None
last_name = None
def __str__(self):
return self.username
def get_absolute_url(self):
return reverse("profile", kwargs={"username": self.username})
@property
def email_confirmed(self):
"""Whether the user has confirmed their email address."""
2024-03-25 10:36:10 +00:00
return self.email_confirmed_at is not None
2024-03-27 12:28:23 +00:00
def bio_as_html(self):
if not self.bio:
return ""
return full_markdown(self.bio)
class UserSettings(models.Model):
"""Represents settings for a single user."""
user = models.OneToOneField(
2024-03-26 12:18:47 +00:00
"User", related_name="settings", on_delete=models.CASCADE
)
language = models.CharField(
verbose_name=_("language"),
max_length=16,
choices=settings.LANGUAGES,
default="en",
help_text=_("what language do you want to use moku.blog in?"),
)