Files
offline-db/users/models.py
a222758798 fix tests (#342)
* fix tests

Co-authored-by: barkeser2002 <45911502+barkeser2002@users.noreply.github.com>

* fix tests

Co-authored-by: barkeser2002 <45911502+barkeser2002@users.noreply.github.com>

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-04-19 21:05:39 +00:00

95 lines
3.4 KiB
Python

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
from django.core.validators import RegexValidator
from django.utils.deconstruct import deconstructible
@deconstructible
class UsernameValidator(RegexValidator):
regex = r'^[\w-]+$'
message = _("Enter a valid username. This value may contain only letters, numbers, and _/- characters.")
flags = 0
class User(AbstractUser):
username_validator = UsernameValidator()
username = models.CharField(
_("username"),
max_length=150,
unique=True,
help_text=_("Required. 150 characters or fewer. Letters, digits, and _/- only."),
validators=[username_validator],
error_messages={
"unique": _("A user with that username already exists."),
},
)
is_premium = models.BooleanField(default=False, verbose_name=_("Premium Status"))
bio = models.TextField(_("bio"), blank=True, max_length=500)
def __str__(self):
return self.username
class Wallet(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='wallet')
balance = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name=_("Balance"))
def __str__(self):
return f"{self.user.username}'s Wallet: {self.balance:.2f}"
class WatchLog(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='watch_logs')
episode = models.ForeignKey('content.Episode', on_delete=models.CASCADE, related_name='watch_logs')
duration = models.PositiveIntegerField(help_text=_("Duration watched in seconds"))
watched_at = models.DateTimeField(auto_now_add=True)
class Meta:
indexes = [
models.Index(fields=['user', 'watched_at']),
]
def __str__(self):
return f"{self.user.username} watched {self.episode} for {self.duration}s"
class Badge(models.Model):
slug = models.SlugField(unique=True, help_text=_("Unique identifier for the badge logic"))
name = models.CharField(max_length=100)
description = models.TextField()
icon_url = models.URLField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class UserBadge(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='badges')
badge = models.ForeignKey(Badge, on_delete=models.CASCADE)
awarded_at = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('user', 'badge')
verbose_name = _("User Badge")
verbose_name_plural = _("User Badges")
def __str__(self):
return f"{self.user.username} - {self.badge.name}"
class Notification(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='notifications')
title = models.CharField(max_length=255)
message = models.TextField()
link = models.URLField(blank=True, null=True)
is_read = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-created_at']
indexes = [
models.Index(fields=['user', 'is_read']),
models.Index(fields=['user', '-created_at']),
]
def __str__(self):
return f"Notification for {self.user.username}: {self.title}"