""" Custom AdminSite for IGNY8 to organize models into proper groups using Unfold """ from django.contrib import admin from django.contrib.admin.apps import AdminConfig from django.apps import apps from django.urls import path, reverse_lazy from django.shortcuts import redirect from unfold.admin import ModelAdmin as UnfoldModelAdmin from unfold.sites import UnfoldAdminSite class Igny8AdminSite(UnfoldAdminSite): """ Custom AdminSite based on Unfold that organizes models into the planned groups """ site_header = 'IGNY8 Administration' site_title = 'IGNY8 Admin' index_title = 'IGNY8 Administration' def get_urls(self): """Get admin URLs without custom dashboard""" urls = super().get_urls() return urls def get_app_list(self, request): """ Customize the app list to organize models into logical groups """ # Get the default app list app_dict = self._build_app_dict(request) # Define our custom groups with their models (using object_name) # Organized by business function with emoji icons for visual recognition custom_groups = { '💰 Billing & Accounts': { 'models': [ ('igny8_core_auth', 'Plan'), ('billing', 'PlanLimitUsage'), ('igny8_core_auth', 'Account'), ('igny8_core_auth', 'Subscription'), ('billing', 'Invoice'), ('billing', 'Payment'), ('billing', 'CreditTransaction'), ('billing', 'CreditUsageLog'), ('billing', 'CreditPackage'), ('billing', 'PaymentMethodConfig'), ('billing', 'AccountPaymentMethod'), ('billing', 'CreditCostConfig'), ], }, '👥 Sites & Users': { 'models': [ ('igny8_core_auth', 'Site'), ('igny8_core_auth', 'Sector'), ('igny8_core_auth', 'User'), ('igny8_core_auth', 'SiteUserAccess'), ('igny8_core_auth', 'PasswordResetToken'), ], }, '📚 Content Management': { 'models': [ ('writer', 'Content'), ('writer', 'Tasks'), ('writer', 'Images'), ('writer', 'ContentTaxonomy'), ('writer', 'ContentAttribute'), ('writer', 'ContentTaxonomyRelation'), ('writer', 'ContentClusterMap'), ], }, '🎯 Planning & Strategy': { 'models': [ ('planner', 'Clusters'), ('planner', 'Keywords'), ('planner', 'ContentIdeas'), ('system', 'Strategy'), ], }, '🔗 Integrations & Publishing': { 'models': [ ('integration', 'SiteIntegration'), ('integration', 'SyncEvent'), ('publishing', 'PublishingRecord'), ('publishing', 'DeploymentRecord'), ], }, '🤖 AI & Automation': { 'models': [ ('ai', 'AITaskLog'), ('system', 'AIPrompt'), ('automation', 'AutomationConfig'), ('automation', 'AutomationRun'), ('optimization', 'OptimizationTask'), ], }, '🌍 Global Reference Data': { 'models': [ ('igny8_core_auth', 'Industry'), ('igny8_core_auth', 'IndustrySector'), ('igny8_core_auth', 'SeedKeyword'), ], }, '⚙️ System Configuration': { 'models': [ ('system', 'IntegrationSettings'), ('system', 'AuthorProfile'), ('system', 'SystemSettings'), ('system', 'AccountSettings'), ('system', 'UserSettings'), ('system', 'ModuleSettings'), ('system', 'AISettings'), ('system', 'ModuleEnableSettings'), ('system', 'SystemLog'), ('system', 'SystemStatus'), ], }, '� Monitoring & Tasks': { 'models': [ ('django_celery_results', 'TaskResult'), ('django_celery_results', 'GroupResult'), ], }, '�🔧 Django System': { 'models': [ ('admin', 'LogEntry'), ('auth', 'Group'), ('auth', 'Permission'), ('contenttypes', 'ContentType'), ('sessions', 'Session'), ], }, } # Build the custom app list app_list = [] for group_name, group_config in custom_groups.items(): group_models = [] for app_label, model_name in group_config['models']: # Find the model in app_dict if app_label in app_dict: app_data = app_dict[app_label] # Look for the model in the app's models for model in app_data.get('models', []): if model['object_name'] == model_name: group_models.append(model) break # Only add the group if it has models if group_models: app_list.append({ 'name': group_name, 'app_label': group_name.lower().replace(' ', '_').replace('&', '').replace('emoji', ''), 'app_url': None, 'has_module_perms': True, 'models': group_models, }) # Sort the app list by our custom order order = [ '💰 Billing & Accounts', '👥 Sites & Users', '📚 Content Management', '🎯 Planning & Strategy', '🔗 Integrations & Publishing', '🤖 AI & Automation', '🌍 Global Reference Data', '⚙️ System Configuration', '🔧 Django System', ] app_list.sort(key=lambda x: order.index(x['name']) if x['name'] in order else 999) return app_list