Add comprehensive analytics and VAT rate management
Introduced a full-featured analytics module for e-commerce business intelligence, including sales, product, customer, shipping, and review analytics, with API endpoints for dashboard and custom reports. Added VAT rate management: new VATRate model, admin interface, serializer, and API endpoints, and integrated VAT logic into Product and pricing calculations. Refactored configuration and admin code to support VAT rates, improved email notification tasks, and updated related serializers, views, and URLs for unified configuration and VAT management.
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
from rest_framework import viewsets, mixins
|
||||
from rest_framework.permissions import IsAdminUser, AllowAny
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.response import Response
|
||||
from drf_spectacular.utils import extend_schema, extend_schema_view
|
||||
from .models import SiteConfiguration
|
||||
from account.permissions import AdminWriteOnlyOrReadOnly
|
||||
from .models import SiteConfiguration, VATRate
|
||||
from .serializers import (
|
||||
SiteConfigurationAdminSerializer,
|
||||
SiteConfigurationPublicSerializer,
|
||||
SiteConfigurationSerializer,
|
||||
VATRateSerializer,
|
||||
)
|
||||
|
||||
|
||||
@@ -17,22 +19,56 @@ class _SingletonQuerysetMixin:
|
||||
|
||||
|
||||
@extend_schema_view(
|
||||
list=extend_schema(tags=["configuration"], summary="List site configuration (admin)"),
|
||||
retrieve=extend_schema(tags=["configuration"], summary="Retrieve site configuration (admin)"),
|
||||
create=extend_schema(tags=["configuration"], summary="Create site configuration (admin)"),
|
||||
partial_update=extend_schema(tags=["configuration"], summary="Update site configuration (admin)"),
|
||||
update=extend_schema(tags=["configuration"], summary="Replace site configuration (admin)"),
|
||||
destroy=extend_schema(tags=["configuration"], summary="Delete site configuration (admin)"),
|
||||
list=extend_schema(tags=["configuration"], summary="List site configuration"),
|
||||
retrieve=extend_schema(tags=["configuration"], summary="Retrieve site configuration"),
|
||||
create=extend_schema(tags=["configuration"], summary="Create site configuration (admin only)"),
|
||||
partial_update=extend_schema(tags=["configuration"], summary="Update site configuration (admin only)"),
|
||||
update=extend_schema(tags=["configuration"], summary="Replace site configuration (admin only)"),
|
||||
destroy=extend_schema(tags=["configuration"], summary="Delete site configuration (admin only)"),
|
||||
)
|
||||
class SiteConfigurationAdminViewSet(_SingletonQuerysetMixin, viewsets.ModelViewSet):
|
||||
permission_classes = [IsAdminUser]
|
||||
serializer_class = SiteConfigurationAdminSerializer
|
||||
class SiteConfigurationViewSet(_SingletonQuerysetMixin, viewsets.ModelViewSet):
|
||||
permission_classes = [AdminWriteOnlyOrReadOnly]
|
||||
serializer_class = SiteConfigurationSerializer
|
||||
|
||||
|
||||
@extend_schema_view(
|
||||
list=extend_schema(tags=["configuration", "public"], summary="List site configuration (public)"),
|
||||
retrieve=extend_schema(tags=["configuration", "public"], summary="Retrieve site configuration (public)"),
|
||||
list=extend_schema(tags=["configuration"], summary="List VAT rates"),
|
||||
retrieve=extend_schema(tags=["configuration"], summary="Retrieve VAT rate"),
|
||||
create=extend_schema(tags=["configuration"], summary="Create VAT rate (admin only)"),
|
||||
partial_update=extend_schema(tags=["configuration"], summary="Update VAT rate (admin only)"),
|
||||
update=extend_schema(tags=["configuration"], summary="Replace VAT rate (admin only)"),
|
||||
destroy=extend_schema(tags=["configuration"], summary="Delete VAT rate (admin only)"),
|
||||
)
|
||||
class SiteConfigurationPublicViewSet(_SingletonQuerysetMixin, viewsets.ReadOnlyModelViewSet):
|
||||
permission_classes = [AllowAny]
|
||||
serializer_class = SiteConfigurationPublicSerializer
|
||||
class VATRateViewSet(viewsets.ModelViewSet):
|
||||
"""VAT rate management - read for all, write for admins only"""
|
||||
permission_classes = [AdminWriteOnlyOrReadOnly]
|
||||
serializer_class = VATRateSerializer
|
||||
queryset = VATRate.objects.filter(is_active=True)
|
||||
|
||||
def get_queryset(self):
|
||||
"""Admins see all rates, others see only active ones"""
|
||||
if self.request.user.is_authenticated and getattr(self.request.user, 'role', None) == 'admin':
|
||||
return VATRate.objects.all()
|
||||
return VATRate.objects.filter(is_active=True)
|
||||
|
||||
@extend_schema(
|
||||
tags=["configuration"],
|
||||
summary="Make VAT rate the default (admin only)",
|
||||
description="Set this VAT rate as the default for new products"
|
||||
)
|
||||
@action(detail=True, methods=['post'])
|
||||
def make_default(self, request, pk=None):
|
||||
"""Make this VAT rate the default"""
|
||||
vat_rate = self.get_object()
|
||||
|
||||
# Clear existing defaults
|
||||
VATRate.objects.filter(is_default=True).update(is_default=False)
|
||||
|
||||
# Set new default
|
||||
vat_rate.is_default = True
|
||||
vat_rate.save()
|
||||
|
||||
return Response({
|
||||
'message': f'"{vat_rate.name}" is now the default VAT rate',
|
||||
'default_rate_id': vat_rate.id
|
||||
})
|
||||
Reference in New Issue
Block a user