From 95d8ade942e1b2adbe2b86340dfa0fb75a73029e Mon Sep 17 00:00:00 2001 From: "IGNY8 VPS (Salman)" Date: Mon, 12 Jan 2026 02:26:25 +0000 Subject: [PATCH] footer widgets and tuomation page fixes --- backend/igny8_core/modules/planner/views.py | 44 ++++++++++++++++--- backend/igny8_core/modules/writer/views.py | 47 ++++++++++++++++----- frontend/src/hooks/useWorkflowStats.ts | 6 --- 3 files changed, 75 insertions(+), 22 deletions(-) diff --git a/backend/igny8_core/modules/planner/views.py b/backend/igny8_core/modules/planner/views.py index a2ceebc7..5888af85 100644 --- a/backend/igny8_core/modules/planner/views.py +++ b/backend/igny8_core/modules/planner/views.py @@ -2,6 +2,7 @@ from rest_framework import viewsets, filters, status from rest_framework.decorators import action from rest_framework.response import Response from django_filters.rest_framework import DjangoFilterBackend +import django_filters from django.db import transaction from django.db.models import Max, Count, Sum, Q from django.http import HttpResponse @@ -23,6 +24,37 @@ from igny8_core.business.planning.services.ideas_service import IdeasService from igny8_core.business.billing.exceptions import InsufficientCreditsError +# Custom FilterSets with date range filtering support +class KeywordsFilter(django_filters.FilterSet): + """Custom filter for Keywords with date range support""" + created_at__gte = django_filters.IsoDateTimeFilter(field_name='created_at', lookup_expr='gte') + created_at__lte = django_filters.IsoDateTimeFilter(field_name='created_at', lookup_expr='lte') + + class Meta: + model = Keywords + fields = ['status', 'cluster_id', 'seed_keyword__country', 'seed_keyword_id', 'created_at__gte', 'created_at__lte'] + + +class ClustersFilter(django_filters.FilterSet): + """Custom filter for Clusters with date range support""" + created_at__gte = django_filters.IsoDateTimeFilter(field_name='created_at', lookup_expr='gte') + created_at__lte = django_filters.IsoDateTimeFilter(field_name='created_at', lookup_expr='lte') + + class Meta: + model = Clusters + fields = ['status', 'created_at__gte', 'created_at__lte'] + + +class ContentIdeasFilter(django_filters.FilterSet): + """Custom filter for ContentIdeas with date range support""" + created_at__gte = django_filters.IsoDateTimeFilter(field_name='created_at', lookup_expr='gte') + created_at__lte = django_filters.IsoDateTimeFilter(field_name='created_at', lookup_expr='lte') + + class Meta: + model = ContentIdeas + fields = ['status', 'keyword_cluster_id', 'content_type', 'content_structure', 'created_at__gte', 'created_at__lte'] + + @extend_schema_view( list=extend_schema(tags=['Planner']), create=extend_schema(tags=['Planner']), @@ -54,8 +86,8 @@ class KeywordViewSet(SiteSectorModelViewSet): ordering_fields = ['created_at', 'seed_keyword__volume', 'seed_keyword__difficulty'] ordering = ['-created_at'] # Default ordering (newest first) - # Filter configuration - filter by status, cluster_id, and seed_keyword fields - filterset_fields = ['status', 'cluster_id', 'seed_keyword__country', 'seed_keyword_id'] + # Filter configuration - use custom filterset for date range filtering + filterset_class = KeywordsFilter def get_queryset(self): """ @@ -803,8 +835,8 @@ class ClusterViewSet(SiteSectorModelViewSet): ordering_fields = ['name', 'created_at', 'keywords_count', 'volume', 'difficulty'] ordering = ['name'] # Default ordering - # Filter configuration - filterset_fields = ['status'] + # Filter configuration - use custom filterset for date range filtering + filterset_class = ClustersFilter def get_queryset(self): """ @@ -1111,8 +1143,8 @@ class ContentIdeasViewSet(SiteSectorModelViewSet): ordering_fields = ['idea_title', 'created_at', 'estimated_word_count'] ordering = ['-created_at'] # Default ordering (newest first) - # Filter configuration (updated for new structure) - filterset_fields = ['status', 'keyword_cluster_id', 'content_type', 'content_structure'] + # Filter configuration - use custom filterset for date range filtering + filterset_class = ContentIdeasFilter def perform_create(self, serializer): """Require explicit site_id and sector_id - no defaults.""" diff --git a/backend/igny8_core/modules/writer/views.py b/backend/igny8_core/modules/writer/views.py index df767d54..818cdd28 100644 --- a/backend/igny8_core/modules/writer/views.py +++ b/backend/igny8_core/modules/writer/views.py @@ -2,6 +2,7 @@ from rest_framework import viewsets, filters, status from rest_framework.decorators import action from rest_framework.response import Response from django_filters.rest_framework import DjangoFilterBackend +import django_filters from django.db import transaction, models from django.db.models import Q from drf_spectacular.utils import extend_schema, extend_schema_view @@ -24,6 +25,37 @@ from igny8_core.business.content.services.metadata_mapping_service import Metada from igny8_core.business.billing.exceptions import InsufficientCreditsError +# Custom FilterSets with date range filtering support +class TasksFilter(django_filters.FilterSet): + """Custom filter for Tasks with date range support""" + created_at__gte = django_filters.IsoDateTimeFilter(field_name='created_at', lookup_expr='gte') + created_at__lte = django_filters.IsoDateTimeFilter(field_name='created_at', lookup_expr='lte') + + class Meta: + model = Tasks + fields = ['status', 'cluster_id', 'content_type', 'content_structure', 'created_at__gte', 'created_at__lte'] + + +class ImagesFilter(django_filters.FilterSet): + """Custom filter for Images with date range support""" + created_at__gte = django_filters.IsoDateTimeFilter(field_name='created_at', lookup_expr='gte') + created_at__lte = django_filters.IsoDateTimeFilter(field_name='created_at', lookup_expr='lte') + + class Meta: + model = Images + fields = ['task_id', 'content_id', 'image_type', 'status', 'created_at__gte', 'created_at__lte'] + + +class ContentFilter(django_filters.FilterSet): + """Custom filter for Content with date range support""" + created_at__gte = django_filters.IsoDateTimeFilter(field_name='created_at', lookup_expr='gte') + created_at__lte = django_filters.IsoDateTimeFilter(field_name='created_at', lookup_expr='lte') + + class Meta: + model = Content + fields = ['cluster_id', 'status', 'content_type', 'content_structure', 'source', 'created_at__gte', 'created_at__lte'] + + @extend_schema_view( list=extend_schema(tags=['Writer']), @@ -56,8 +88,8 @@ class TasksViewSet(SiteSectorModelViewSet): ordering_fields = ['title', 'created_at', 'status'] ordering = ['-created_at'] # Default ordering (newest first) - # Filter configuration - Stage 1: removed entity_type, cluster_role - filterset_fields = ['status', 'cluster_id', 'content_type', 'content_structure'] + # Filter configuration - use custom filterset for date range filtering + filterset_class = TasksFilter def perform_create(self, serializer): """Require explicit site_id and sector_id - no defaults.""" @@ -265,7 +297,7 @@ class ImagesViewSet(SiteSectorModelViewSet): filter_backends = [DjangoFilterBackend, filters.OrderingFilter] ordering_fields = ['created_at', 'position', 'id'] ordering = ['-id'] # Sort by ID descending (newest first) - filterset_fields = ['task_id', 'content_id', 'image_type', 'status'] + filterset_class = ImagesFilter def perform_create(self, serializer): """Override to automatically set account, site, and sector""" @@ -743,13 +775,8 @@ class ContentViewSet(SiteSectorModelViewSet): ordering_fields = ['created_at', 'updated_at', 'status'] ordering = ['-created_at'] # Stage 1: removed task_id, entity_type, content_format, cluster_role, sync_status, external_type - filterset_fields = [ - 'cluster_id', - 'status', - 'content_type', - 'content_structure', - 'source', - ] + # Use custom filterset for date range filtering + filterset_class = ContentFilter def get_queryset(self): """Override to support status__in filtering for multiple statuses""" diff --git a/frontend/src/hooks/useWorkflowStats.ts b/frontend/src/hooks/useWorkflowStats.ts index 42eef687..0dfd46f0 100644 --- a/frontend/src/hooks/useWorkflowStats.ts +++ b/frontend/src/hooks/useWorkflowStats.ts @@ -146,9 +146,6 @@ export function useWorkflowStats(timeFilter: TimeFilter = 'all') { return; } - // Debug logging - console.log('[useWorkflowStats] Loading stats with timeFilter:', timeFilter, 'siteId:', activeSite.id); - setStats(prev => ({ ...prev, loading: true, error: null })); try { @@ -156,8 +153,6 @@ export function useWorkflowStats(timeFilter: TimeFilter = 'all') { const dateFilter = getDateFilter(timeFilter); const dateParam = dateFilter ? `&created_at__gte=${dateFilter.split('T')[0]}` : ''; - console.log("[useWorkflowStats] Date filter:", { timeFilter, dateFilter, dateParam }); - // IMPORTANT: Widget should always show site-wide stats for consistency // Sector filtering removed to ensure widget shows same counts on all pages const siteParam = `&site_id=${activeSite.id}`; @@ -249,7 +244,6 @@ export function useWorkflowStats(timeFilter: TimeFilter = 'all') { const plannerTotal = clusteringCredits + ideaCredits; const writerTotal = contentCredits + imageCredits; - console.log("[useWorkflowStats] Results:", { keywordsCount: keywordsRes?.count, clustersCount: clustersRes?.count }); setStats({ planner: { totalKeywords: keywordsRes?.count || 0,