diff --git a/backend/igny8_core/ai/admin.py b/backend/igny8_core/ai/admin.py index 1a2f349c..4406423e 100644 --- a/backend/igny8_core/ai/admin.py +++ b/backend/igny8_core/ai/admin.py @@ -2,11 +2,12 @@ Admin configuration for AI models """ from django.contrib import admin +from unfold.admin import ModelAdmin from igny8_core.ai.models import AITaskLog @admin.register(AITaskLog) -class AITaskLogAdmin(admin.ModelAdmin): +class AITaskLogAdmin(ModelAdmin): """Admin interface for AI task logs""" list_display = [ 'function_name', diff --git a/backend/igny8_core/auth/admin.py b/backend/igny8_core/auth/admin.py index 197bf488..deca5470 100644 --- a/backend/igny8_core/auth/admin.py +++ b/backend/igny8_core/auth/admin.py @@ -4,6 +4,7 @@ Admin interface for auth models from django import forms from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin +from unfold.admin import ModelAdmin from igny8_core.admin.base import AccountAdminMixin from .models import User, Account, Plan, Subscription, Site, Sector, SiteUserAccess, Industry, IndustrySector, SeedKeyword, PasswordResetToken @@ -109,7 +110,7 @@ class AccountAdminForm(forms.ModelForm): @admin.register(Plan) -class PlanAdmin(admin.ModelAdmin): +class PlanAdmin(ModelAdmin): """Plan admin - Global, no account filtering needed""" list_display = ['name', 'slug', 'price', 'billing_cycle', 'max_sites', 'max_users', 'max_keywords', 'max_content_words', 'included_credits', 'is_active', 'is_featured'] list_filter = ['is_active', 'billing_cycle', 'is_internal', 'is_featured'] @@ -143,7 +144,7 @@ class PlanAdmin(admin.ModelAdmin): @admin.register(Account) -class AccountAdmin(AccountAdminMixin, admin.ModelAdmin): +class AccountAdmin(AccountAdminMixin, ModelAdmin): form = AccountAdminForm list_display = ['name', 'slug', 'owner', 'plan', 'status', 'health_indicator', 'credits', 'created_at'] list_filter = ['status', 'plan'] @@ -306,7 +307,7 @@ class AccountAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(Subscription) -class SubscriptionAdmin(AccountAdminMixin, admin.ModelAdmin): +class SubscriptionAdmin(AccountAdminMixin, ModelAdmin): list_display = ['account', 'status', 'current_period_start', 'current_period_end'] list_filter = ['status'] search_fields = ['account__name', 'stripe_subscription_id'] @@ -314,7 +315,7 @@ class SubscriptionAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(PasswordResetToken) -class PasswordResetTokenAdmin(admin.ModelAdmin): +class PasswordResetTokenAdmin(ModelAdmin): list_display = ['user', 'token', 'used', 'expires_at', 'created_at'] list_filter = ['used', 'expires_at', 'created_at'] search_fields = ['user__email', 'token'] @@ -352,7 +353,7 @@ class SectorInline(admin.TabularInline): @admin.register(Site) -class SiteAdmin(AccountAdminMixin, admin.ModelAdmin): +class SiteAdmin(AccountAdminMixin, ModelAdmin): list_display = ['name', 'slug', 'account', 'industry', 'domain', 'status', 'is_active', 'get_api_key_status', 'get_sectors_count'] list_filter = ['status', 'is_active', 'account', 'industry', 'hosting_type'] search_fields = ['name', 'slug', 'domain', 'industry__name'] @@ -431,7 +432,7 @@ class SiteAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(Sector) -class SectorAdmin(AccountAdminMixin, admin.ModelAdmin): +class SectorAdmin(AccountAdminMixin, ModelAdmin): list_display = ['name', 'slug', 'site', 'industry_sector', 'get_industry', 'status', 'is_active', 'get_keywords_count', 'get_clusters_count'] list_filter = ['status', 'is_active', 'site', 'industry_sector__industry'] search_fields = ['name', 'slug', 'site__name', 'industry_sector__name'] @@ -469,7 +470,7 @@ class SectorAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(SiteUserAccess) -class SiteUserAccessAdmin(admin.ModelAdmin): +class SiteUserAccessAdmin(ModelAdmin): list_display = ['user', 'site', 'granted_at', 'granted_by'] list_filter = ['granted_at'] search_fields = ['user__email', 'site__name'] @@ -485,14 +486,13 @@ class IndustrySectorInline(admin.TabularInline): @admin.register(Industry) -class IndustryAdmin(admin.ModelAdmin): +class IndustryAdmin(ModelAdmin): list_display = ['name', 'slug', 'is_active', 'get_sectors_count', 'created_at'] list_filter = ['is_active'] search_fields = ['name', 'slug', 'description'] readonly_fields = ['created_at', 'updated_at'] inlines = [IndustrySectorInline] actions = ['delete_selected'] # Enable bulk delete - change_list_template = 'admin/igny8_core_auth/industry/change_list.html' def get_sectors_count(self, obj): return obj.sectors.filter(is_active=True).count() @@ -504,13 +504,12 @@ class IndustryAdmin(admin.ModelAdmin): @admin.register(IndustrySector) -class IndustrySectorAdmin(admin.ModelAdmin): +class IndustrySectorAdmin(ModelAdmin): list_display = ['name', 'slug', 'industry', 'is_active'] list_filter = ['is_active', 'industry'] search_fields = ['name', 'slug', 'description'] readonly_fields = ['created_at', 'updated_at'] actions = ['delete_selected'] # Enable bulk delete - change_list_template = 'admin/igny8_core_auth/industrysector/change_list.html' def has_delete_permission(self, request, obj=None): """Allow deletion for superusers and developers""" @@ -518,14 +517,13 @@ class IndustrySectorAdmin(admin.ModelAdmin): @admin.register(SeedKeyword) -class SeedKeywordAdmin(admin.ModelAdmin): +class SeedKeywordAdmin(ModelAdmin): """SeedKeyword admin - Global reference data, no account filtering""" list_display = ['keyword', 'industry', 'sector', 'volume', 'difficulty', 'intent', 'is_active', 'created_at'] list_filter = ['is_active', 'industry', 'sector', 'intent'] search_fields = ['keyword'] readonly_fields = ['created_at', 'updated_at'] actions = ['delete_selected'] # Enable bulk delete - change_list_template = 'admin/igny8_core_auth/seedkeyword/change_list.html' fieldsets = ( ('Keyword Info', { diff --git a/backend/igny8_core/business/automation/admin.py b/backend/igny8_core/business/automation/admin.py index 5f00ba4e..7035d0c8 100644 --- a/backend/igny8_core/business/automation/admin.py +++ b/backend/igny8_core/business/automation/admin.py @@ -2,19 +2,20 @@ Admin registration for Automation models """ from django.contrib import admin +from unfold.admin import ModelAdmin from igny8_core.admin.base import AccountAdminMixin from .models import AutomationConfig, AutomationRun @admin.register(AutomationConfig) -class AutomationConfigAdmin(AccountAdminMixin, admin.ModelAdmin): +class AutomationConfigAdmin(AccountAdminMixin, ModelAdmin): list_display = ('site', 'is_enabled', 'frequency', 'scheduled_time', 'within_stage_delay', 'between_stage_delay', 'last_run_at') list_filter = ('is_enabled', 'frequency') search_fields = ('site__domain',) @admin.register(AutomationRun) -class AutomationRunAdmin(AccountAdminMixin, admin.ModelAdmin): +class AutomationRunAdmin(AccountAdminMixin, ModelAdmin): list_display = ('run_id', 'site', 'status', 'current_stage', 'started_at', 'completed_at') list_filter = ('status', 'current_stage') search_fields = ('run_id', 'site__domain') diff --git a/backend/igny8_core/business/integration/admin.py b/backend/igny8_core/business/integration/admin.py index 5b2a9ac1..c6cc87d8 100644 --- a/backend/igny8_core/business/integration/admin.py +++ b/backend/igny8_core/business/integration/admin.py @@ -1,10 +1,11 @@ from django.contrib import admin +from unfold.admin import ModelAdmin from igny8_core.admin.base import AccountAdminMixin from .models import SiteIntegration, SyncEvent @admin.register(SiteIntegration) -class SiteIntegrationAdmin(AccountAdminMixin, admin.ModelAdmin): +class SiteIntegrationAdmin(AccountAdminMixin, ModelAdmin): list_display = [ 'site', 'platform', @@ -20,7 +21,7 @@ class SiteIntegrationAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(SyncEvent) -class SyncEventAdmin(AccountAdminMixin, admin.ModelAdmin): +class SyncEventAdmin(AccountAdminMixin, ModelAdmin): list_display = [ 'integration', 'site', diff --git a/backend/igny8_core/business/optimization/admin.py b/backend/igny8_core/business/optimization/admin.py index a9837f36..7118a4db 100644 --- a/backend/igny8_core/business/optimization/admin.py +++ b/backend/igny8_core/business/optimization/admin.py @@ -1,10 +1,11 @@ from django.contrib import admin +from unfold.admin import ModelAdmin from igny8_core.admin.base import AccountAdminMixin from .models import OptimizationTask @admin.register(OptimizationTask) -class OptimizationTaskAdmin(AccountAdminMixin, admin.ModelAdmin): +class OptimizationTaskAdmin(AccountAdminMixin, ModelAdmin): list_display = ['content', 'account', 'status', 'credits_used', 'created_at'] list_filter = ['status', 'created_at'] search_fields = ['content__title', 'account__name'] diff --git a/backend/igny8_core/business/publishing/admin.py b/backend/igny8_core/business/publishing/admin.py index fd1ad64a..ccd2c0f0 100644 --- a/backend/igny8_core/business/publishing/admin.py +++ b/backend/igny8_core/business/publishing/admin.py @@ -1,10 +1,11 @@ from django.contrib import admin +from unfold.admin import ModelAdmin from igny8_core.admin.base import SiteSectorAdminMixin from .models import PublishingRecord, DeploymentRecord @admin.register(PublishingRecord) -class PublishingRecordAdmin(SiteSectorAdminMixin, admin.ModelAdmin): +class PublishingRecordAdmin(SiteSectorAdminMixin, ModelAdmin): list_display = [ 'content', 'site', @@ -20,7 +21,7 @@ class PublishingRecordAdmin(SiteSectorAdminMixin, admin.ModelAdmin): @admin.register(DeploymentRecord) -class DeploymentRecordAdmin(SiteSectorAdminMixin, admin.ModelAdmin): +class DeploymentRecordAdmin(SiteSectorAdminMixin, ModelAdmin): list_display = [ 'site', 'sector', diff --git a/backend/igny8_core/modules/billing/admin.py b/backend/igny8_core/modules/billing/admin.py index 7531c1f5..6eacf206 100644 --- a/backend/igny8_core/modules/billing/admin.py +++ b/backend/igny8_core/modules/billing/admin.py @@ -4,6 +4,7 @@ Billing Module Admin from django.contrib import admin from django.utils.html import format_html from django.contrib import messages +from unfold.admin import ModelAdmin from igny8_core.admin.base import AccountAdminMixin from igny8_core.business.billing.models import ( CreditCostConfig, @@ -28,7 +29,7 @@ class CreditTransactionResource(resources.ModelResource): @admin.register(CreditTransaction) -class CreditTransactionAdmin(ExportMixin, AccountAdminMixin, admin.ModelAdmin): +class CreditTransactionAdmin(ExportMixin, AccountAdminMixin, ModelAdmin): resource_class = CreditTransactionResource list_display = ['id', 'account', 'transaction_type', 'amount', 'balance_after', 'description', 'created_at'] list_filter = ['transaction_type', ('created_at', DateRangeFilter), 'account'] @@ -47,7 +48,7 @@ class CreditTransactionAdmin(ExportMixin, AccountAdminMixin, admin.ModelAdmin): @admin.register(CreditUsageLog) -class CreditUsageLogAdmin(AccountAdminMixin, admin.ModelAdmin): +class CreditUsageLogAdmin(AccountAdminMixin, ModelAdmin): list_display = ['id', 'account', 'operation_type', 'credits_used', 'cost_usd', 'model_used', 'created_at'] list_filter = ['operation_type', 'created_at', 'account', 'model_used'] search_fields = ['account__name', 'model_used'] @@ -65,7 +66,7 @@ class CreditUsageLogAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(Invoice) -class InvoiceAdmin(AccountAdminMixin, admin.ModelAdmin): +class InvoiceAdmin(AccountAdminMixin, ModelAdmin): list_display = [ 'invoice_number', 'account', @@ -91,7 +92,7 @@ class PaymentResource(resources.ModelResource): @admin.register(Payment) -class PaymentAdmin(ExportMixin, AccountAdminMixin, admin.ModelAdmin): +class PaymentAdmin(ExportMixin, AccountAdminMixin, ModelAdmin): """ Main Payment Admin with approval workflow. When you change status to 'succeeded', it automatically: @@ -373,7 +374,7 @@ class PaymentAdmin(ExportMixin, AccountAdminMixin, admin.ModelAdmin): @admin.register(CreditPackage) -class CreditPackageAdmin(admin.ModelAdmin): +class CreditPackageAdmin(ModelAdmin): list_display = ['name', 'slug', 'credits', 'price', 'discount_percentage', 'is_active', 'is_featured', 'sort_order'] list_filter = ['is_active', 'is_featured'] search_fields = ['name', 'slug'] @@ -381,7 +382,7 @@ class CreditPackageAdmin(admin.ModelAdmin): @admin.register(PaymentMethodConfig) -class PaymentMethodConfigAdmin(admin.ModelAdmin): +class PaymentMethodConfigAdmin(ModelAdmin): list_display = ['country_code', 'payment_method', 'display_name', 'is_enabled', 'sort_order', 'updated_at'] list_filter = ['payment_method', 'is_enabled', 'country_code'] search_fields = ['country_code', 'display_name', 'payment_method'] @@ -390,7 +391,7 @@ class PaymentMethodConfigAdmin(admin.ModelAdmin): @admin.register(AccountPaymentMethod) -class AccountPaymentMethodAdmin(AccountAdminMixin, admin.ModelAdmin): +class AccountPaymentMethodAdmin(AccountAdminMixin, ModelAdmin): list_display = [ 'display_name', 'type', @@ -419,7 +420,7 @@ class AccountPaymentMethodAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(CreditCostConfig) -class CreditCostConfigAdmin(admin.ModelAdmin): +class CreditCostConfigAdmin(ModelAdmin): list_display = [ 'operation_type', 'display_name', diff --git a/backend/igny8_core/modules/planner/admin.py b/backend/igny8_core/modules/planner/admin.py index b4b05857..bd2d1893 100644 --- a/backend/igny8_core/modules/planner/admin.py +++ b/backend/igny8_core/modules/planner/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin from django.contrib import messages +from unfold.admin import ModelAdmin from igny8_core.admin.base import SiteSectorAdminMixin from .models import Keywords, Clusters, ContentIdeas from import_export.admin import ExportMixin @@ -16,7 +17,7 @@ class KeywordsResource(resources.ModelResource): @admin.register(Clusters) -class ClustersAdmin(SiteSectorAdminMixin, admin.ModelAdmin): +class ClustersAdmin(SiteSectorAdminMixin, ModelAdmin): list_display = ['name', 'site', 'sector', 'keywords_count', 'volume', 'status', 'created_at'] list_filter = ['status', 'site', 'sector'] search_fields = ['name'] @@ -40,7 +41,7 @@ class ClustersAdmin(SiteSectorAdminMixin, admin.ModelAdmin): @admin.register(Keywords) -class KeywordsAdmin(ExportMixin, SiteSectorAdminMixin, admin.ModelAdmin): +class KeywordsAdmin(ExportMixin, SiteSectorAdminMixin, ModelAdmin): resource_class = KeywordsResource list_display = ['keyword', 'seed_keyword', 'site', 'sector', 'cluster', 'volume', 'difficulty', 'intent', 'status', 'created_at'] list_filter = ['status', 'seed_keyword__intent', 'site', 'sector', 'seed_keyword__industry', 'seed_keyword__sector'] @@ -130,7 +131,7 @@ class KeywordsAdmin(ExportMixin, SiteSectorAdminMixin, admin.ModelAdmin): @admin.register(ContentIdeas) -class ContentIdeasAdmin(SiteSectorAdminMixin, admin.ModelAdmin): +class ContentIdeasAdmin(SiteSectorAdminMixin, ModelAdmin): list_display = ['idea_title', 'site', 'sector', 'description_preview', 'content_type', 'content_structure', 'status', 'keyword_cluster', 'estimated_word_count', 'created_at'] list_filter = ['status', 'content_type', 'content_structure', 'site', 'sector'] search_fields = ['idea_title', 'target_keywords', 'description'] diff --git a/backend/igny8_core/modules/system/admin.py b/backend/igny8_core/modules/system/admin.py index 1acdb209..0840bd56 100644 --- a/backend/igny8_core/modules/system/admin.py +++ b/backend/igny8_core/modules/system/admin.py @@ -2,6 +2,7 @@ System Module Admin """ from django.contrib import admin +from unfold.admin import ModelAdmin from igny8_core.admin.base import AccountAdminMixin from .models import AIPrompt, IntegrationSettings, AuthorProfile, Strategy @@ -15,7 +16,7 @@ try: from .models import SystemLog, SystemStatus @admin.register(SystemLog) - class SystemLogAdmin(AccountAdminMixin, admin.ModelAdmin): + class SystemLogAdmin(AccountAdminMixin, ModelAdmin): list_display = ['id', 'account', 'module', 'level', 'action', 'message', 'created_at'] list_filter = ['module', 'level', 'created_at', 'account'] search_fields = ['message', 'action'] @@ -24,7 +25,7 @@ try: @admin.register(SystemStatus) - class SystemStatusAdmin(AccountAdminMixin, admin.ModelAdmin): + class SystemStatusAdmin(AccountAdminMixin, ModelAdmin): list_display = ['component', 'account', 'status', 'message', 'last_check'] list_filter = ['status', 'component', 'account'] search_fields = ['component', 'message'] @@ -34,7 +35,7 @@ except ImportError: @admin.register(AIPrompt) -class AIPromptAdmin(AccountAdminMixin, admin.ModelAdmin): +class AIPromptAdmin(AccountAdminMixin, ModelAdmin): list_display = ['id', 'prompt_type', 'account', 'is_active', 'updated_at'] list_filter = ['prompt_type', 'is_active', 'account'] search_fields = ['prompt_type'] @@ -63,7 +64,7 @@ class AIPromptAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(IntegrationSettings) -class IntegrationSettingsAdmin(AccountAdminMixin, admin.ModelAdmin): +class IntegrationSettingsAdmin(AccountAdminMixin, ModelAdmin): list_display = ['id', 'integration_type', 'account', 'is_active', 'updated_at'] list_filter = ['integration_type', 'is_active', 'account'] search_fields = ['integration_type'] @@ -99,7 +100,7 @@ class IntegrationSettingsAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(AuthorProfile) -class AuthorProfileAdmin(AccountAdminMixin, admin.ModelAdmin): +class AuthorProfileAdmin(AccountAdminMixin, ModelAdmin): list_display = ['name', 'account', 'tone', 'language', 'is_active', 'created_at'] list_filter = ['is_active', 'tone', 'language', 'account'] search_fields = ['name', 'description', 'tone'] @@ -128,7 +129,7 @@ class AuthorProfileAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(Strategy) -class StrategyAdmin(AccountAdminMixin, admin.ModelAdmin): +class StrategyAdmin(AccountAdminMixin, ModelAdmin): list_display = ['name', 'account', 'sector', 'is_active', 'created_at'] list_filter = ['is_active', 'account'] search_fields = ['name', 'description'] diff --git a/backend/igny8_core/modules/system/settings_admin.py b/backend/igny8_core/modules/system/settings_admin.py index 059e16d3..5b9516b4 100644 --- a/backend/igny8_core/modules/system/settings_admin.py +++ b/backend/igny8_core/modules/system/settings_admin.py @@ -2,12 +2,13 @@ Settings Models Admin """ from django.contrib import admin +from unfold.admin import ModelAdmin from igny8_core.admin.base import AccountAdminMixin from .settings_models import SystemSettings, AccountSettings, UserSettings, ModuleSettings, ModuleEnableSettings, AISettings @admin.register(SystemSettings) -class SystemSettingsAdmin(admin.ModelAdmin): +class SystemSettingsAdmin(ModelAdmin): """SystemSettings - Global, no account filtering""" list_display = ['key', 'description', 'updated_at'] search_fields = ['key', 'description'] @@ -15,7 +16,7 @@ class SystemSettingsAdmin(admin.ModelAdmin): @admin.register(AccountSettings) -class AccountSettingsAdmin(AccountAdminMixin, admin.ModelAdmin): +class AccountSettingsAdmin(AccountAdminMixin, ModelAdmin): list_display = ['account', 'key', 'is_active', 'updated_at'] list_filter = ['is_active', 'account'] search_fields = ['key', 'account__name'] @@ -32,7 +33,7 @@ class AccountSettingsAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(UserSettings) -class UserSettingsAdmin(admin.ModelAdmin): +class UserSettingsAdmin(ModelAdmin): list_display = ['user', 'account', 'key', 'updated_at'] list_filter = ['account'] search_fields = ['key', 'user__email', 'account__name'] @@ -59,7 +60,7 @@ class UserSettingsAdmin(admin.ModelAdmin): @admin.register(ModuleSettings) -class ModuleSettingsAdmin(AccountAdminMixin, admin.ModelAdmin): +class ModuleSettingsAdmin(AccountAdminMixin, ModelAdmin): list_display = ['account', 'module_name', 'key', 'is_active', 'updated_at'] list_filter = ['module_name', 'is_active', 'account'] search_fields = ['key', 'module_name', 'account__name'] @@ -76,7 +77,7 @@ class ModuleSettingsAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(AISettings) -class AISettingsAdmin(AccountAdminMixin, admin.ModelAdmin): +class AISettingsAdmin(AccountAdminMixin, ModelAdmin): list_display = ['account', 'integration_type', 'is_active', 'updated_at'] list_filter = ['integration_type', 'is_active', 'account'] search_fields = ['integration_type', 'account__name'] @@ -93,7 +94,7 @@ class AISettingsAdmin(AccountAdminMixin, admin.ModelAdmin): @admin.register(ModuleEnableSettings) -class ModuleEnableSettingsAdmin(AccountAdminMixin, admin.ModelAdmin): +class ModuleEnableSettingsAdmin(AccountAdminMixin, ModelAdmin): list_display = [ 'account', 'planner_enabled', diff --git a/backend/igny8_core/modules/writer/admin.py b/backend/igny8_core/modules/writer/admin.py index d168e074..8d0c0cf7 100644 --- a/backend/igny8_core/modules/writer/admin.py +++ b/backend/igny8_core/modules/writer/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin from django.contrib import messages +from unfold.admin import ModelAdmin from igny8_core.admin.base import SiteSectorAdminMixin from .models import Tasks, Images, Content from igny8_core.business.content.models import ContentTaxonomy, ContentAttribute, ContentTaxonomyRelation, ContentClusterMap @@ -26,7 +27,7 @@ class TaskResource(resources.ModelResource): @admin.register(Tasks) -class TasksAdmin(ExportMixin, SiteSectorAdminMixin, admin.ModelAdmin): +class TasksAdmin(ExportMixin, SiteSectorAdminMixin, ModelAdmin): resource_class = TaskResource list_display = ['title', 'content_type', 'content_structure', 'site', 'sector', 'status', 'cluster', 'created_at'] list_filter = ['status', 'content_type', 'content_structure', 'site', 'sector', 'cluster'] @@ -141,7 +142,7 @@ class TasksAdmin(ExportMixin, SiteSectorAdminMixin, admin.ModelAdmin): @admin.register(Images) -class ImagesAdmin(SiteSectorAdminMixin, admin.ModelAdmin): +class ImagesAdmin(SiteSectorAdminMixin, ModelAdmin): list_display = ['get_content_title', 'site', 'sector', 'image_type', 'status', 'position', 'created_at'] list_filter = ['image_type', 'status', 'site', 'sector'] search_fields = ['content__title'] @@ -183,7 +184,7 @@ class ContentResource(resources.ModelResource): @admin.register(Content) -class ContentAdmin(ExportMixin, SiteSectorAdminMixin, admin.ModelAdmin): +class ContentAdmin(ExportMixin, SiteSectorAdminMixin, ModelAdmin): resource_class = ContentResource list_display = ['title', 'content_type', 'content_structure', 'site', 'sector', 'source', 'status', 'get_taxonomy_count', 'created_at'] list_filter = ['content_type', 'content_structure', 'source', 'status', 'site', 'sector', 'created_at'] @@ -326,7 +327,7 @@ class ContentAdmin(ExportMixin, SiteSectorAdminMixin, admin.ModelAdmin): @admin.register(ContentTaxonomy) -class ContentTaxonomyAdmin(SiteSectorAdminMixin, admin.ModelAdmin): +class ContentTaxonomyAdmin(SiteSectorAdminMixin, ModelAdmin): list_display = ['name', 'taxonomy_type', 'slug', 'count', 'external_id', 'external_taxonomy', 'site', 'sector'] list_filter = ['taxonomy_type', 'site', 'sector'] search_fields = ['name', 'slug', 'external_taxonomy'] @@ -357,7 +358,7 @@ class ContentTaxonomyAdmin(SiteSectorAdminMixin, admin.ModelAdmin): @admin.register(ContentAttribute) -class ContentAttributeAdmin(SiteSectorAdminMixin, admin.ModelAdmin): +class ContentAttributeAdmin(SiteSectorAdminMixin, ModelAdmin): list_display = ['name', 'value', 'attribute_type', 'content', 'cluster', 'external_id', 'source', 'site', 'sector'] list_filter = ['attribute_type', 'source', 'site', 'sector'] search_fields = ['name', 'value', 'external_attribute_name', 'content__title'] @@ -382,14 +383,14 @@ class ContentAttributeAdmin(SiteSectorAdminMixin, admin.ModelAdmin): @admin.register(ContentTaxonomyRelation) -class ContentTaxonomyRelationAdmin(admin.ModelAdmin): +class ContentTaxonomyRelationAdmin(ModelAdmin): list_display = ['content', 'taxonomy', 'created_at'] search_fields = ['content__title', 'taxonomy__name'] readonly_fields = ['created_at', 'updated_at'] @admin.register(ContentClusterMap) -class ContentClusterMapAdmin(SiteSectorAdminMixin, admin.ModelAdmin): +class ContentClusterMapAdmin(SiteSectorAdminMixin, ModelAdmin): list_display = ['content', 'task', 'cluster', 'role', 'source', 'site', 'sector', 'created_at'] list_filter = ['role', 'source', 'site', 'sector'] search_fields = ['content__title', 'task__title', 'cluster__name'] diff --git a/backend/igny8_core/static/admin/css/igny8_admin.css b/backend/igny8_core/static/admin/css/igny8_admin.css deleted file mode 100644 index 00b55e29..00000000 --- a/backend/igny8_core/static/admin/css/igny8_admin.css +++ /dev/null @@ -1,1303 +0,0 @@ -/* =================================================================== - IGNY8 CUSTOM ADMIN STYLES - COMPLETE REDESIGN - =================================================================== - Using exact IGNY8 brand colors from frontend design system - =================================================================== */ - -/* IGNY8 Brand Color Variables - Matching Frontend App */ -:root { - /* Primary Colors */ - --igny8-primary: #0693e3; /* Primary brand blue */ - --igny8-primary-dark: #0472b8; /* Primary dark */ - --igny8-primary-light: #3da9e8; /* Primary light */ - - /* Accent Colors */ - --igny8-success: #0bbf87; /* Success teal-green */ - --igny8-success-dark: #08966b; /* Success dark */ - --igny8-warning: #ff7a00; /* Warning orange */ - --igny8-warning-dark: #cc5f00; /* Warning dark */ - --igny8-danger: #ef4444; /* Danger red */ - --igny8-danger-dark: #d13333; /* Danger dark */ - --igny8-purple: #5d4ae3; /* Purple accent */ - --igny8-purple-dark: #3a2f94; /* Purple dark */ - - /* Neutral Colors */ - --igny8-navy: #0d1b2a; /* Dark navy background */ - --igny8-navy-light: #1a2e44; /* Navy light */ - --igny8-surface: #f8fafc; /* Page background */ - --igny8-panel: #ffffff; /* Panel background */ - --igny8-text: #1e293b; /* Main text */ - --igny8-text-light: #64748b; /* Light text */ - --igny8-text-dim: #94a3b8; /* Dimmed text */ - --igny8-stroke: #e2e8f0; /* Borders */ - --igny8-stroke-dark: #cbd5e1; /* Dark borders */ -} - -/* =================================================================== - GLOBAL RESETS - =================================================================== */ -body { - background: var(--igny8-surface) !important; - color: var(--igny8-text) !important; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !important; -} - -/* =================================================================== - HEADER - Clean Professional Design - =================================================================== */ -#header { - background: linear-gradient(135deg, var(--igny8-primary) 0%, var(--igny8-primary-dark) 100%) !important; - color: white !important; - box-shadow: 0 2px 8px rgba(0,0,0,0.1) !important; - padding: 0 !important; -} - -#branding { - padding: 16px 30px !important; -} - -#branding h1 { - margin: 0 !important; - font-size: 20px !important; - font-weight: 600 !important; -} - -#branding h1 a:link, -#branding h1 a:visited { - color: white !important; - text-decoration: none !important; - display: flex !important; - align-items: center !important; - gap: 10px !important; -} - -#header a:link, -#header a:visited { - color: white !important; -} - -/* =================================================================== - ADD RECORD BUTTON - Modern Accent Color - =================================================================== */ -.object-tools { - margin-bottom: 24px !important; - float: right !important; -} - -.object-tools li { - margin: 0 !important; - list-style: none !important; -} - -.object-tools a.addlink { - background: linear-gradient(135deg, var(--igny8-success) 0%, var(--igny8-success-dark) 100%) !important; - color: white !important; - padding: 12px 28px !important; - border-radius: 8px !important; - font-weight: 600 !important; - font-size: 14px !important; - text-decoration: none !important; - display: inline-flex !important; - align-items: center !important; - gap: 10px !important; - box-shadow: 0 2px 6px rgba(11, 191, 135, 0.3) !important; - transition: all 0.2s ease !important; - border: none !important; - text-transform: none !important; -} - -.object-tools a.addlink:before { - content: "\f067" !important; - font-family: "Font Awesome 6 Free" !important; - font-weight: 900 !important; - font-size: 14px !important; - margin-right: 0 !important; - background: none !important; - border: none !important; - width: auto !important; - height: auto !important; -} - -.object-tools a.addlink:hover { - background: linear-gradient(135deg, var(--igny8-success-dark) 0%, #067354 100%) !important; - box-shadow: 0 4px 12px rgba(11, 191, 135, 0.4) !important; - transform: translateY(-2px) !important; -} - -/* =================================================================== - EXPORT BUTTON - Purple Accent - =================================================================== */ -a[href*="export"], -.export-button, -input[name="_export"] { - background: linear-gradient(135deg, var(--igny8-purple) 0%, var(--igny8-purple-dark) 100%) !important; - color: white !important; - padding: 10px 24px !important; - border-radius: 8px !important; - font-weight: 600 !important; - font-size: 13px !important; - text-decoration: none !important; - display: inline-flex !important; - align-items: center !important; - gap: 8px !important; - box-shadow: 0 2px 6px rgba(93, 74, 227, 0.3) !important; - transition: all 0.2s ease !important; - border: none !important; - cursor: pointer !important; -} - -a[href*="export"]:hover, -.export-button:hover, -input[name="_export"]:hover { - background: linear-gradient(135deg, var(--igny8-purple-dark) 0%, #2a1f6b 100%) !important; - box-shadow: 0 4px 12px rgba(93, 74, 227, 0.4) !important; - transform: translateY(-2px) !important; -} - -/* =================================================================== - SEARCH BAR & TOOLBAR - Professional Layout - =================================================================== */ -#toolbar { - padding: 20px 24px !important; - background: var(--igny8-panel) !important; - border: 1px solid var(--igny8-stroke) !important; - border-radius: 12px !important; - margin-bottom: 24px !important; - box-shadow: 0 1px 3px rgba(0,0,0,0.05) !important; -} - -#toolbar form { - display: flex !important; - gap: 12px !important; - align-items: center !important; -} - -#toolbar input[type="text"], -#searchbar { - flex: 1 !important; - min-width: 320px !important; - max-width: 500px !important; - padding: 12px 18px !important; - border: 1.5px solid var(--igny8-stroke) !important; - border-radius: 8px !important; - font-size: 14px !important; - transition: all 0.2s ease !important; - background: var(--igny8-panel) !important; - color: var(--igny8-text) !important; -} - -#toolbar input[type="text"]:focus, -#searchbar:focus { - border-color: var(--igny8-primary) !important; - outline: none !important; - box-shadow: 0 0 0 4px rgba(6, 147, 227, 0.1) !important; -} - -#toolbar input[type="submit"], -#toolbar button[type="submit"] { - background: linear-gradient(135deg, var(--igny8-primary) 0%, var(--igny8-primary-dark) 100%) !important; - color: white !important; - padding: 12px 28px !important; - border: none !important; - border-radius: 8px !important; - font-weight: 600 !important; - font-size: 14px !important; - cursor: pointer !important; - transition: all 0.2s ease !important; - box-shadow: 0 2px 6px rgba(6, 147, 227, 0.3) !important; -} - -#toolbar input[type="submit"]:hover, -#toolbar button[type="submit"]:hover { - background: linear-gradient(135deg, var(--igny8-primary-dark) 0%, #035a8f 100%) !important; - box-shadow: 0 4px 12px rgba(6, 147, 227, 0.4) !important; - transform: translateY(-2px) !important; -} - -/* =================================================================== - ACTIONS BAR - Better Styling - =================================================================== */ -#changelist-form .actions { - padding: 20px 24px !important; - background: var(--igny8-panel) !important; - border: 1px solid var(--igny8-stroke) !important; - border-radius: 12px !important; - margin-bottom: 24px !important; - display: flex !important; - align-items: center !important; - gap: 16px !important; - box-shadow: 0 1px 3px rgba(0,0,0,0.05) !important; -} - -#changelist-form .actions label { - font-weight: 600 !important; - color: var(--igny8-text) !important; - font-size: 14px !important; - margin-right: 0 !important; -} - -#changelist-form .actions select { - min-width: 240px !important; - padding: 12px 18px !important; - border: 1.5px solid var(--igny8-stroke) !important; - border-radius: 8px !important; - font-size: 14px !important; - transition: all 0.2s ease !important; - background: var(--igny8-panel) !important; - color: var(--igny8-text) !important; -} - -#changelist-form .actions select:focus { - border-color: var(--igny8-primary) !important; - outline: none !important; - box-shadow: 0 0 0 4px rgba(6, 147, 227, 0.1) !important; -} - -#changelist-form .actions button, -#changelist-form .actions input[type="submit"] { - background: linear-gradient(135deg, var(--igny8-primary) 0%, var(--igny8-primary-dark) 100%) !important; - color: white !important; - padding: 12px 28px !important; - border: none !important; - border-radius: 8px !important; - font-weight: 600 !important; - font-size: 14px !important; - cursor: pointer !important; - transition: all 0.2s ease !important; - box-shadow: 0 2px 6px rgba(6, 147, 227, 0.3) !important; -} - -#changelist-form .actions button:hover, -#changelist-form .actions input[type="submit"]:hover { - background: linear-gradient(135deg, var(--igny8-primary-dark) 0%, #035a8f 100%) !important; - box-shadow: 0 4px 12px rgba(6, 147, 227, 0.4) !important; - transform: translateY(-2px) !important; -} - -/* =================================================================== - FILTERS PANEL - Clear Organization - =================================================================== */ -#changelist-filter { - background: var(--igny8-panel) !important; - border: 1px solid var(--igny8-stroke) !important; - border-radius: 12px !important; - padding: 0 !important; - box-shadow: 0 1px 3px rgba(0,0,0,0.05) !important; -} - -#changelist-filter h2 { - background: linear-gradient(135deg, var(--igny8-navy) 0%, var(--igny8-navy-light) 100%) !important; - color: white !important; - padding: 18px 24px !important; - margin: 0 !important; - font-size: 16px !important; - font-weight: 600 !important; - border-radius: 12px 12px 0 0 !important; - display: flex !important; - align-items: center !important; - gap: 10px !important; -} - -#changelist-filter h2:before { - content: "\f0b0" !important; - font-family: "Font Awesome 6 Free" !important; - font-weight: 900 !important; -} - -#changelist-filter h3 { - background: var(--igny8-surface) !important; - color: var(--igny8-text) !important; - padding: 14px 24px !important; - margin: 0 !important; - font-size: 14px !important; - font-weight: 600 !important; - border-top: 1px solid var(--igny8-stroke) !important; - border-bottom: 1px solid var(--igny8-stroke) !important; -} - -#changelist-filter ul { - padding: 16px 24px !important; - margin: 0 !important; -} - -#changelist-filter li { - padding: 0 !important; - margin: 0 0 8px 0 !important; - list-style: none !important; -} - -#changelist-filter a { - color: var(--igny8-text) !important; - text-decoration: none !important; - display: block !important; - padding: 10px 16px !important; - border-radius: 6px !important; - transition: all 0.2s ease !important; - font-size: 14px !important; -} - -#changelist-filter a:hover { - background: var(--igny8-surface) !important; - color: var(--igny8-primary) !important; -} - -#changelist-filter a.selected { - background: linear-gradient(135deg, var(--igny8-primary) 0%, var(--igny8-primary-dark) 100%) !important; - color: white !important; - font-weight: 600 !important; - box-shadow: 0 2px 4px rgba(6, 147, 227, 0.2) !important; -} - -#changelist-filter .quiet { - color: var(--igny8-text-dim) !important; - font-size: 13px !important; -} - -/* =================================================================== - ADD RECORD BUTTON - Clean Professional Style - =================================================================== */ -.object-tools { - margin-bottom: 20px !important; -} - -.object-tools li { - margin: 0 !important; -} - -.object-tools a.addlink { - background: linear-gradient(135deg, var(--igny8-primary) 0%, var(--igny8-primary-dark) 100%) !important; - color: white !important; - padding: 12px 24px !important; - border-radius: 8px !important; - font-weight: 600 !important; - font-size: 14px !important; - text-decoration: none !important; - display: inline-flex !important; - align-items: center !important; - gap: 8px !important; - box-shadow: 0 2px 4px rgba(6, 147, 227, 0.3) !important; - transition: all 0.2s ease !important; - border: none !important; -} - -.object-tools a.addlink:before { - content: "+" !important; - font-size: 18px !important; - font-weight: bold !important; - margin-right: 0 !important; - background: none !important; - border: none !important; - width: auto !important; - height: auto !important; -} - -.object-tools a.addlink:hover { - background: linear-gradient(135deg, var(--igny8-primary-dark) 0%, #035a8f 100%) !important; - box-shadow: 0 4px 8px rgba(6, 147, 227, 0.4) !important; - transform: translateY(-1px) !important; -} - -/* Remove the background from the + icon */ -.object-tools a.addlink:before { - background: none !important; -} - -/* =================================================================== - SEARCH & ACTION BAR - Better Sizing and Layout - =================================================================== */ -#toolbar { - padding: 16px 20px !important; - background: var(--igny8-panel) !important; - border: 1px solid var(--igny8-stroke) !important; - border-radius: 8px !important; - margin-bottom: 20px !important; - display: flex !important; - gap: 16px !important; - align-items: center !important; - flex-wrap: wrap !important; -} - -#toolbar form { - display: flex !important; - gap: 12px !important; - align-items: center !important; - flex: 1 !important; - max-width: 600px !important; -} - -#toolbar input[type="text"] { - flex: 1 !important; - min-width: 250px !important; - padding: 10px 16px !important; - border: 1px solid var(--igny8-stroke) !important; - border-radius: 6px !important; - font-size: 14px !important; - transition: all 0.2s ease !important; -} - -#toolbar input[type="text"]:focus { - border-color: var(--igny8-primary) !important; - outline: none !important; - box-shadow: 0 0 0 3px rgba(6, 147, 227, 0.1) !important; -} - -#toolbar input[type="submit"], -#toolbar button[type="submit"] { - background: linear-gradient(135deg, var(--igny8-primary) 0%, var(--igny8-primary-dark) 100%) !important; - color: white !important; - padding: 10px 24px !important; - border: none !important; - border-radius: 6px !important; - font-weight: 600 !important; - font-size: 14px !important; - cursor: pointer !important; - transition: all 0.2s ease !important; - box-shadow: 0 2px 4px rgba(6, 147, 227, 0.2) !important; -} - -#toolbar input[type="submit"]:hover, -#toolbar button[type="submit"]:hover { - background: linear-gradient(135deg, var(--igny8-primary-dark) 0%, #035a8f 100%) !important; - box-shadow: 0 4px 8px rgba(6, 147, 227, 0.3) !important; - transform: translateY(-1px) !important; -} - -/* Action dropdown */ -#changelist-form .actions { - padding: 16px 20px !important; - background: var(--igny8-panel) !important; - border: 1px solid var(--igny8-stroke) !important; - border-radius: 8px !important; - margin-bottom: 20px !important; -} - -#changelist-form .actions select { - min-width: 220px !important; - padding: 10px 16px !important; - border: 1px solid var(--igny8-stroke) !important; - border-radius: 6px !important; - font-size: 14px !important; - margin-right: 12px !important; - transition: all 0.2s ease !important; -} - -#changelist-form .actions select:focus { - border-color: var(--igny8-primary) !important; - outline: none !important; - box-shadow: 0 0 0 3px rgba(6, 147, 227, 0.1) !important; -} - -#changelist-form .actions button, -#changelist-form .actions input[type="submit"] { - background: linear-gradient(135deg, var(--igny8-primary) 0%, var(--igny8-primary-dark) 100%) !important; - color: white !important; - padding: 10px 24px !important; - border: none !important; - border-radius: 6px !important; - font-weight: 600 !important; - font-size: 14px !important; - cursor: pointer !important; - transition: all 0.2s ease !important; - box-shadow: 0 2px 4px rgba(6, 147, 227, 0.2) !important; -} - -#changelist-form .actions button:hover, -#changelist-form .actions input[type="submit"]:hover { - background: linear-gradient(135deg, var(--igny8-primary-dark) 0%, #035a8f 100%) !important; - box-shadow: 0 4px 8px rgba(6, 147, 227, 0.3) !important; - transform: translateY(-1px) !important; -} - -/* =================================================================== - FILTERS - Clear Labels and Better Organization - =================================================================== */ -#changelist-filter { - background: var(--igny8-panel) !important; - border: 1px solid var(--igny8-stroke) !important; - border-radius: 8px !important; - padding: 0 !important; -} - -#changelist-filter h2 { - background: linear-gradient(135deg, var(--igny8-navy) 0%, var(--igny8-navy-light) 100%) !important; - color: white !important; - padding: 16px 20px !important; - margin: 0 !important; - font-size: 16px !important; - font-weight: 600 !important; - border-radius: 8px 8px 0 0 !important; -} - -#changelist-filter h3 { - background: var(--igny8-surface) !important; - color: var(--igny8-text) !important; - padding: 12px 20px !important; - margin: 0 !important; - font-size: 14px !important; - font-weight: 600 !important; - border-top: 1px solid var(--igny8-stroke) !important; - border-bottom: 1px solid var(--igny8-stroke) !important; -} - -#changelist-filter ul { - padding: 12px 20px !important; - margin: 0 0 16px 0 !important; -} - -#changelist-filter li { - padding: 8px 0 !important; - margin: 0 !important; - list-style: none !important; -} - -#changelist-filter a { - color: var(--igny8-text) !important; - text-decoration: none !important; - display: block !important; - padding: 6px 12px !important; - border-radius: 4px !important; - transition: all 0.2s ease !important; - font-size: 14px !important; -} - -#changelist-filter a:hover { - background: var(--igny8-surface) !important; - color: var(--igny8-primary) !important; -} - -#changelist-filter a.selected { - background: linear-gradient(135deg, var(--igny8-primary) 0%, var(--igny8-primary-dark) 100%) !important; - color: white !important; - font-weight: 600 !important; -} - -#changelist-filter .quiet { - color: var(--igny8-text-dim) !important; - font-size: 13px !important; -} - -/* =================================================================== - SIDEBAR NAVIGATION - IGNY8 Navy Background for Readability - =================================================================== */ -#changelist-filter { - background: var(--igny8-surface) !important; -} - -#changelist-filter h2 { - background: var(--igny8-navy) !important; - color: white !important; - padding: 10px !important; - margin: 0 0 10px 0 !important; - border-radius: 4px !important; -} - -#changelist-filter h3 { - color: var(--igny8-text) !important; - font-weight: bold !important; - margin-top: 15px !important; - padding: 8px 10px !important; - background: var(--igny8-surface) !important; - border-left: 3px solid var(--igny8-primary) !important; -} - -#changelist-filter li { - padding: 5px 10px !important; -} - -#changelist-filter li.selected { - background: rgba(6, 147, 227, 0.1) !important; - border-left: 3px solid var(--igny8-primary) !important; -} - -/* Module headers - Navy instead of bright blue */ -.module h2, .inline-group h2 { - background: var(--igny8-navy) !important; - color: white !important; - padding: 10px !important; - border-radius: 4px 4px 0 0 !important; -} - -/* Table headers - White with blue text for readability */ -.module caption, .module th, thead th { - background: var(--igny8-surface) !important; - color: var(--igny8-primary) !important; - font-weight: 600 !important; - border-bottom: 2px solid var(--igny8-primary) !important; -} - -#result_list thead th { - background: var(--igny8-surface) !important; - color: var(--igny8-primary) !important; - padding: 12px 10px !important; - border-bottom: 2px solid var(--igny8-primary) !important; -} - -/* Table header links */ -#result_list thead th a:link, -#result_list thead th a:visited { - color: var(--igny8-primary) !important; - font-weight: 600 !important; -} - -/* =================================================================== - BUTTONS - IGNY8 Primary Blue - =================================================================== */ -.button, input[type=submit], input[type=button], .submit-row input, button, .btn { - background: var(--igny8-primary) !important; - color: white !important; - border: none !important; - padding: 10px 15px !important; - border-radius: 4px !important; - cursor: pointer !important; - font-weight: 500 !important; -} - -.button:hover, input[type=submit]:hover, input[type=button]:hover, button:hover, .btn:hover { - background: var(--igny8-primary-dark) !important; - color: white !important; -} - -.button:active, .button:focus { - background: var(--igny8-primary-dark) !important; -} - -/* Default action button */ -.default, input[type=submit].default { - background: var(--igny8-primary) !important; - border: 2px solid var(--igny8-primary-dark) !important; -} - -/* Status badges */ -.status-active { - color: var(--igny8-success) !important; - font-weight: bold; -} - -.status-inactive { - color: var(--igny8-danger) !important; -} - -.status-pending { - color: var(--igny8-warning) !important; - font-weight: bold; -} - -.status-succeeded, .status-completed { - color: var(--igny8-success) !important; -} - -.status-failed, .status-error { - color: var(--igny8-danger) !important; -} - -/* Credit indicators */ -.credits-low { - color: var(--igny8-danger) !important; - font-weight: bold; -} - -.credits-medium { - color: var(--igny8-warning) !important; -} - -.credits-high { - color: var(--igny8-success) !important; -} - -/* Quick action buttons */ -.admin-action-button { - padding: 5px 15px; - border-radius: 4px; - cursor: pointer; - text-decoration: none; - display: inline-block; - margin: 2px; - background-color: var(--igny8-primary); - color: white; - border: none; -} - -.admin-action-button:hover { - background-color: var(--igny8-primary-dark); - color: white; - text-decoration: none; -} - -/* List view enhancements */ -#content-main table tr:hover { - background-color: var(--igny8-surface) !important; -} - -/* Improve sidebar menu appearance */ -#content-related h3 { - background: var(--igny8-primary); - color: white; - padding: 10px; - border-radius: 4px 4px 0 0; -} - -/* Better form field spacing */ -.form-row { - padding: 10px; -} - -/* Highlight required fields */ -.required label:after { - content: " *"; - color: var(--igny8-danger); -} - -/* Success messages */ -.success, .messagelist .success { - background-color: rgba(11, 191, 135, 0.1) !important; - border-color: var(--igny8-success) !important; - color: var(--igny8-success-dark) !important; -} - -/* Warning messages */ -.warning, .messagelist .warning { - background-color: rgba(255, 122, 0, 0.1) !important; - border-color: var(--igny8-warning) !important; - color: var(--igny8-warning-dark) !important; -} - -/* Error messages */ -.error, .messagelist .error { - background-color: rgba(239, 68, 68, 0.1) !important; - border-color: var(--igny8-danger) !important; - color: var(--igny8-danger-dark) !important; -} - -/* Improve table readability */ -#result_list tbody tr:nth-child(odd) { - background-color: var(--igny8-surface); -} - -#result_list tbody tr:nth-child(even) { - background-color: var(--igny8-panel); -} - -/* Better button styling */ -.button, input[type=submit], input[type=button], .submit-row input { - background: var(--igny8-primary) !important; - color: white !important; - border: none !important; - padding: 10px 15px !important; - border-radius: 4px !important; - cursor: pointer !important; -} - -.button:hover, input[type=submit]:hover, input[type=button]:hover { - background: var(--igny8-primary-dark) !important; -} - -/* Delete button styling */ -.deletelink, .deletelink-box a, a.deletelink:link, a.deletelink:visited { - background: var(--igny8-danger) !important; - color: white !important; -} - -.deletelink:hover, .deletelink-box a:hover { - background: var(--igny8-danger-dark) !important; -} - -/* =================================================================== - SIDEBAR MODULE "ADD" LINKS - Icon Only with Theme Colors - =================================================================== */ -.module .addlink, -.module a.addlink, -#content-main .module .addlink { - color: var(--igny8-text) !important; - text-decoration: none !important; - font-size: 0 !important; - padding: 0 !important; - display: inline-flex !important; - align-items: center !important; - justify-content: center !important; - transition: all 0.2s ease !important; -} - -.module .addlink:before, -.module a.addlink:before { - content: "\f067" !important; - font-family: "Font Awesome 6 Free" !important; - font-weight: 900 !important; - font-size: 12px !important; - display: inline-flex !important; - align-items: center !important; - justify-content: center !important; - width: 24px !important; - height: 24px !important; - border-radius: 6px !important; - background: linear-gradient(135deg, var(--igny8-success) 0%, var(--igny8-success-dark) 100%) !important; - color: white !important; - margin: 0 !important; - transition: all 0.2s ease !important; - box-shadow: 0 2px 4px rgba(11, 191, 135, 0.2) !important; -} - -.module .addlink:hover:before, -.module a.addlink:hover:before { - background: linear-gradient(135deg, var(--igny8-success-dark) 0%, #067354 100%) !important; - box-shadow: 0 4px 8px rgba(11, 191, 135, 0.3) !important; - transform: translateY(-1px) scale(1.05) !important; -} - -/* Module navigation styling */ -.module { - margin-bottom: 20px !important; - background: var(--igny8-panel) !important; - border: 1px solid var(--igny8-stroke) !important; - border-radius: 8px !important; - overflow: hidden !important; -} - -.module h2 { - background: linear-gradient(135deg, var(--igny8-navy) 0%, var(--igny8-navy-light) 100%) !important; - color: white !important; - padding: 14px 16px !important; - font-size: 14px !important; - font-weight: 600 !important; - margin: 0 !important; - display: flex !important; - align-items: center !important; - gap: 10px !important; -} - -.module table { - width: 100% !important; -} - -.module tr { - border-bottom: 1px solid var(--igny8-stroke) !important; -} - -.module tr:last-child { - border-bottom: none !important; -} - -.module th, -.module td { - padding: 12px 16px !important; - text-align: left !important; -} - -.module th { - background: var(--igny8-surface) !important; - color: var(--igny8-text) !important; - font-weight: 600 !important; - font-size: 13px !important; -} - -.module a { - color: var(--igny8-primary) !important; - text-decoration: none !important; - transition: color 0.2s ease !important; -} - -.module a:hover { - color: var(--igny8-primary-dark) !important; -} - -/* =================================================================== - ALL BUTTONS - Consistent Theme Colors - =================================================================== */ -.button, -input[type=submit], -input[type=button], -.submit-row input, -button:not(.close) { - background: linear-gradient(135deg, var(--igny8-primary) 0%, var(--igny8-primary-dark) 100%) !important; - color: white !important; - border: none !important; - padding: 12px 24px !important; - border-radius: 8px !important; - cursor: pointer !important; - font-weight: 600 !important; - font-size: 14px !important; - transition: all 0.2s ease !important; - box-shadow: 0 2px 6px rgba(6, 147, 227, 0.3) !important; -} - -.button:hover, -input[type=submit]:hover, -input[type=button]:hover, -button:not(.close):hover { - background: linear-gradient(135deg, var(--igny8-primary-dark) 0%, #035a8f 100%) !important; - box-shadow: 0 4px 12px rgba(6, 147, 227, 0.4) !important; - transform: translateY(-2px) !important; -} - -/* Save buttons - Success color */ -input[name="_save"], -input[name="_continue"], -.submit-row input[type="submit"]:first-child { - background: linear-gradient(135deg, var(--igny8-success) 0%, var(--igny8-success-dark) 100%) !important; - box-shadow: 0 2px 6px rgba(11, 191, 135, 0.3) !important; -} - -input[name="_save"]:hover, -input[name="_continue"]:hover { - background: linear-gradient(135deg, var(--igny8-success-dark) 0%, #067354 100%) !important; - box-shadow: 0 4px 12px rgba(11, 191, 135, 0.4) !important; -} - -/* Delete buttons - Danger color */ -.deletelink, -.deletelink-box a, -a.deletelink:link, -a.deletelink:visited, -input[name="_delete"], -.delete-confirmation input[type="submit"] { - background: linear-gradient(135deg, var(--igny8-danger) 0%, var(--igny8-danger-dark) 100%) !important; - color: white !important; - box-shadow: 0 2px 6px rgba(239, 68, 68, 0.3) !important; -} - -.deletelink:hover, -.deletelink-box a:hover, -input[name="_delete"]:hover { - background: linear-gradient(135deg, var(--igny8-danger-dark) 0%, #b82222 100%) !important; - box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4) !important; -} - -/* =================================================================== - TABLE IMPROVEMENTS - =================================================================== */ -#result_list { - border: 1px solid var(--igny8-stroke) !important; - border-radius: 12px !important; - overflow: hidden !important; - box-shadow: 0 1px 3px rgba(0,0,0,0.05) !important; -} - -#result_list thead th { - background: linear-gradient(135deg, var(--igny8-surface) 0%, #f1f5f9 100%) !important; - color: var(--igny8-text) !important; - padding: 16px 12px !important; - font-weight: 600 !important; - font-size: 13px !important; - text-transform: uppercase !important; - letter-spacing: 0.5px !important; - border-bottom: 2px solid var(--igny8-stroke-dark) !important; -} - -#result_list thead th a { - color: var(--igny8-text) !important; - text-decoration: none !important; -} - -#result_list tbody tr { - transition: background-color 0.2s ease !important; -} - -#result_list tbody tr:nth-child(odd) { - background-color: white !important; -} - -#result_list tbody tr:nth-child(even) { - background-color: var(--igny8-surface) !important; -} - -#result_list tbody tr:hover { - background-color: rgba(6, 147, 227, 0.05) !important; -} - -#result_list td { - padding: 14px 12px !important; - color: var(--igny8-text) !important; - font-size: 14px !important; - border-bottom: 1px solid var(--igny8-stroke) !important; -} - background: var(--igny8-danger-dark) !important; -} - -/* =================================================================== - LINKS - IGNY8 Primary Blue - =================================================================== */ -a, a:link, a:visited { - color: var(--igny8-primary) !important; -} - -a:hover, a:focus { - color: var(--igny8-primary-dark) !important; -} - -.breadcrumbs a { - color: white !important; -} - -/* =================================================================== - ACTION BAR - IGNY8 Surface Color - =================================================================== */ -.actions { - background: var(--igny8-surface) !important; - border-radius: 4px !important; - padding: 10px !important; -} - -.actions select { - border: 1px solid var(--igny8-stroke) !important; - padding: 5px !important; - border-radius: 3px !important; -} - -.actions .button, .actions button { - background: var(--igny8-primary) !important; -} - -/* =================================================================== - CHECKBOXES & ICONS - IGNY8 Colors - =================================================================== */ -input[type="checkbox"]:checked { - accent-color: var(--igny8-primary) !important; -} - -.vCheckboxLabel { - display: inline !important; -} - -/* =================================================================== - SIDEBAR SECTIONS - Better Contrast - =================================================================== */ -#content-related .module { - background: var(--igny8-panel) !important; - border: 1px solid var(--igny8-stroke) !important; -} - -#content-related h3 { - background: var(--igny8-navy) !important; - color: white !important; - padding: 10px !important; - border-radius: 4px 4px 0 0 !important; - margin: 0 !important; -} - -/* =================================================================== - FIELDSET LEGENDS - Navy Background - =================================================================== */ -fieldset.module h2, .collapse h2 { - background: var(--igny8-navy) !important; - color: white !important; - padding: 10px !important; - border-radius: 4px 4px 0 0 !important; -} - -/* =================================================================== - BREADCRUMBS - Better Visibility - =================================================================== */ -.breadcrumbs { - background: var(--igny8-navy) !important; - color: white !important; - padding: 10px 15px !important; -} - -.breadcrumbs a { - color: white !important; - opacity: 0.9; -} - -.breadcrumbs a:hover { - opacity: 1; - text-decoration: underline; -} - -/* Improve filter sidebar */ -#changelist-filter h2 { - background: var(--igny8-primary); - color: white; - padding: 8px 10px; - margin-bottom: 0; -} - -#changelist-filter h3 { - font-weight: bold; - margin-top: 15px; - padding-bottom: 5px; - border-bottom: 1px solid var(--igny8-stroke); -} - -/* Better pagination */ -.paginator { - font-size: 14px; - padding: 10px; - background: var(--igny8-surface); - border-radius: 4px; -} - -.paginator a { - padding: 5px 10px; - margin: 0 2px; - background: var(--igny8-panel); - border: 1px solid var(--igny8-stroke); - border-radius: 3px; -} - -.paginator a:hover { - background: var(--igny8-primary); - color: white; - text-decoration: none; -} - -/* Responsive improvements */ -@media (max-width: 768px) { - #content-main { - padding: 10px; - } - - .module table { - font-size: 12px; - } -} - -/* Admin header improvements */ -#header { - background: linear-gradient(135deg, var(--igny8-primary) 0%, var(--igny8-primary-dark) 100%); - color: white; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); -} - -#header a:link, #header a:visited { - color: white; -} - -#branding h1 { - color: white; -} - -/* Fieldset legend styling */ -fieldset.module h2 { - background: var(--igny8-primary); - color: white; - padding: 8px 10px; - border-radius: 4px 4px 0 0; -} - -/* Inline forms */ -.inline-group { - border: 1px solid var(--igny8-stroke); - border-radius: 4px; - margin-bottom: 20px; -} - -.inline-group .tabular { - overflow-x: auto; -} - -/* Help text styling */ -.help { - font-size: 12px; - color: var(--igny8-text-dim); - display: block; - margin-top: 5px; -} - -/* Dashboard widget styling */ -.dashboard-card { - background: var(--igny8-panel); - border: 1px solid var(--igny8-stroke); - border-radius: 8px; - padding: 20px; - margin: 10px 0; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); -} - -.dashboard-card h2 { - margin-top: 0; - border-bottom: 2px solid var(--igny8-primary); - padding-bottom: 10px; -} - -.metric { - display: inline-block; - margin: 10px 20px 10px 0; -} - -.metric-value { - font-size: 32px; - font-weight: bold; - color: var(--igny8-primary); - display: block; -} - -.metric-label { - font-size: 12px; - color: var(--igny8-text-dim); - display: block; - margin-top: 5px; -} - -/* Alert styling */ -.alert { - padding: 15px; - margin: 10px 0; - border-radius: 4px; - border-left: 4px solid; -} - -.alert-error { - background-color: rgba(239, 68, 68, 0.1); - border-left-color: var(--igny8-danger); - color: var(--igny8-danger-dark); -} - -.alert-warning { - background-color: rgba(255, 122, 0, 0.1); - border-left-color: var(--igny8-warning); - color: var(--igny8-warning-dark); -} - -.alert-info { - background-color: rgba(6, 147, 227, 0.1); - border-left-color: var(--igny8-primary); - color: var(--igny8-primary-dark); -} - -.alert-success { - background-color: rgba(11, 191, 135, 0.1); - border-left-color: var(--igny8-success); - color: var(--igny8-success-dark); -} - -/* =================================================================== - SIDEBAR MODULE ADD LINKS - Clean and Professional - =================================================================== */ -.module .addlink, -.module a.addlink, -#content-main .module .addlink { - color: var(--igny8-primary) !important; - text-decoration: none !important; - font-size: 13px !important; - font-weight: 500 !important; - padding: 6px 10px !important; - display: inline-block !important; - border-radius: 4px !important; - transition: all 0.2s ease !important; -} - -.module .addlink:before, -.module a.addlink:before { - content: "+" !important; - display: inline-block !important; - width: 18px !important; - height: 18px !important; - line-height: 18px !important; - text-align: center !important; - border-radius: 3px !important; - background: var(--igny8-primary) !important; - color: white !important; - margin-right: 6px !important; - font-size: 14px !important; - font-weight: bold !important; -} - -.module .addlink:hover, -.module a.addlink:hover { - background: rgba(6, 147, 227, 0.1) !important; - color: var(--igny8-primary-dark) !important; -} - -.module .addlink:hover:before, -.module a.addlink:hover:before { - background: var(--igny8-primary-dark) !important; -} diff --git a/backend/igny8_core/templates/admin/base_site.html b/backend/igny8_core/templates/admin/base_site.html index c46fa9ef..498439ce 100644 --- a/backend/igny8_core/templates/admin/base_site.html +++ b/backend/igny8_core/templates/admin/base_site.html @@ -1,70 +1,11 @@ {% extends "admin/base.html" %} -{% load static %} {% block title %}{{ title }} | IGNY8 Admin{% endblock %} -{% block extrahead %} -{{ block.super }} - - -{% endblock %} - {% block branding %}

- IGNY8 Administration + 🚀 IGNY8 Administration

{% endblock %} - -{% block userlinks %} - - - Dashboard - -{{ block.super }} -{% endblock %} - -{% block extrastyle %} - {{ block.super }} - - -{% endblock %} - -{% block nav-global %}{% endblock %} diff --git a/backend/igny8_core/templates/admin/bulk_action_form.html b/backend/igny8_core/templates/admin/bulk_action_form.html deleted file mode 100644 index 67f6d35c..00000000 --- a/backend/igny8_core/templates/admin/bulk_action_form.html +++ /dev/null @@ -1,75 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load static %} - -{% block content %} -

{{ title }}

- -
- {% csrf_token %} - -
- {{ form.as_p }} -
- -
- - - - Cancel -
- -
-

Selected Items ({{ queryset.count }})

- -
-
- - -{% endblock %} diff --git a/backend/igny8_core/templates/admin/dashboard.html b/backend/igny8_core/templates/admin/dashboard.html deleted file mode 100644 index 08a7b127..00000000 --- a/backend/igny8_core/templates/admin/dashboard.html +++ /dev/null @@ -1,419 +0,0 @@ -{% extends "admin/base_site.html" %} -{% load static %} - -{% block title %}IGNY8 Dashboard{% endblock %} - -{% block extrahead %} -{{ block.super }} - -{% endblock %} - -{% block content %} -
-
-
-

🚀 IGNY8 Admin Dashboard

-

Real-time operational metrics and system health monitoring

-
- -
- - {% if alerts %} -
-

📢 Active Alerts

- {% for alert in alerts %} -
-
- {{ alert.icon }} - {{ alert.message }} -
- {{ alert.action }} -
- {% endfor %} -
- {% else %} -
-
-
-

All Systems Operational

-

No active alerts or issues detected

-
-
- {% endif %} - -
- -
-

👥 Accounts

-
- Total Accounts - {{ accounts.total }} -
-
- Active Accounts - {{ accounts.active }} -
-
- Low Credit Accounts - {{ accounts.low_credit }} -
-
- - -
-

📚 Content

-
- Created This Week - {{ content.this_week }} -
-
- Created This Month - {{ content.this_month }} -
-
- Pending Tasks - {{ content.tasks_pending }} -
-
- In Progress - {{ content.tasks_in_progress }} -
-
- - -
-

💰 Billing

-
- Pending Payments - {{ billing.pending_payments }} -
-
- Revenue This Month - ${{ billing.payments_this_month|floatformat:2 }} -
-
- Credits Used This Month - {{ billing.credit_usage_this_month }} -
-
- - -
-

🤖 Automation & Sync

-
- Automations Running - {{ automation.running }} -
-
- Failed This Week - {{ automation.failed_this_week }} -
-
- Failed Syncs Today - {{ integration.sync_failed_today }} -
-
- - -
-

⚙️ Celery Tasks

-
- Failed Today - {{ celery.failed_today }} -
-
- Pending Tasks - {{ celery.pending }} -
-
-
- -
-

⚡ Quick Actions

- -
-
-{% endblock %} diff --git a/backend/igny8_core/templates/admin/igny8_core_auth/industry/change_list.html b/backend/igny8_core/templates/admin/igny8_core_auth/industry/change_list.html deleted file mode 100644 index 8a819684..00000000 --- a/backend/igny8_core/templates/admin/igny8_core_auth/industry/change_list.html +++ /dev/null @@ -1,72 +0,0 @@ -{% extends "admin/change_list.html" %} -{% load i18n admin_urls static %} - -{% block object-tools-items %} -
  • - - Import from CSV - -
  • - {{ block.super }} -{% endblock %} - -{% block content %} - - - - - {{ block.super }} -{% endblock %} diff --git a/backend/igny8_core/templates/admin/igny8_core_auth/industrysector/change_list.html b/backend/igny8_core/templates/admin/igny8_core_auth/industrysector/change_list.html deleted file mode 100644 index dee937f6..00000000 --- a/backend/igny8_core/templates/admin/igny8_core_auth/industrysector/change_list.html +++ /dev/null @@ -1,72 +0,0 @@ -{% extends "admin/change_list.html" %} -{% load i18n admin_urls static %} - -{% block object-tools-items %} -
  • - - Import from CSV - -
  • - {{ block.super }} -{% endblock %} - -{% block content %} - - - - - {{ block.super }} -{% endblock %} diff --git a/backend/igny8_core/templates/admin/igny8_core_auth/seedkeyword/change_list.html b/backend/igny8_core/templates/admin/igny8_core_auth/seedkeyword/change_list.html deleted file mode 100644 index f0fd10c0..00000000 --- a/backend/igny8_core/templates/admin/igny8_core_auth/seedkeyword/change_list.html +++ /dev/null @@ -1,73 +0,0 @@ -{% extends "admin/change_list.html" %} -{% load i18n admin_urls static %} - -{% block object-tools-items %} -
  • - - Import from CSV - -
  • - {{ block.super }} -{% endblock %} - -{% block content %} - - - - - {{ block.super }} -{% endblock %}