from django.db import models from django.conf import settings from apps.core.history import TrackedModel class Ticket(TrackedModel): STATUS_OPEN = 'open' STATUS_IN_PROGRESS = 'in_progress' STATUS_CLOSED = 'closed' STATUS_CHOICES = [ (STATUS_OPEN, 'Open'), (STATUS_IN_PROGRESS, 'In Progress'), (STATUS_CLOSED, 'Closed'), ] user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name="tickets", help_text="User who submitted the ticket (optional)" ) subject = models.CharField(max_length=255) message = models.TextField() email = models.EmailField(help_text="Contact email", blank=True) status = models.CharField( max_length=20, choices=STATUS_CHOICES, default=STATUS_OPEN, db_index=True ) class Meta(TrackedModel.Meta): verbose_name = "Ticket" verbose_name_plural = "Tickets" ordering = ["-created_at"] def __str__(self): return f"[{self.get_status_display()}] {self.subject}" def save(self, *args, **kwargs): # If user is set but email is empty, autofill from user if self.user and not self.email: self.email = self.user.email super().save(*args, **kwargs)