Files
GNX-WEB/gnx-react/backend/support/admin.py
Iliyan Angelov d48c54e2c5 update
2025-10-07 22:10:27 +03:00

183 lines
6.6 KiB
Python

from django.contrib import admin
from .models import (
SupportTicket, TicketStatus, TicketPriority, TicketCategory,
TicketMessage, TicketActivity, KnowledgeBaseCategory,
KnowledgeBaseArticle, SupportSettings, RegisteredEmail
)
@admin.register(TicketStatus)
class TicketStatusAdmin(admin.ModelAdmin):
list_display = ['name', 'color', 'is_closed', 'is_active', 'display_order']
list_filter = ['is_closed', 'is_active']
search_fields = ['name']
ordering = ['display_order', 'name']
@admin.register(TicketPriority)
class TicketPriorityAdmin(admin.ModelAdmin):
list_display = ['name', 'level', 'color', 'sla_hours', 'is_active']
list_filter = ['is_active']
search_fields = ['name']
ordering = ['level']
@admin.register(TicketCategory)
class TicketCategoryAdmin(admin.ModelAdmin):
list_display = ['name', 'icon', 'color', 'is_active', 'display_order']
list_filter = ['is_active']
search_fields = ['name', 'description']
ordering = ['display_order', 'name']
class TicketMessageInline(admin.TabularInline):
model = TicketMessage
extra = 0
fields = ['message_type', 'content', 'author_name', 'created_at', 'is_internal']
readonly_fields = ['created_at']
class TicketActivityInline(admin.TabularInline):
model = TicketActivity
extra = 0
fields = ['activity_type', 'description', 'user_name', 'created_at']
readonly_fields = ['created_at']
@admin.register(SupportTicket)
class SupportTicketAdmin(admin.ModelAdmin):
list_display = [
'ticket_number', 'title', 'user_name', 'user_email',
'status', 'priority', 'category', 'created_at', 'is_escalated'
]
list_filter = ['status', 'priority', 'category', 'ticket_type', 'is_escalated', 'created_at']
search_fields = ['ticket_number', 'title', 'user_name', 'user_email', 'description']
readonly_fields = ['ticket_number', 'created_at', 'updated_at', 'last_activity']
inlines = [TicketMessageInline, TicketActivityInline]
fieldsets = (
('Ticket Information', {
'fields': ('ticket_number', 'title', 'description', 'ticket_type')
}),
('User Information', {
'fields': ('user_name', 'user_email', 'user_phone', 'company')
}),
('Ticket Management', {
'fields': ('category', 'priority', 'status', 'assigned_to', 'assigned_at')
}),
('Escalation', {
'fields': ('is_escalated', 'escalation_reason'),
'classes': ('collapse',)
}),
('Timestamps', {
'fields': ('created_at', 'updated_at', 'closed_at', 'last_activity', 'first_response_at', 'sla_deadline')
}),
('Additional Information', {
'fields': ('tags', 'internal_notes', 'attachments'),
'classes': ('collapse',)
}),
)
ordering = ['-created_at']
@admin.register(TicketMessage)
class TicketMessageAdmin(admin.ModelAdmin):
list_display = ['ticket', 'message_type', 'author_name', 'created_at', 'is_internal', 'is_read']
list_filter = ['message_type', 'is_internal', 'is_read', 'created_at']
search_fields = ['ticket__ticket_number', 'content', 'author_name', 'author_email']
readonly_fields = ['created_at', 'updated_at']
ordering = ['-created_at']
@admin.register(TicketActivity)
class TicketActivityAdmin(admin.ModelAdmin):
list_display = ['ticket', 'activity_type', 'user_name', 'created_at']
list_filter = ['activity_type', 'created_at']
search_fields = ['ticket__ticket_number', 'description', 'user_name']
readonly_fields = ['created_at']
ordering = ['-created_at']
@admin.register(KnowledgeBaseCategory)
class KnowledgeBaseCategoryAdmin(admin.ModelAdmin):
list_display = ['name', 'slug', 'icon', 'color', 'is_active', 'display_order']
list_filter = ['is_active']
search_fields = ['name', 'description']
prepopulated_fields = {'slug': ('name',)}
ordering = ['display_order', 'name']
@admin.register(KnowledgeBaseArticle)
class KnowledgeBaseArticleAdmin(admin.ModelAdmin):
list_display = [
'title', 'category', 'is_published', 'is_featured',
'view_count', 'helpful_count', 'created_at'
]
list_filter = ['is_published', 'is_featured', 'category', 'created_at']
search_fields = ['title', 'content', 'summary', 'keywords']
prepopulated_fields = {'slug': ('title',)}
readonly_fields = ['view_count', 'helpful_count', 'not_helpful_count', 'created_at', 'updated_at']
fieldsets = (
('Article Information', {
'fields': ('title', 'slug', 'category', 'content', 'summary')
}),
('SEO & Metadata', {
'fields': ('meta_description', 'keywords')
}),
('Publishing', {
'fields': ('author', 'is_published', 'is_featured', 'published_at')
}),
('Statistics', {
'fields': ('view_count', 'helpful_count', 'not_helpful_count'),
'classes': ('collapse',)
}),
('Timestamps', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
ordering = ['-created_at']
@admin.register(SupportSettings)
class SupportSettingsAdmin(admin.ModelAdmin):
list_display = ['setting_name', 'is_active', 'created_at', 'updated_at']
list_filter = ['is_active']
search_fields = ['setting_name', 'setting_value', 'description']
ordering = ['setting_name']
@admin.register(RegisteredEmail)
class RegisteredEmailAdmin(admin.ModelAdmin):
list_display = ['email', 'company_name', 'contact_name', 'is_active', 'ticket_count', 'last_ticket_date', 'created_at']
list_filter = ['is_active', 'created_at', 'last_ticket_date']
search_fields = ['email', 'company_name', 'contact_name', 'notes']
readonly_fields = ['added_by', 'created_at', 'updated_at', 'last_ticket_date', 'ticket_count']
ordering = ['-created_at']
fieldsets = (
('Email Information', {
'fields': ('email', 'is_active')
}),
('Contact Details', {
'fields': ('company_name', 'contact_name', 'notes')
}),
('Statistics', {
'fields': ('ticket_count', 'last_ticket_date'),
'classes': ('collapse',)
}),
('System Information', {
'fields': ('added_by', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
def save_model(self, request, obj, form, change):
"""Automatically set added_by to current user if creating new record"""
if not change: # If creating new object
obj.added_by = request.user
super().save_model(request, obj, form, change)