Section 2 COmpleted

This commit is contained in:
IGNY8 VPS (Salman)
2025-12-27 02:20:55 +00:00
parent 890e138829
commit add04e2ad5
9 changed files with 527 additions and 574 deletions

View File

@@ -132,6 +132,124 @@ class AccountSettingsViewSet(AccountModelViewSet):
serializer.save(account=account)
@extend_schema_view(
retrieve=extend_schema(tags=['Content Settings']),
update=extend_schema(tags=['Content Settings']),
)
class ContentSettingsViewSet(viewsets.ViewSet):
"""
ViewSet for managing Content Generation and Publishing settings.
Uses AccountSettings model with specific keys:
- 'content_generation': append_to_prompt, default_tone, default_length
- 'publishing': auto_publish_enabled, auto_sync_enabled
"""
permission_classes = [IsAuthenticatedAndActive, HasTenantAccess]
authentication_classes = [JWTAuthentication]
throttle_scope = 'system'
throttle_classes = [DebugScopedRateThrottle]
def _get_account(self, request):
"""Get account from request"""
account = getattr(request, 'account', None)
if not account:
user = getattr(request, 'user', None)
if user:
account = getattr(user, 'account', None)
return account
def retrieve(self, request, pk=None):
"""Get content settings by key (content_generation or publishing)"""
account = self._get_account(request)
if not account:
return error_response(
error='Account is required',
status_code=status.HTTP_400_BAD_REQUEST,
request=request
)
# Validate key
if pk not in ['content_generation', 'publishing']:
return error_response(
error='Invalid settings key. Use "content_generation" or "publishing".',
status_code=status.HTTP_400_BAD_REQUEST,
request=request
)
try:
setting = AccountSettings.objects.get(account=account, key=pk)
return success_response(data={
'key': setting.key,
'config': setting.config,
'is_active': setting.is_active,
}, request=request)
except AccountSettings.DoesNotExist:
# Return default settings if not yet saved
if pk == 'content_generation':
default_config = {
'append_to_prompt': '',
'default_tone': 'professional',
'default_length': 'medium',
}
else: # publishing
default_config = {
'auto_publish_enabled': False,
'auto_sync_enabled': False,
}
return success_response(data={
'key': pk,
'config': default_config,
'is_active': True,
}, request=request)
def update(self, request, pk=None):
"""Update content settings by key"""
account = self._get_account(request)
if not account:
return error_response(
error='Account is required',
status_code=status.HTTP_400_BAD_REQUEST,
request=request
)
# Validate key
if pk not in ['content_generation', 'publishing']:
return error_response(
error='Invalid settings key. Use "content_generation" or "publishing".',
status_code=status.HTTP_400_BAD_REQUEST,
request=request
)
config = request.data.get('config', request.data)
# Validate config fields
if pk == 'content_generation':
valid_fields = {'append_to_prompt', 'default_tone', 'default_length'}
else: # publishing
valid_fields = {'auto_publish_enabled', 'auto_sync_enabled'}
# Filter to only valid fields
filtered_config = {k: v for k, v in config.items() if k in valid_fields}
# Get or create setting
setting, created = AccountSettings.objects.update_or_create(
account=account,
key=pk,
defaults={'config': filtered_config, 'is_active': True}
)
return success_response(data={
'key': setting.key,
'config': setting.config,
'is_active': setting.is_active,
'message': 'Settings saved successfully',
}, request=request)
@action(detail=True, methods=['post'], url_path='save', url_name='save')
def save_settings(self, request, pk=None):
"""Save content settings (POST endpoint for frontend compatibility)"""
return self.update(request, pk)
@extend_schema_view(
list=extend_schema(tags=['System']),
create=extend_schema(tags=['System']),

View File

@@ -7,7 +7,8 @@ from .views import AIPromptViewSet, AuthorProfileViewSet, StrategyViewSet, syste
from .integration_views import IntegrationSettingsViewSet
from .settings_views import (
SystemSettingsViewSet, AccountSettingsViewSet, UserSettingsViewSet,
ModuleSettingsViewSet, ModuleEnableSettingsViewSet, AISettingsViewSet
ModuleSettingsViewSet, ModuleEnableSettingsViewSet, AISettingsViewSet,
ContentSettingsViewSet
)
router = DefaultRouter()
router.register(r'prompts', AIPromptViewSet, basename='prompts')
@@ -57,6 +58,15 @@ module_enable_viewset = ModuleEnableSettingsViewSet.as_view({
'get': 'list',
})
# Content settings viewsets for Content Generation and Publishing settings
content_settings_detail_viewset = ContentSettingsViewSet.as_view({
'get': 'retrieve',
})
content_settings_save_viewset = ContentSettingsViewSet.as_view({
'post': 'save_settings',
'put': 'update',
})
urlpatterns = [
# Module enable settings endpoint - MUST come before router.urls to avoid conflict
# When /settings/modules/enable/ is called, it would match ModuleSettingsViewSet with pk='enable'
@@ -85,5 +95,10 @@ urlpatterns = [
path('settings/integrations/<str:pk>/save/', integration_save_viewset, name='integration-settings-save'),
# GET: Retrieve settings - Base path comes last
path('settings/integrations/<str:pk>/', integration_detail_viewset, name='integration-settings-detail'),
# Content settings routes for Content Generation and Publishing
# POST/PUT: Save content settings - must come before GET
path('settings/content/<str:pk>/save/', content_settings_save_viewset, name='content-settings-save'),
# GET: Retrieve content settings
path('settings/content/<str:pk>/', content_settings_detail_viewset, name='content-settings-detail'),
]