reaminig 5-t-9
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user