master - part 2
This commit is contained in:
@@ -934,6 +934,45 @@ class ClusterViewSet(SiteSectorModelViewSet):
|
||||
# Save with all required fields explicitly
|
||||
serializer.save(account=account, site=site, sector=sector)
|
||||
|
||||
@action(detail=False, methods=['get'], url_path='summary', url_name='summary')
|
||||
def summary(self, request):
|
||||
"""
|
||||
Get aggregate summary metrics for clusters.
|
||||
Returns total keywords count and total volume across all clusters (unfiltered).
|
||||
Used for header metrics display.
|
||||
"""
|
||||
from django.db.models import Sum, Count, Case, When, F, IntegerField
|
||||
|
||||
queryset = self.get_queryset()
|
||||
|
||||
# Get cluster IDs
|
||||
cluster_ids = list(queryset.values_list('id', flat=True))
|
||||
|
||||
# Aggregate keyword stats across all clusters
|
||||
keyword_stats = (
|
||||
Keywords.objects
|
||||
.filter(cluster_id__in=cluster_ids)
|
||||
.aggregate(
|
||||
total_keywords=Count('id'),
|
||||
total_volume=Sum(
|
||||
Case(
|
||||
When(volume_override__isnull=False, then=F('volume_override')),
|
||||
default=F('seed_keyword__volume'),
|
||||
output_field=IntegerField()
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
return success_response(
|
||||
data={
|
||||
'total_clusters': len(cluster_ids),
|
||||
'total_keywords': keyword_stats['total_keywords'] or 0,
|
||||
'total_volume': keyword_stats['total_volume'] or 0,
|
||||
},
|
||||
request=request
|
||||
)
|
||||
|
||||
@action(detail=False, methods=['POST'], url_path='bulk_delete', url_name='bulk_delete')
|
||||
def bulk_delete(self, request):
|
||||
"""Bulk delete clusters"""
|
||||
|
||||
Reference in New Issue
Block a user