stage 2-1

This commit is contained in:
alorig
2025-11-19 21:07:08 +05:00
parent 4ca85ae0e5
commit 72e1f25bc7
5 changed files with 269 additions and 13 deletions

View File

@@ -10,6 +10,7 @@ from igny8_core.business.site_building.models import (
SiteBlueprint,
WorkflowState,
)
from igny8_core.business.site_building.services.workflow_state_service import WorkflowStateService
class PageBlueprintSerializer(serializers.ModelSerializer):
@@ -47,6 +48,7 @@ class SiteBlueprintSerializer(serializers.ModelSerializer):
site_id = serializers.IntegerField(write_only=True, required=False)
sector_id = serializers.IntegerField(write_only=True, required=False)
workflow_state = serializers.SerializerMethodField()
gating_messages = serializers.SerializerMethodField()
class Meta:
model = SiteBlueprint
@@ -66,6 +68,7 @@ class SiteBlueprintSerializer(serializers.ModelSerializer):
'updated_at',
'pages',
'workflow_state',
'gating_messages',
]
read_only_fields = [
'structure_json',
@@ -88,19 +91,32 @@ class SiteBlueprintSerializer(serializers.ModelSerializer):
return attrs
def get_workflow_state(self, obj):
return self._get_workflow_payload(obj)
def get_gating_messages(self, obj):
workflow_payload = self._get_workflow_payload(obj)
if not workflow_payload:
return None
blocked = [step for step in workflow_payload.get('steps', []) if step.get('status') == 'blocked']
return blocked or None
def _get_workflow_payload(self, obj):
if not getattr(settings, 'USE_SITE_BUILDER_REFACTOR', False):
return None
cache = self.context.setdefault('_workflow_state_cache', {})
if obj.id in cache:
return cache[obj.id]
try:
state: WorkflowState = obj.workflow_state
except WorkflowState.DoesNotExist:
return None
return {
'current_step': state.current_step,
'step_status': state.step_status,
'blocking_reason': state.blocking_reason,
'completed': state.completed,
'updated_at': state.updated_at,
}
state = None
service = getattr(self, '_workflow_service', None)
if service is None:
service = WorkflowStateService()
self._workflow_service = service
payload = service.serialize_state(state)
cache[obj.id] = payload
return payload
class MetadataOptionSerializer(serializers.Serializer):

View File

@@ -24,6 +24,7 @@ from igny8_core.business.site_building.services import (
StructureGenerationService,
WorkflowStateService,
TaxonomyService,
WizardContextService,
)
from igny8_core.modules.site_builder.serializers import (
PageBlueprintSerializer,
@@ -47,6 +48,7 @@ class SiteBlueprintViewSet(SiteSectorModelViewSet):
super().__init__(*args, **kwargs)
self.workflow_service = WorkflowStateService()
self.taxonomy_service = TaxonomyService()
self.wizard_context_service = WizardContextService()
def get_permissions(self):
"""
@@ -213,6 +215,19 @@ class SiteBlueprintViewSet(SiteSectorModelViewSet):
return response
except Exception as e:
return error_response(str(e), status.HTTP_400_BAD_REQUEST, request)
@action(detail=True, methods=['get'], url_path='workflow/context')
def workflow_context(self, request, pk=None):
"""Return aggregated wizard context (steps, clusters, taxonomies, coverage)."""
blueprint = self.get_object()
if not self.workflow_service.enabled:
return success_response(
data={'workflow': None, 'clusters': {}, 'taxonomies': {}, 'coverage': {}},
request=request,
)
payload = self.wizard_context_service.build_context(blueprint)
return success_response(payload, request=request)
@action(detail=False, methods=['POST'], url_path='bulk_delete', url_name='bulk_delete')
def bulk_delete(self, request):