mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-22 04:51:13 -05:00
116 lines
3.6 KiB
Python
116 lines
3.6 KiB
Python
"""
|
|
Django admin interface for Contact submissions.
|
|
"""
|
|
from django.contrib import admin
|
|
from django.utils.html import format_html
|
|
from django.utils import timezone
|
|
from .models import ContactSubmission
|
|
|
|
|
|
@admin.register(ContactSubmission)
|
|
class ContactSubmissionAdmin(admin.ModelAdmin):
|
|
"""Admin interface for managing contact submissions."""
|
|
|
|
list_display = [
|
|
'ticket_number',
|
|
'name',
|
|
'email',
|
|
'category',
|
|
'status_badge',
|
|
'assigned_to',
|
|
'created_at',
|
|
]
|
|
|
|
list_filter = [
|
|
'status',
|
|
'category',
|
|
'created_at',
|
|
'assigned_to',
|
|
]
|
|
|
|
search_fields = [
|
|
'ticket_number',
|
|
'name',
|
|
'email',
|
|
'subject',
|
|
'message',
|
|
]
|
|
|
|
readonly_fields = [
|
|
'id',
|
|
'ticket_number',
|
|
'user',
|
|
'created_at',
|
|
'updated_at',
|
|
'resolved_at',
|
|
]
|
|
|
|
fieldsets = (
|
|
('Contact Information', {
|
|
'fields': ('ticket_number', 'name', 'email', 'user', 'category')
|
|
}),
|
|
('Message', {
|
|
'fields': ('subject', 'message')
|
|
}),
|
|
('Status & Assignment', {
|
|
'fields': ('status', 'assigned_to', 'admin_notes')
|
|
}),
|
|
('Resolution', {
|
|
'fields': ('resolved_at', 'resolved_by'),
|
|
'classes': ('collapse',)
|
|
}),
|
|
('Metadata', {
|
|
'fields': ('id', 'created_at', 'updated_at'),
|
|
'classes': ('collapse',)
|
|
}),
|
|
)
|
|
|
|
def status_badge(self, obj):
|
|
"""Display status with colored badge."""
|
|
colors = {
|
|
'pending': '#ff9800',
|
|
'in_progress': '#2196f3',
|
|
'resolved': '#4caf50',
|
|
'archived': '#9e9e9e',
|
|
}
|
|
color = colors.get(obj.status, '#9e9e9e')
|
|
return format_html(
|
|
'<span style="background-color: {}; color: white; padding: 3px 10px; '
|
|
'border-radius: 3px; font-weight: bold;">{}</span>',
|
|
color,
|
|
obj.get_status_display()
|
|
)
|
|
status_badge.short_description = 'Status'
|
|
|
|
def save_model(self, request, obj, form, change):
|
|
"""Auto-set resolved_by when status changes to resolved."""
|
|
if change and 'status' in form.changed_data:
|
|
if obj.status == 'resolved' and not obj.resolved_by:
|
|
obj.resolved_by = request.user
|
|
obj.resolved_at = timezone.now()
|
|
super().save_model(request, obj, form, change)
|
|
|
|
actions = ['mark_as_in_progress', 'mark_as_resolved', 'assign_to_me']
|
|
|
|
def mark_as_in_progress(self, request, queryset):
|
|
"""Mark selected submissions as in progress."""
|
|
updated = queryset.update(status='in_progress')
|
|
self.message_user(request, f'{updated} submission(s) marked as in progress.')
|
|
mark_as_in_progress.short_description = "Mark as In Progress"
|
|
|
|
def mark_as_resolved(self, request, queryset):
|
|
"""Mark selected submissions as resolved."""
|
|
updated = queryset.filter(status__in=['pending', 'in_progress']).update(
|
|
status='resolved',
|
|
resolved_at=timezone.now(),
|
|
resolved_by=request.user
|
|
)
|
|
self.message_user(request, f'{updated} submission(s) marked as resolved.')
|
|
mark_as_resolved.short_description = "Mark as Resolved"
|
|
|
|
def assign_to_me(self, request, queryset):
|
|
"""Assign selected submissions to current user."""
|
|
updated = queryset.update(assigned_to=request.user)
|
|
self.message_user(request, f'{updated} submission(s) assigned to you.')
|
|
assign_to_me.short_description = "Assign to Me"
|