mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2026-01-01 23:47:04 -05:00
feat: Implement initial schema and add various API, service, and management command enhancements across the application.
This commit is contained in:
@@ -5,30 +5,30 @@ from apps.core.history import TrackedModel
|
||||
|
||||
|
||||
class Ticket(TrackedModel):
|
||||
STATUS_OPEN = 'open'
|
||||
STATUS_IN_PROGRESS = 'in_progress'
|
||||
STATUS_CLOSED = 'closed'
|
||||
STATUS_OPEN = "open"
|
||||
STATUS_IN_PROGRESS = "in_progress"
|
||||
STATUS_CLOSED = "closed"
|
||||
|
||||
STATUS_CHOICES = [
|
||||
(STATUS_OPEN, 'Open'),
|
||||
(STATUS_IN_PROGRESS, 'In Progress'),
|
||||
(STATUS_CLOSED, 'Closed'),
|
||||
(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_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'),
|
||||
(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(
|
||||
@@ -37,7 +37,7 @@ class Ticket(TrackedModel):
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name="tickets",
|
||||
help_text="User who submitted the ticket (optional)"
|
||||
help_text="User who submitted the ticket (optional)",
|
||||
)
|
||||
|
||||
category = models.CharField(
|
||||
@@ -45,18 +45,13 @@ class Ticket(TrackedModel):
|
||||
choices=CATEGORY_CHOICES,
|
||||
default=CATEGORY_GENERAL,
|
||||
db_index=True,
|
||||
help_text="Category of the ticket"
|
||||
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
|
||||
)
|
||||
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default=STATUS_OPEN, db_index=True)
|
||||
|
||||
class Meta(TrackedModel.Meta):
|
||||
verbose_name = "Ticket"
|
||||
@@ -71,4 +66,3 @@ class Ticket(TrackedModel):
|
||||
if self.user and not self.email:
|
||||
self.email = self.user.email
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@ from .models import Ticket
|
||||
|
||||
class TicketSerializer(serializers.ModelSerializer):
|
||||
user = UserSerializer(read_only=True)
|
||||
category_display = serializers.CharField(source='get_category_display', read_only=True)
|
||||
status_display = serializers.CharField(source='get_status_display', read_only=True)
|
||||
category_display = serializers.CharField(source="get_category_display", read_only=True)
|
||||
status_display = serializers.CharField(source="get_status_display", read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = Ticket
|
||||
@@ -29,8 +29,7 @@ class TicketSerializer(serializers.ModelSerializer):
|
||||
|
||||
def validate(self, data):
|
||||
# Ensure email is provided if user is anonymous
|
||||
request = self.context.get('request')
|
||||
if request and not request.user.is_authenticated and not data.get('email'):
|
||||
request = self.context.get("request")
|
||||
if request and not request.user.is_authenticated and not data.get("email"):
|
||||
raise serializers.ValidationError({"email": "Email is required for guests."})
|
||||
return data
|
||||
|
||||
|
||||
@@ -11,9 +11,10 @@ class TicketViewSet(viewsets.ModelViewSet):
|
||||
Only Staff can LIST/RETRIEVE/UPDATE all.
|
||||
Users can LIST/RETRIEVE their own.
|
||||
"""
|
||||
|
||||
queryset = Ticket.objects.all()
|
||||
serializer_class = TicketSerializer
|
||||
permission_classes = [permissions.AllowAny] # We handle granular perms in get_queryset/perform_create
|
||||
permission_classes = [permissions.AllowAny] # We handle granular perms in get_queryset/perform_create
|
||||
filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
|
||||
filterset_fields = ["status", "category"]
|
||||
ordering_fields = ["created_at", "status"]
|
||||
@@ -25,7 +26,7 @@ class TicketViewSet(viewsets.ModelViewSet):
|
||||
return Ticket.objects.all()
|
||||
if user.is_authenticated:
|
||||
return Ticket.objects.filter(user=user)
|
||||
return Ticket.objects.none() # Guests can't list tickets
|
||||
return Ticket.objects.none() # Guests can't list tickets
|
||||
|
||||
def perform_create(self, serializer):
|
||||
if self.request.user.is_authenticated:
|
||||
|
||||
Reference in New Issue
Block a user