from django.db import models from django.conf import settings from django.utils import timezone class PasswordReset(models.Model): """Persisted password reset tokens for API-driven password resets.""" user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="password_resets", ) token = models.CharField(max_length=128, unique=True, db_index=True) created_at = models.DateTimeField(auto_now_add=True) expires_at = models.DateTimeField() used = models.BooleanField(default=False) class Meta: ordering = ["-created_at"] verbose_name = "Password Reset" verbose_name_plural = "Password Resets" def is_expired(self) -> bool: return timezone.now() > self.expires_at def mark_used(self) -> None: self.used = True self.save(update_fields=["used"]) def __str__(self): user_id = getattr(self, "user_id", None) return f"PasswordReset(user={user_id}, token={self.token[:8]}..., used={self.used})"