from django.contrib import admin from django.utils.html import format_html from django.urls import reverse from django.utils.safestring import mark_safe from .models import ContactSubmission @admin.register(ContactSubmission) class ContactSubmissionAdmin(admin.ModelAdmin): """ Admin interface for ContactSubmission model. Provides comprehensive management of contact form submissions. """ list_display = [ 'id', 'full_name_display', 'company', 'email', 'project_type_display', 'status_badge', 'priority_badge', 'is_enterprise_client_display', 'created_at', 'assigned_to', ] list_filter = [ 'status', 'priority', 'industry', 'company_size', 'project_type', 'timeline', 'budget', 'newsletter_subscription', 'privacy_consent', 'created_at', 'assigned_to', ] search_fields = [ 'first_name', 'last_name', 'email', 'company', 'job_title', 'message', ] readonly_fields = [ 'id', 'created_at', 'updated_at', 'full_name_display', 'is_enterprise_client_display', 'is_high_priority_display', ] fieldsets = ( ('Personal Information', { 'fields': ( 'id', 'first_name', 'last_name', 'full_name_display', 'email', 'phone', ) }), ('Company Information', { 'fields': ( 'company', 'job_title', 'industry', 'company_size', 'is_enterprise_client_display', ) }), ('Project Details', { 'fields': ( 'project_type', 'timeline', 'budget', 'message', ) }), ('Communication Preferences', { 'fields': ( 'newsletter_subscription', 'privacy_consent', ) }), ('Management', { 'fields': ( 'status', 'priority', 'is_high_priority_display', 'assigned_to', 'admin_notes', ) }), ('Timestamps', { 'fields': ( 'created_at', 'updated_at', ), 'classes': ('collapse',) }), ) ordering = ['-created_at'] list_per_page = 25 date_hierarchy = 'created_at' actions = [ 'mark_as_contacted', 'mark_as_qualified', 'mark_as_closed', 'set_high_priority', 'set_medium_priority', 'set_low_priority', ] def full_name_display(self, obj): """Display full name with link to detail view.""" return format_html( '{}', obj.full_name ) full_name_display.short_description = 'Full Name' full_name_display.admin_order_field = 'first_name' def project_type_display(self, obj): """Display project type with color coding.""" if not obj.project_type: return '-' colors = { 'software-development': '#007bff', 'cloud-migration': '#28a745', 'digital-transformation': '#ffc107', 'data-analytics': '#17a2b8', 'security-compliance': '#dc3545', 'integration': '#6f42c1', 'consulting': '#fd7e14', } color = colors.get(obj.project_type, '#6c757d') return format_html( '{}', color, obj.get_project_type_display() ) project_type_display.short_description = 'Project Type' project_type_display.admin_order_field = 'project_type' def status_badge(self, obj): """Display status as a colored badge.""" colors = { 'new': '#007bff', 'in_progress': '#ffc107', 'contacted': '#17a2b8', 'qualified': '#28a745', 'closed': '#6c757d', } color = colors.get(obj.status, '#6c757d') return format_html( '{}', color, obj.get_status_display().upper() ) status_badge.short_description = 'Status' status_badge.admin_order_field = 'status' def priority_badge(self, obj): """Display priority as a colored badge.""" colors = { 'urgent': '#dc3545', 'high': '#fd7e14', 'medium': '#ffc107', 'low': '#28a745', } color = colors.get(obj.priority, '#6c757d') return format_html( '{}', color, obj.get_priority_display().upper() ) priority_badge.short_description = 'Priority' priority_badge.admin_order_field = 'priority' def is_enterprise_client_display(self, obj): """Display enterprise client status.""" if obj.is_enterprise_client: return format_html( '✓ Enterprise' ) return format_html( 'SMB' ) is_enterprise_client_display.short_description = 'Client Type' is_enterprise_client_display.admin_order_field = 'company_size' def is_high_priority_display(self, obj): """Display high priority status.""" if obj.is_high_priority: return format_html( '⚠ High Priority' ) return format_html( 'Normal' ) is_high_priority_display.short_description = 'Priority Level' # Admin Actions def mark_as_contacted(self, request, queryset): """Mark selected submissions as contacted.""" updated = queryset.update(status='contacted') self.message_user( request, f'{updated} submission(s) marked as contacted.' ) mark_as_contacted.short_description = "Mark selected submissions as contacted" def mark_as_qualified(self, request, queryset): """Mark selected submissions as qualified.""" updated = queryset.update(status='qualified') self.message_user( request, f'{updated} submission(s) marked as qualified.' ) mark_as_qualified.short_description = "Mark selected submissions as qualified" def mark_as_closed(self, request, queryset): """Mark selected submissions as closed.""" updated = queryset.update(status='closed') self.message_user( request, f'{updated} submission(s) marked as closed.' ) mark_as_closed.short_description = "Mark selected submissions as closed" def set_high_priority(self, request, queryset): """Set selected submissions to high priority.""" updated = queryset.update(priority='high') self.message_user( request, f'{updated} submission(s) set to high priority.' ) set_high_priority.short_description = "Set selected submissions to high priority" def set_medium_priority(self, request, queryset): """Set selected submissions to medium priority.""" updated = queryset.update(priority='medium') self.message_user( request, f'{updated} submission(s) set to medium priority.' ) set_medium_priority.short_description = "Set selected submissions to medium priority" def set_low_priority(self, request, queryset): """Set selected submissions to low priority.""" updated = queryset.update(priority='low') self.message_user( request, f'{updated} submission(s) set to low priority.' ) set_low_priority.short_description = "Set selected submissions to low priority" def get_queryset(self, request): """Optimize queryset for admin list view.""" return super().get_queryset(request).select_related() def has_add_permission(self, request): """Disable adding new submissions through admin.""" return False def has_delete_permission(self, request, obj=None): """Allow deletion only for superusers.""" return request.user.is_superuser