footer widgets and tuomation page fixes
This commit is contained in:
@@ -2,6 +2,7 @@ from rest_framework import viewsets, filters, status
|
|||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from django_filters.rest_framework import DjangoFilterBackend
|
from django_filters.rest_framework import DjangoFilterBackend
|
||||||
|
import django_filters
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.db.models import Max, Count, Sum, Q
|
from django.db.models import Max, Count, Sum, Q
|
||||||
from django.http import HttpResponse
|
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
|
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(
|
@extend_schema_view(
|
||||||
list=extend_schema(tags=['Planner']),
|
list=extend_schema(tags=['Planner']),
|
||||||
create=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_fields = ['created_at', 'seed_keyword__volume', 'seed_keyword__difficulty']
|
||||||
ordering = ['-created_at'] # Default ordering (newest first)
|
ordering = ['-created_at'] # Default ordering (newest first)
|
||||||
|
|
||||||
# Filter configuration - filter by status, cluster_id, and seed_keyword fields
|
# Filter configuration - use custom filterset for date range filtering
|
||||||
filterset_fields = ['status', 'cluster_id', 'seed_keyword__country', 'seed_keyword_id']
|
filterset_class = KeywordsFilter
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
"""
|
"""
|
||||||
@@ -803,8 +835,8 @@ class ClusterViewSet(SiteSectorModelViewSet):
|
|||||||
ordering_fields = ['name', 'created_at', 'keywords_count', 'volume', 'difficulty']
|
ordering_fields = ['name', 'created_at', 'keywords_count', 'volume', 'difficulty']
|
||||||
ordering = ['name'] # Default ordering
|
ordering = ['name'] # Default ordering
|
||||||
|
|
||||||
# Filter configuration
|
# Filter configuration - use custom filterset for date range filtering
|
||||||
filterset_fields = ['status']
|
filterset_class = ClustersFilter
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
"""
|
"""
|
||||||
@@ -1111,8 +1143,8 @@ class ContentIdeasViewSet(SiteSectorModelViewSet):
|
|||||||
ordering_fields = ['idea_title', 'created_at', 'estimated_word_count']
|
ordering_fields = ['idea_title', 'created_at', 'estimated_word_count']
|
||||||
ordering = ['-created_at'] # Default ordering (newest first)
|
ordering = ['-created_at'] # Default ordering (newest first)
|
||||||
|
|
||||||
# Filter configuration (updated for new structure)
|
# Filter configuration - use custom filterset for date range filtering
|
||||||
filterset_fields = ['status', 'keyword_cluster_id', 'content_type', 'content_structure']
|
filterset_class = ContentIdeasFilter
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
"""Require explicit site_id and sector_id - no defaults."""
|
"""Require explicit site_id and sector_id - no defaults."""
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ from rest_framework import viewsets, filters, status
|
|||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from django_filters.rest_framework import DjangoFilterBackend
|
from django_filters.rest_framework import DjangoFilterBackend
|
||||||
|
import django_filters
|
||||||
from django.db import transaction, models
|
from django.db import transaction, models
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from drf_spectacular.utils import extend_schema, extend_schema_view
|
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
|
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(
|
@extend_schema_view(
|
||||||
list=extend_schema(tags=['Writer']),
|
list=extend_schema(tags=['Writer']),
|
||||||
@@ -56,8 +88,8 @@ class TasksViewSet(SiteSectorModelViewSet):
|
|||||||
ordering_fields = ['title', 'created_at', 'status']
|
ordering_fields = ['title', 'created_at', 'status']
|
||||||
ordering = ['-created_at'] # Default ordering (newest first)
|
ordering = ['-created_at'] # Default ordering (newest first)
|
||||||
|
|
||||||
# Filter configuration - Stage 1: removed entity_type, cluster_role
|
# Filter configuration - use custom filterset for date range filtering
|
||||||
filterset_fields = ['status', 'cluster_id', 'content_type', 'content_structure']
|
filterset_class = TasksFilter
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
"""Require explicit site_id and sector_id - no defaults."""
|
"""Require explicit site_id and sector_id - no defaults."""
|
||||||
@@ -265,7 +297,7 @@ class ImagesViewSet(SiteSectorModelViewSet):
|
|||||||
filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
|
filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
|
||||||
ordering_fields = ['created_at', 'position', 'id']
|
ordering_fields = ['created_at', 'position', 'id']
|
||||||
ordering = ['-id'] # Sort by ID descending (newest first)
|
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):
|
def perform_create(self, serializer):
|
||||||
"""Override to automatically set account, site, and sector"""
|
"""Override to automatically set account, site, and sector"""
|
||||||
@@ -743,13 +775,8 @@ class ContentViewSet(SiteSectorModelViewSet):
|
|||||||
ordering_fields = ['created_at', 'updated_at', 'status']
|
ordering_fields = ['created_at', 'updated_at', 'status']
|
||||||
ordering = ['-created_at']
|
ordering = ['-created_at']
|
||||||
# Stage 1: removed task_id, entity_type, content_format, cluster_role, sync_status, external_type
|
# Stage 1: removed task_id, entity_type, content_format, cluster_role, sync_status, external_type
|
||||||
filterset_fields = [
|
# Use custom filterset for date range filtering
|
||||||
'cluster_id',
|
filterset_class = ContentFilter
|
||||||
'status',
|
|
||||||
'content_type',
|
|
||||||
'content_structure',
|
|
||||||
'source',
|
|
||||||
]
|
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
"""Override to support status__in filtering for multiple statuses"""
|
"""Override to support status__in filtering for multiple statuses"""
|
||||||
|
|||||||
@@ -146,9 +146,6 @@ export function useWorkflowStats(timeFilter: TimeFilter = 'all') {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Debug logging
|
|
||||||
console.log('[useWorkflowStats] Loading stats with timeFilter:', timeFilter, 'siteId:', activeSite.id);
|
|
||||||
|
|
||||||
setStats(prev => ({ ...prev, loading: true, error: null }));
|
setStats(prev => ({ ...prev, loading: true, error: null }));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -156,8 +153,6 @@ export function useWorkflowStats(timeFilter: TimeFilter = 'all') {
|
|||||||
const dateFilter = getDateFilter(timeFilter);
|
const dateFilter = getDateFilter(timeFilter);
|
||||||
const dateParam = dateFilter ? `&created_at__gte=${dateFilter.split('T')[0]}` : '';
|
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
|
// IMPORTANT: Widget should always show site-wide stats for consistency
|
||||||
// Sector filtering removed to ensure widget shows same counts on all pages
|
// Sector filtering removed to ensure widget shows same counts on all pages
|
||||||
const siteParam = `&site_id=${activeSite.id}`;
|
const siteParam = `&site_id=${activeSite.id}`;
|
||||||
@@ -249,7 +244,6 @@ export function useWorkflowStats(timeFilter: TimeFilter = 'all') {
|
|||||||
const plannerTotal = clusteringCredits + ideaCredits;
|
const plannerTotal = clusteringCredits + ideaCredits;
|
||||||
const writerTotal = contentCredits + imageCredits;
|
const writerTotal = contentCredits + imageCredits;
|
||||||
|
|
||||||
console.log("[useWorkflowStats] Results:", { keywordsCount: keywordsRes?.count, clustersCount: clustersRes?.count });
|
|
||||||
setStats({
|
setStats({
|
||||||
planner: {
|
planner: {
|
||||||
totalKeywords: keywordsRes?.count || 0,
|
totalKeywords: keywordsRes?.count || 0,
|
||||||
|
|||||||
Reference in New Issue
Block a user