django admin Groups reorg, Frontend udpates for site settings, #Migration runs
This commit is contained in:
@@ -32,7 +32,7 @@ class AIPromptResource(resources.ModelResource):
|
||||
# Import settings admin
|
||||
from .settings_admin import (
|
||||
SystemSettingsAdmin, AccountSettingsAdmin, UserSettingsAdmin,
|
||||
ModuleSettingsAdmin, AISettingsAdmin
|
||||
ModuleSettingsAdmin
|
||||
)
|
||||
|
||||
try:
|
||||
@@ -587,3 +587,112 @@ class GlobalModuleSettingsAdmin(Igny8ModelAdmin):
|
||||
'updated_at',
|
||||
]
|
||||
|
||||
|
||||
# IntegrationProvider Admin (centralized API keys)
|
||||
from .models import IntegrationProvider
|
||||
|
||||
|
||||
@admin.register(IntegrationProvider)
|
||||
class IntegrationProviderAdmin(Igny8ModelAdmin):
|
||||
"""
|
||||
Admin for IntegrationProvider - Centralized API key management.
|
||||
Per final-model-schemas.md
|
||||
"""
|
||||
|
||||
list_display = [
|
||||
'provider_id',
|
||||
'display_name',
|
||||
'provider_type',
|
||||
'is_active',
|
||||
'is_sandbox',
|
||||
'has_api_key',
|
||||
'updated_at',
|
||||
]
|
||||
list_filter = ['provider_type', 'is_active', 'is_sandbox']
|
||||
search_fields = ['provider_id', 'display_name']
|
||||
readonly_fields = ['created_at', 'updated_at']
|
||||
|
||||
fieldsets = (
|
||||
('Provider Info', {
|
||||
'fields': ('provider_id', 'display_name', 'provider_type')
|
||||
}),
|
||||
('API Configuration', {
|
||||
'fields': ('api_key', 'api_secret', 'webhook_secret', 'api_endpoint'),
|
||||
'description': 'Enter API keys and endpoints. These are platform-wide.'
|
||||
}),
|
||||
('Extra Config', {
|
||||
'fields': ('config',),
|
||||
'classes': ('collapse',),
|
||||
'description': 'JSON config for provider-specific settings'
|
||||
}),
|
||||
('Status', {
|
||||
'fields': ('is_active', 'is_sandbox')
|
||||
}),
|
||||
('Metadata', {
|
||||
'fields': ('updated_by', 'created_at', 'updated_at'),
|
||||
'classes': ('collapse',)
|
||||
}),
|
||||
)
|
||||
|
||||
def has_api_key(self, obj):
|
||||
"""Show if API key is configured"""
|
||||
return bool(obj.api_key)
|
||||
has_api_key.boolean = True
|
||||
has_api_key.short_description = 'API Key Set'
|
||||
|
||||
def save_model(self, request, obj, form, change):
|
||||
"""Set updated_by to current user"""
|
||||
obj.updated_by = request.user
|
||||
super().save_model(request, obj, form, change)
|
||||
|
||||
|
||||
# SystemAISettings Admin (new simplified AI settings)
|
||||
from .ai_settings import SystemAISettings
|
||||
|
||||
|
||||
@admin.register(SystemAISettings)
|
||||
class SystemAISettingsAdmin(Igny8ModelAdmin):
|
||||
"""
|
||||
Admin for SystemAISettings - System-wide AI defaults (Singleton).
|
||||
Per final-model-schemas.md
|
||||
"""
|
||||
|
||||
list_display = [
|
||||
'id',
|
||||
'temperature',
|
||||
'max_tokens',
|
||||
'image_style',
|
||||
'image_quality',
|
||||
'max_images_per_article',
|
||||
'updated_at',
|
||||
]
|
||||
readonly_fields = ['updated_at']
|
||||
|
||||
fieldsets = (
|
||||
('AI Parameters', {
|
||||
'fields': ('temperature', 'max_tokens'),
|
||||
'description': 'System-wide defaults for AI text generation. Accounts can override via AccountSettings.'
|
||||
}),
|
||||
('Image Generation', {
|
||||
'fields': ('image_style', 'image_quality', 'max_images_per_article', 'image_size'),
|
||||
'description': 'System-wide defaults for image generation. Accounts can override via AccountSettings.'
|
||||
}),
|
||||
('Metadata', {
|
||||
'fields': ('updated_by', 'updated_at'),
|
||||
'classes': ('collapse',)
|
||||
}),
|
||||
)
|
||||
|
||||
def has_add_permission(self, request):
|
||||
"""Only allow one instance (singleton)"""
|
||||
return not SystemAISettings.objects.exists()
|
||||
|
||||
def has_delete_permission(self, request, obj=None):
|
||||
"""Prevent deletion of singleton"""
|
||||
return False
|
||||
|
||||
def save_model(self, request, obj, form, change):
|
||||
"""Set updated_by to current user"""
|
||||
obj.updated_by = request.user
|
||||
super().save_model(request, obj, form, change)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user