Section 2 COmpleted
This commit is contained in:
@@ -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']),
|
||||
|
||||
@@ -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'),
|
||||
]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user