from django.db import models from django.contrib.auth.models import AbstractUser from django.utils import timezone import secrets import string # Create your models here. class User(AbstractUser): ROLES = ( ('admin', 'Admin'), ('moderator', 'Moderator'), ('user', 'User'), ) role = models.CharField(max_length=10, choices=ROLES, default='user') # Add related_name to resolve clashes groups = models.ManyToManyField( 'auth.Group', related_name='custom_user_set', blank=True, help_text='The groups this user belongs to.', verbose_name='groups', ) user_permissions = models.ManyToManyField( 'auth.Permission', related_name='custom_user_set', blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions', ) def __str__(self): return self.username class PasswordResetToken(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) token = models.CharField(max_length=100, unique=True) created_at = models.DateTimeField(auto_now_add=True) expires_at = models.DateTimeField() used = models.BooleanField(default=False) def save(self, *args, **kwargs): if not self.token: # Generate a random token alphabet = string.ascii_letters + string.digits self.token = ''.join(secrets.choice(alphabet) for _ in range(64)) super().save(*args, **kwargs) def is_valid(self): return ( not self.used and self.expires_at > timezone.now() ) class Meta: verbose_name = 'Password Reset Token' verbose_name_plural = 'Password Reset Tokens'