feat: Add Global Module Settings and Caption to Images

- Introduced GlobalModuleSettings model for platform-wide module enable/disable settings.
- Added 'caption' field to Images model to store image captions.
- Updated GenerateImagePromptsFunction to handle new caption structure in prompts.
- Enhanced AIPromptViewSet to return global prompt types and validate active prompts.
- Modified serializers and views to accommodate new caption field and global settings.
- Updated frontend components to display captions and filter prompts based on active types.
- Created migrations for GlobalModuleSettings and added caption field to Images.
This commit is contained in:
IGNY8 VPS (Salman)
2025-12-20 21:34:59 +00:00
parent 9e8ff4fbb1
commit 7a1e952a57
16 changed files with 370 additions and 383 deletions

View File

@@ -48,22 +48,50 @@ class AIPromptViewSet(AccountModelViewSet):
"""Get prompts for the current account"""
return super().get_queryset().order_by('prompt_type')
@action(detail=False, methods=['get'], url_path='active_types', url_name='active_types')
def get_active_types(self, request):
"""Get list of globally active prompt types"""
from .global_settings_models import GlobalAIPrompt
active_prompts = GlobalAIPrompt.objects.filter(is_active=True).values_list('prompt_type', flat=True)
return success_response(
data={'active_types': list(active_prompts)},
request=request
)
@action(detail=False, methods=['get'], url_path='by_type/(?P<prompt_type>[^/.]+)', url_name='by_type')
def get_by_type(self, request, prompt_type=None):
"""Get prompt by type"""
"""Get prompt by type - only if globally active"""
from .global_settings_models import GlobalAIPrompt
# Check if this prompt type is globally active
try:
global_prompt = GlobalAIPrompt.objects.get(prompt_type=prompt_type)
if not global_prompt.is_active:
return error_response(
error=f'Prompt type "{prompt_type}" is not globally active',
status_code=http_status.HTTP_404_NOT_FOUND,
request=request
)
except GlobalAIPrompt.DoesNotExist:
return error_response(
error=f'Prompt type "{prompt_type}" not found in global settings',
status_code=http_status.HTTP_404_NOT_FOUND,
request=request
)
# Get account-specific prompt or return default
try:
prompt = self.get_queryset().get(prompt_type=prompt_type)
serializer = self.get_serializer(prompt)
return success_response(data=serializer.data, request=request)
except AIPrompt.DoesNotExist:
# Return default if not found
from .utils import get_default_prompt
default_value = get_default_prompt(prompt_type)
# Return default from GlobalAIPrompt
return success_response(
data={
'prompt_type': prompt_type,
'prompt_value': default_value,
'default_prompt': default_value,
'prompt_value': global_prompt.prompt_value,
'default_prompt': global_prompt.prompt_value,
'is_active': True,
},
request=request
@@ -120,10 +148,13 @@ class AIPromptViewSet(AccountModelViewSet):
request=request
)
# Get default prompt value if creating new
# Get default prompt value from GlobalAIPrompt
from .utils import get_default_prompt
default_value = get_default_prompt(prompt_type)
# Check if the prompt is customized (different from global default)
is_customized = (prompt_value != default_value)
# Get or create prompt
prompt, created = AIPrompt.objects.get_or_create(
prompt_type=prompt_type,
@@ -131,12 +162,15 @@ class AIPromptViewSet(AccountModelViewSet):
defaults={
'prompt_value': prompt_value,
'default_prompt': default_value,
'is_customized': is_customized,
'is_active': True,
}
)
if not created:
prompt.prompt_value = prompt_value
prompt.default_prompt = default_value
prompt.is_customized = is_customized
prompt.save()
serializer = self.get_serializer(prompt)
@@ -190,7 +224,7 @@ class AIPromptViewSet(AccountModelViewSet):
request=request
)
# Get default prompt
# Get default prompt from GlobalAIPrompt
from .utils import get_default_prompt
default_value = get_default_prompt(prompt_type)
@@ -201,12 +235,15 @@ class AIPromptViewSet(AccountModelViewSet):
defaults={
'prompt_value': default_value,
'default_prompt': default_value,
'is_customized': False,
'is_active': True,
}
)
if not created:
prompt.prompt_value = default_value
prompt.default_prompt = default_value
prompt.is_customized = False
prompt.save()
serializer = self.get_serializer(prompt)