bulk actions & some next audits docs

This commit is contained in:
IGNY8 VPS (Salman)
2025-12-20 02:46:00 +00:00
parent c17b22e927
commit ab0d6469d4
16 changed files with 2987 additions and 305 deletions

View File

@@ -6,6 +6,21 @@ from unfold.admin import ModelAdmin
from igny8_core.admin.base import AccountAdminMixin, Igny8ModelAdmin
from .models import AIPrompt, IntegrationSettings, AuthorProfile, Strategy
from django.contrib import messages
from import_export.admin import ExportMixin, ImportExportMixin
from import_export import resources
class AIPromptResource(resources.ModelResource):
"""Resource class for importing/exporting AI Prompts"""
class Meta:
model = AIPrompt
fields = ('id', 'account__name', 'prompt_type', 'prompt_value', 'is_active', 'created_at')
export_order = fields
import_id_fields = ('id',)
skip_unchanged = True
# Import settings admin
from .settings_admin import (
SystemSettingsAdmin, AccountSettingsAdmin, UserSettingsAdmin,
@@ -35,11 +50,17 @@ except ImportError:
@admin.register(AIPrompt)
class AIPromptAdmin(AccountAdminMixin, Igny8ModelAdmin):
class AIPromptAdmin(ImportExportMixin, AccountAdminMixin, Igny8ModelAdmin):
resource_class = AIPromptResource
list_display = ['id', 'prompt_type', 'account', 'is_active', 'updated_at']
list_filter = ['prompt_type', 'is_active', 'account']
search_fields = ['prompt_type']
readonly_fields = ['created_at', 'updated_at', 'default_prompt']
actions = [
'bulk_activate',
'bulk_deactivate',
'bulk_reset_to_default',
]
fieldsets = (
('Basic Info', {
@@ -61,14 +82,48 @@ class AIPromptAdmin(AccountAdminMixin, Igny8ModelAdmin):
except:
return '-'
get_account_display.short_description = 'Account'
def bulk_activate(self, request, queryset):
updated = queryset.update(is_active=True)
self.message_user(request, f'{updated} AI prompt(s) activated.', messages.SUCCESS)
bulk_activate.short_description = 'Activate selected prompts'
def bulk_deactivate(self, request, queryset):
updated = queryset.update(is_active=False)
self.message_user(request, f'{updated} AI prompt(s) deactivated.', messages.SUCCESS)
bulk_deactivate.short_description = 'Deactivate selected prompts'
def bulk_reset_to_default(self, request, queryset):
count = 0
for prompt in queryset:
if prompt.default_prompt:
prompt.prompt_value = prompt.default_prompt
prompt.save()
count += 1
self.message_user(request, f'{count} AI prompt(s) reset to default values.', messages.SUCCESS)
bulk_reset_to_default.short_description = 'Reset to default values'
class IntegrationSettingsResource(resources.ModelResource):
"""Resource class for exporting Integration Settings (config masked)"""
class Meta:
model = IntegrationSettings
fields = ('id', 'account__name', 'integration_type', 'is_active', 'created_at')
export_order = fields
@admin.register(IntegrationSettings)
class IntegrationSettingsAdmin(AccountAdminMixin, Igny8ModelAdmin):
class IntegrationSettingsAdmin(ExportMixin, AccountAdminMixin, Igny8ModelAdmin):
resource_class = IntegrationSettingsResource
list_display = ['id', 'integration_type', 'account', 'is_active', 'updated_at']
list_filter = ['integration_type', 'is_active', 'account']
search_fields = ['integration_type']
readonly_fields = ['created_at', 'updated_at']
actions = [
'bulk_activate',
'bulk_deactivate',
'bulk_test_connection',
]
fieldsets = (
('Basic Info', {
@@ -97,14 +152,50 @@ class IntegrationSettingsAdmin(AccountAdminMixin, Igny8ModelAdmin):
except:
return '-'
get_account_display.short_description = 'Account'
def bulk_activate(self, request, queryset):
updated = queryset.update(is_active=True)
self.message_user(request, f'{updated} integration setting(s) activated.', messages.SUCCESS)
bulk_activate.short_description = 'Activate selected integrations'
def bulk_deactivate(self, request, queryset):
updated = queryset.update(is_active=False)
self.message_user(request, f'{updated} integration setting(s) deactivated.', messages.SUCCESS)
bulk_deactivate.short_description = 'Deactivate selected integrations'
def bulk_test_connection(self, request, queryset):
"""Test connection for selected integration settings"""
count = queryset.filter(is_active=True).count()
self.message_user(
request,
f'{count} integration(s) queued for connection test. (Test logic to be implemented)',
messages.INFO
)
bulk_test_connection.short_description = 'Test connections'
class AuthorProfileResource(resources.ModelResource):
"""Resource class for importing/exporting Author Profiles"""
class Meta:
model = AuthorProfile
fields = ('id', 'name', 'account__name', 'tone', 'language', 'is_active', 'created_at')
export_order = fields
import_id_fields = ('id',)
skip_unchanged = True
@admin.register(AuthorProfile)
class AuthorProfileAdmin(AccountAdminMixin, Igny8ModelAdmin):
class AuthorProfileAdmin(ImportExportMixin, AccountAdminMixin, Igny8ModelAdmin):
resource_class = AuthorProfileResource
list_display = ['name', 'account', 'tone', 'language', 'is_active', 'created_at']
list_filter = ['is_active', 'tone', 'language', 'account']
search_fields = ['name', 'description', 'tone']
readonly_fields = ['created_at', 'updated_at']
actions = [
'bulk_activate',
'bulk_deactivate',
'bulk_clone',
]
fieldsets = (
('Basic Info', {
@@ -126,14 +217,52 @@ class AuthorProfileAdmin(AccountAdminMixin, Igny8ModelAdmin):
except:
return '-'
get_account_display.short_description = 'Account'
def bulk_activate(self, request, queryset):
updated = queryset.update(is_active=True)
self.message_user(request, f'{updated} author profile(s) activated.', messages.SUCCESS)
bulk_activate.short_description = 'Activate selected profiles'
def bulk_deactivate(self, request, queryset):
updated = queryset.update(is_active=False)
self.message_user(request, f'{updated} author profile(s) deactivated.', messages.SUCCESS)
bulk_deactivate.short_description = 'Deactivate selected profiles'
def bulk_clone(self, request, queryset):
count = 0
for profile in queryset:
profile_copy = AuthorProfile.objects.get(pk=profile.pk)
profile_copy.pk = None
profile_copy.name = f"{profile.name} (Copy)"
profile_copy.is_active = False
profile_copy.save()
count += 1
self.message_user(request, f'{count} author profile(s) cloned.', messages.SUCCESS)
bulk_clone.short_description = 'Clone selected profiles'
class StrategyResource(resources.ModelResource):
"""Resource class for importing/exporting Strategies"""
class Meta:
model = Strategy
fields = ('id', 'name', 'account__name', 'sector__name', 'is_active', 'created_at')
export_order = fields
import_id_fields = ('id',)
skip_unchanged = True
@admin.register(Strategy)
class StrategyAdmin(AccountAdminMixin, Igny8ModelAdmin):
class StrategyAdmin(ImportExportMixin, AccountAdminMixin, Igny8ModelAdmin):
resource_class = StrategyResource
list_display = ['name', 'account', 'sector', 'is_active', 'created_at']
list_filter = ['is_active', 'account']
search_fields = ['name', 'description']
readonly_fields = ['created_at', 'updated_at']
actions = [
'bulk_activate',
'bulk_deactivate',
'bulk_clone',
]
fieldsets = (
('Basic Info', {
@@ -162,4 +291,25 @@ class StrategyAdmin(AccountAdminMixin, Igny8ModelAdmin):
return obj.sector.name if obj.sector else 'Global'
except:
return 'Global'
get_sector_display.short_description = 'Sector'
get_sector_display.short_description = 'Sector'
def bulk_activate(self, request, queryset):
updated = queryset.update(is_active=True)
self.message_user(request, f'{updated} strategy/strategies activated.', messages.SUCCESS)
bulk_activate.short_description = 'Activate selected strategies'
def bulk_deactivate(self, request, queryset):
updated = queryset.update(is_active=False)
self.message_user(request, f'{updated} strategy/strategies deactivated.', messages.SUCCESS)
bulk_deactivate.short_description = 'Deactivate selected strategies'
def bulk_clone(self, request, queryset):
count = 0
for strategy in queryset:
strategy_copy = Strategy.objects.get(pk=strategy.pk)
strategy_copy.pk = None
strategy_copy.name = f"{strategy.name} (Copy)"
strategy_copy.is_active = False
strategy_copy.save()
count += 1
self.message_user(request, f'{count} strategy/strategies cloned.', messages.SUCCESS)
bulk_clone.short_description = 'Clone selected strategies'