Phase 1: Progress modal text, SiteSerializer fields, Notification store, SiteCard checklist

- Improved progress modal messages in ai/engine.py (Section 4)
- Added keywords_count and has_integration to SiteSerializer (Section 6)
- Added notificationStore.ts for frontend notifications (Section 8)
- Added NotificationDropdownNew component (Section 8)
- Added SiteSetupChecklist to SiteCard in compact mode (Section 6)
- Updated api.ts Site interface with new fields
This commit is contained in:
IGNY8 VPS (Salman)
2025-12-27 17:40:28 +00:00
parent c44bee7fa7
commit a1ec3100fd
6 changed files with 606 additions and 33 deletions

View File

@@ -66,6 +66,8 @@ class SiteSerializer(serializers.ModelSerializer):
active_sectors_count = serializers.SerializerMethodField()
selected_sectors = serializers.SerializerMethodField()
can_add_sectors = serializers.SerializerMethodField()
keywords_count = serializers.SerializerMethodField()
has_integration = serializers.SerializerMethodField()
industry_name = serializers.CharField(source='industry.name', read_only=True)
industry_slug = serializers.CharField(source='industry.slug', read_only=True)
# Override domain field to use CharField instead of URLField to avoid premature validation
@@ -79,7 +81,7 @@ class SiteSerializer(serializers.ModelSerializer):
'is_active', 'status',
'site_type', 'hosting_type', 'seo_metadata',
'sectors_count', 'active_sectors_count', 'selected_sectors',
'can_add_sectors',
'can_add_sectors', 'keywords_count', 'has_integration',
'created_at', 'updated_at'
]
read_only_fields = ['created_at', 'updated_at', 'account']
@@ -161,6 +163,20 @@ class SiteSerializer(serializers.ModelSerializer):
"""Check if site can add more sectors (max 5)."""
return obj.can_add_sector()
def get_keywords_count(self, obj):
"""Get total keywords count for the site across all sectors."""
from igny8_core.modules.planner.models import Keywords
return Keywords.objects.filter(site=obj).count()
def get_has_integration(self, obj):
"""Check if site has an active WordPress integration."""
from igny8_core.business.integration.models import SiteIntegration
return SiteIntegration.objects.filter(
site=obj,
integration_type='wordpress',
is_active=True
).exists() or bool(obj.wp_url)
class IndustrySectorSerializer(serializers.ModelSerializer):
"""Serializer for IndustrySector model."""