Coverage for src/products/views/base.py: 40%
50 statements
« prev ^ index » next coverage.py v7.9.2, created at 2025-08-04 12:59 +0300
« prev ^ index » next coverage.py v7.9.2, created at 2025-08-04 12:59 +0300
1from rest_framework.permissions import AllowAny
2from rest_framework.response import Response
3from rest_framework.pagination import PageNumberPagination
4from rest_framework.generics import ListAPIView, RetrieveAPIView
5from rest_framework import status
7from src.products.mixins import FilterMixin
8from src.products.utils import get_valid_categories
11class ProductPagination(PageNumberPagination):
12 page_size = 8
15class BaseProductListView(FilterMixin, ListAPIView):
16 permission_classes = [AllowAny]
17 pagination_class = ProductPagination
19 def list(self, request, *args, **kwargs):
20 data = self._get_products_data()
21 page = self.paginate_queryset(data)
23 if page is not None:
24 serializer = self.get_serializer(page, many=True)
25 response = self.get_paginated_response(serializer.data)
27 return response
29 serializer = self.get_serializer(data, many=True)
31 return Response(
32 {
33 'products': serializer.data,
34 }
35 )
37 def _get_products_data(self):
38 filters = self._get_filters_for_product()
39 ordering = self.request.query_params.get('ordering', 'rating')
41 return self.model.objects.get_product_list(filters, ordering)
44class BaseProductItemView(RetrieveAPIView):
45 permission_classes = [AllowAny]
47 def get(self, request, *args, **kwargs):
48 pk = kwargs.get('pk')
49 product = self.model.objects.get_product_item(pk)
50 serializer = self.get_serializer(
51 product,
52 context={'request': request},
53 )
55 return Response(
56 {
57 'product': serializer.data,
58 }
59 )
62class BaseAttributeView(FilterMixin, RetrieveAPIView):
63 permission_classes = [AllowAny]
65 def get(self, request, *args, **kwargs):
66 try:
67 category = self.request.query_params.get('category', '')
69 if not isinstance(category, str):
70 category = ''
72 if category.endswith('s') and len(category) > 1:
73 category = category[:-1]
75 valid_categories = get_valid_categories()
77 if category and category not in valid_categories:
78 return Response(
79 {'error': 'Invalid category'},
80 status=status.HTTP_404_NOT_FOUND,
81 )
83 filters = self._get_filters_for_attributes(category)
84 data = self.model.objects.get_attributes_count(filters, category)
85 serializer = self.get_serializer(data, many=True)
87 return Response({'results': serializer.data})
89 except Exception as e:
91 return Response(
92 {'error': 'Resource not found'},
93 status=status.HTTP_404_NOT_FOUND,
94 )