reaminig 5-t-9

This commit is contained in:
alorig
2025-11-18 06:36:56 +05:00
parent 9facd12082
commit 68a98208b1
31 changed files with 5210 additions and 153 deletions

View File

@@ -3,13 +3,13 @@ Page Generation Service
Leverages the Writer ContentGenerationService to draft page copy for Site Builder blueprints.
"""
import logging
from typing import Optional
from typing import Optional, List
from django.db import transaction
from igny8_core.business.content.models import Tasks
from igny8_core.business.content.services.content_generation_service import ContentGenerationService
from igny8_core.business.site_building.models import PageBlueprint
from igny8_core.business.site_building.models import PageBlueprint, SiteBlueprint
logger = logging.getLogger(__name__)
@@ -53,6 +53,116 @@ class PageGenerationService:
"""Force regeneration by dropping the cached task metadata."""
return self.generate_page_content(page_blueprint, force_regenerate=True)
def bulk_generate_pages(
self,
site_blueprint: SiteBlueprint,
page_ids: Optional[List[int]] = None,
force_regenerate: bool = False
) -> dict:
"""
Generate content for multiple pages in a blueprint.
Similar to how ideas are queued to writer:
1. Get pages (filtered by page_ids if provided)
2. Create/update Writer Tasks for each page
3. Queue content generation for all tasks
4. Return task IDs for progress tracking
Args:
site_blueprint: SiteBlueprint instance
page_ids: Optional list of specific page IDs to generate, or all if None
force_regenerate: If True, resets any temporary task data
Returns:
dict: {
'success': bool,
'pages_queued': int,
'task_ids': List[int],
'celery_task_id': Optional[str]
}
"""
if not site_blueprint:
raise ValueError("Site blueprint is required")
pages = site_blueprint.pages.all()
if page_ids:
pages = pages.filter(id__in=page_ids)
if not pages.exists():
return {
'success': False,
'error': 'No pages found to generate',
'pages_queued': 0,
'task_ids': [],
}
task_ids = []
with transaction.atomic():
for page in pages:
task = self._ensure_task(page, force_regenerate=force_regenerate)
task_ids.append(task.id)
page.status = 'generating'
page.save(update_fields=['status', 'updated_at'])
account = site_blueprint.account
logger.info(
"[PageGenerationService] Bulk generating content for %d pages (blueprint %s)",
len(task_ids),
site_blueprint.id,
)
result = self.content_service.generate_content(task_ids, account)
return {
'success': True,
'pages_queued': len(task_ids),
'task_ids': task_ids,
'celery_task_id': result.get('task_id'),
}
def create_tasks_for_pages(
self,
site_blueprint: SiteBlueprint,
page_ids: Optional[List[int]] = None,
force_regenerate: bool = False
) -> List[Tasks]:
"""
Create Writer Tasks for blueprint pages without generating content.
Useful for:
- Previewing what tasks will be created
- Manual task management
- Integration with existing Writer UI
Args:
site_blueprint: SiteBlueprint instance
page_ids: Optional list of specific page IDs, or all if None
force_regenerate: If True, resets any temporary task data
Returns:
List[Tasks]: List of created or existing tasks
"""
if not site_blueprint:
raise ValueError("Site blueprint is required")
pages = site_blueprint.pages.all()
if page_ids:
pages = pages.filter(id__in=page_ids)
tasks = []
with transaction.atomic():
for page in pages:
task = self._ensure_task(page, force_regenerate=force_regenerate)
tasks.append(task)
logger.info(
"[PageGenerationService] Created %d tasks for pages (blueprint %s)",
len(tasks),
site_blueprint.id,
)
return tasks
# Internal helpers --------------------------------------------------------
def _ensure_task(self, page_blueprint: PageBlueprint, force_regenerate: bool = False) -> Tasks:

View File

@@ -72,6 +72,63 @@ class SiteBlueprintViewSet(SiteSectorModelViewSet):
)
return Response(result, status=status.HTTP_202_ACCEPTED if 'task_id' in result else status.HTTP_200_OK)
@action(detail=True, methods=['post'])
def generate_all_pages(self, request, pk=None):
"""
Generate content for all pages in blueprint.
Request body:
{
"page_ids": [1, 2, 3], # Optional: specific pages, or all if omitted
"force": false # Optional: force regenerate existing content
}
"""
blueprint = self.get_object()
page_ids = request.data.get('page_ids')
force = request.data.get('force', False)
service = PageGenerationService()
try:
result = service.bulk_generate_pages(
blueprint,
page_ids=page_ids,
force_regenerate=force
)
response_status = status.HTTP_202_ACCEPTED if result.get('success') else status.HTTP_400_BAD_REQUEST
return success_response(result, request=request, status_code=response_status)
except Exception as e:
return error_response(str(e), status.HTTP_400_BAD_REQUEST, request)
@action(detail=True, methods=['post'])
def create_tasks(self, request, pk=None):
"""
Create Writer tasks for pages without generating content.
Request body:
{
"page_ids": [1, 2, 3] # Optional: specific pages, or all if omitted
}
Useful for:
- Previewing what tasks will be created
- Manual task management
- Integration with existing Writer UI
"""
blueprint = self.get_object()
page_ids = request.data.get('page_ids')
service = PageGenerationService()
try:
tasks = service.create_tasks_for_pages(blueprint, page_ids=page_ids)
# Serialize tasks
from igny8_core.business.content.serializers import TasksSerializer
serializer = TasksSerializer(tasks, many=True)
return success_response({'tasks': serializer.data, 'count': len(tasks)}, request=request)
except Exception as e:
return error_response(str(e), status.HTTP_400_BAD_REQUEST, request)
class PageBlueprintViewSet(SiteSectorModelViewSet):
"""