From bcdbbfe2338304b48a8de709c64253afba6b770f Mon Sep 17 00:00:00 2001
From: alorig <220087330+alorig@users.noreply.github.com>
Date: Fri, 28 Nov 2025 15:46:38 +0500
Subject: [PATCH] 23
---
backend/igny8_core/modules/planner/views.py | 68 +++++++++++----
frontend/src/config/pages/content.config.tsx | 91 +++++++++++---------
2 files changed, 104 insertions(+), 55 deletions(-)
diff --git a/backend/igny8_core/modules/planner/views.py b/backend/igny8_core/modules/planner/views.py
index 55d2db9d..9d2c5eb2 100644
--- a/backend/igny8_core/modules/planner/views.py
+++ b/backend/igny8_core/modules/planner/views.py
@@ -1005,13 +1005,29 @@ class ContentIdeasViewSet(SiteSectorModelViewSet):
)
queryset = self.get_queryset()
- ideas = queryset.filter(id__in=ids, status='new') # Only queue 'new' ideas
+ # Get ALL requested ideas first (don't filter by status yet)
+ all_ideas = queryset.filter(id__in=ids)
+
+ # Check which ones can be queued (status='new')
+ queueable_ideas = all_ideas.filter(status='new')
from igny8_core.modules.writer.models import Tasks
created_tasks = []
errors = []
- for idea in ideas:
+ skipped = []
+
+ # Add skipped ideas (not 'new' status)
+ for idea in all_ideas:
+ if idea.status != 'new':
+ skipped.append({
+ 'idea_id': idea.id,
+ 'title': idea.idea_title,
+ 'reason': f'Already {idea.status}'
+ })
+
+ # Process queueable ideas
+ for idea in queueable_ideas:
try:
# Direct copy - no mapping needed
task = Tasks.objects.create(
@@ -1037,23 +1053,43 @@ class ContentIdeasViewSet(SiteSectorModelViewSet):
idea.status = 'scheduled'
idea.save()
except Exception as e:
- errors.append({'idea_id': idea.id, 'error': str(e)})
+ errors.append({
+ 'idea_id': idea.id,
+ 'title': idea.idea_title,
+ 'error': str(e)
+ })
- if errors:
+ # Return appropriate response based on results
+ if len(created_tasks) == 0 and (errors or skipped):
+ # Complete failure
return error_response(
- error=f'Failed to create {len(errors)} tasks',
- errors=errors,
- status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
+ error=f'Failed to queue any ideas: {len(errors)} errors, {len(skipped)} skipped',
+ errors=errors if errors else skipped,
+ status_code=status.HTTP_400_BAD_REQUEST,
+ request=request
+ )
+ elif errors:
+ # Partial success - some created, some failed
+ return success_response(
+ data={
+ 'created_count': len(created_tasks),
+ 'task_ids': created_tasks,
+ 'errors': errors,
+ 'skipped': skipped,
+ },
+ message=f'Queued {len(created_tasks)} ideas ({len(errors)} failed, {len(skipped)} skipped)',
+ request=request
+ )
+ else:
+ # Complete success
+ return success_response(
+ data={
+ 'created_count': len(created_tasks),
+ 'task_ids': created_tasks,
+ 'skipped': skipped,
+ },
+ message=f'Successfully queued {len(created_tasks)} ideas to writer' + (f' ({len(skipped)} already scheduled)' if skipped else ''),
request=request
)
-
- return success_response(
- data={
- 'created_count': len(created_tasks),
- 'task_ids': created_tasks,
- },
- message=f'Successfully queued {len(created_tasks)} ideas to writer',
- request=request
- )
# REMOVED: generate_idea action - idea generation function removed
diff --git a/frontend/src/config/pages/content.config.tsx b/frontend/src/config/pages/content.config.tsx
index f4055a45..1354650b 100644
--- a/frontend/src/config/pages/content.config.tsx
+++ b/frontend/src/config/pages/content.config.tsx
@@ -208,48 +208,61 @@ export const createContentPageConfig = (
},
},
{
- key: 'prompts_status',
- label: 'Prompts',
+ key: 'content_status_indicators',
+ label: 'Status',
sortable: false,
- width: '110px',
+ width: '100px',
+ align: 'center' as const,
render: (_value: any, row: Content) => {
- const hasPrompts = row.has_image_prompts;
+ const hasPrompts = row.has_image_prompts || false;
+ const hasImages = row.has_generated_images || false;
+
return (
-