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'), ] 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)