Implement Site Builder Metadata and Enhance Wizard Functionality
- Introduced new models for Site Builder options, including BusinessType, AudienceProfile, BrandPersonality, and HeroImageryDirection. - Added serializers and views to handle metadata for dropdowns in the Site Builder wizard. - Updated the SiteBuilderWizard component to load and display metadata, improving user experience with dynamic options. - Enhanced BusinessDetailsStep and StyleStep components to utilize new metadata for business types and brand personalities. - Refactored state management in builderStore to include metadata loading and error handling. - Updated API service to fetch Site Builder metadata, ensuring seamless integration with the frontend.
This commit is contained in:
@@ -1,6 +1,13 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from igny8_core.business.site_building.models import SiteBlueprint, PageBlueprint
|
||||
from igny8_core.business.site_building.models import (
|
||||
AudienceProfile,
|
||||
BrandPersonality,
|
||||
BusinessType,
|
||||
HeroImageryDirection,
|
||||
PageBlueprint,
|
||||
SiteBlueprint,
|
||||
)
|
||||
|
||||
|
||||
class PageBlueprintSerializer(serializers.ModelSerializer):
|
||||
@@ -76,3 +83,16 @@ class SiteBlueprintSerializer(serializers.ModelSerializer):
|
||||
attrs['sector_id'] = sector_id
|
||||
return attrs
|
||||
|
||||
|
||||
class MetadataOptionSerializer(serializers.Serializer):
|
||||
id = serializers.IntegerField()
|
||||
name = serializers.CharField()
|
||||
description = serializers.CharField(required=False, allow_blank=True)
|
||||
|
||||
|
||||
class SiteBuilderMetadataSerializer(serializers.Serializer):
|
||||
business_types = MetadataOptionSerializer(many=True)
|
||||
audience_profiles = MetadataOptionSerializer(many=True)
|
||||
brand_personalities = MetadataOptionSerializer(many=True)
|
||||
hero_imagery_directions = MetadataOptionSerializer(many=True)
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ from igny8_core.modules.site_builder.views import (
|
||||
PageBlueprintViewSet,
|
||||
SiteAssetView,
|
||||
SiteBlueprintViewSet,
|
||||
SiteBuilderMetadataView,
|
||||
)
|
||||
|
||||
router = DefaultRouter()
|
||||
@@ -14,5 +15,6 @@ router.register(r'pages', PageBlueprintViewSet, basename='page_blueprint')
|
||||
urlpatterns = [
|
||||
path('', include(router.urls)),
|
||||
path('assets/', SiteAssetView.as_view(), name='site_builder_assets'),
|
||||
path('metadata/', SiteBuilderMetadataView.as_view(), name='site_builder_metadata'),
|
||||
]
|
||||
|
||||
|
||||
@@ -9,7 +9,14 @@ from igny8_core.api.base import SiteSectorModelViewSet
|
||||
from igny8_core.api.permissions import IsAuthenticatedAndActive, IsEditorOrAbove
|
||||
from igny8_core.api.response import success_response, error_response
|
||||
from igny8_core.api.throttles import DebugScopedRateThrottle
|
||||
from igny8_core.business.site_building.models import SiteBlueprint, PageBlueprint
|
||||
from igny8_core.business.site_building.models import (
|
||||
AudienceProfile,
|
||||
BrandPersonality,
|
||||
BusinessType,
|
||||
HeroImageryDirection,
|
||||
PageBlueprint,
|
||||
SiteBlueprint,
|
||||
)
|
||||
from igny8_core.business.site_building.services import (
|
||||
PageGenerationService,
|
||||
SiteBuilderFileService,
|
||||
@@ -18,6 +25,7 @@ from igny8_core.business.site_building.services import (
|
||||
from igny8_core.modules.site_builder.serializers import (
|
||||
PageBlueprintSerializer,
|
||||
SiteBlueprintSerializer,
|
||||
SiteBuilderMetadataSerializer,
|
||||
)
|
||||
|
||||
|
||||
@@ -205,3 +213,39 @@ class SiteAssetView(APIView):
|
||||
return error_response('File not found', status.HTTP_404_NOT_FOUND, request)
|
||||
|
||||
|
||||
class SiteBuilderMetadataView(APIView):
|
||||
"""
|
||||
Read-only metadata for Site Builder dropdowns.
|
||||
"""
|
||||
|
||||
permission_classes = [IsAuthenticatedAndActive, IsEditorOrAbove]
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
def serialize_queryset(qs):
|
||||
return [
|
||||
{
|
||||
'id': item.id,
|
||||
'name': item.name,
|
||||
'description': item.description or '',
|
||||
}
|
||||
for item in qs
|
||||
]
|
||||
|
||||
data = {
|
||||
'business_types': serialize_queryset(
|
||||
BusinessType.objects.filter(is_active=True).order_by('order', 'name')
|
||||
),
|
||||
'audience_profiles': serialize_queryset(
|
||||
AudienceProfile.objects.filter(is_active=True).order_by('order', 'name')
|
||||
),
|
||||
'brand_personalities': serialize_queryset(
|
||||
BrandPersonality.objects.filter(is_active=True).order_by('order', 'name')
|
||||
),
|
||||
'hero_imagery_directions': serialize_queryset(
|
||||
HeroImageryDirection.objects.filter(is_active=True).order_by('order', 'name')
|
||||
),
|
||||
}
|
||||
|
||||
serializer = SiteBuilderMetadataSerializer(data)
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user