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 ( - - {hasPrompts ? ( - - - - - Ready - - ) : ( - 'No Prompts' - )} - - ); - }, - }, - { - key: 'images_status', - label: 'Images', - sortable: false, - width: '110px', - render: (_value: any, row: Content) => { - const hasImages = row.has_generated_images; - return ( - - {hasImages ? ( - - - - - Generated - - ) : ( - 'No Images' - )} - +
+ {/* Prompts Icon */} +
+ + + +
+ + {/* Images Icon */} +
+ + + + + +
+
); }, },