from django.conf import settings from django.db import models 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"), ] CATEGORY_GENERAL = "general" CATEGORY_BUG = "bug" CATEGORY_PARTNERSHIP = "partnership" CATEGORY_PRESS = "press" CATEGORY_DATA = "data" CATEGORY_ACCOUNT = "account" CATEGORY_CHOICES = [ (CATEGORY_GENERAL, "General Inquiry"), (CATEGORY_BUG, "Bug Report"), (CATEGORY_PARTNERSHIP, "Partnership"), (CATEGORY_PRESS, "Press/Media"), (CATEGORY_DATA, "Data Correction"), (CATEGORY_ACCOUNT, "Account Issue"), ] 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)", ) category = models.CharField( max_length=20, choices=CATEGORY_CHOICES, default=CATEGORY_GENERAL, db_index=True, help_text="Category of the ticket", ) 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_category_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)