Coverage for src/products/views/base.py: 39%
54 statements
« prev ^ index » next coverage.py v7.9.2, created at 2025-09-21 16:24 +0300
« prev ^ index » next coverage.py v7.9.2, created at 2025-09-21 16:24 +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.common.utils import convert_to_lower_case
8from src.products.mixins import FilterMixin
9from src.products.utils import get_valid_categories
12class ProductPagination(PageNumberPagination):
13 page_size = 8
16class BaseProductListView(FilterMixin, ListAPIView):
17 permission_classes = [AllowAny]
18 pagination_class = ProductPagination
20 def list(self, request, *args, **kwargs):
21 data = self._get_products_data()
22 page = self.paginate_queryset(data)
24 if page is not None:
25 serializer = self.get_serializer(page, many=True)
26 response = self.get_paginated_response(serializer.data)
28 return response
30 serializer = self.get_serializer(data, many=True)
32 return Response(
33 {
34 'products': serializer.data,
35 }
36 )
38 def _get_products_data(self):
39 filters = self._get_filters_for_product()
40 ordering = self.request.query_params.get('ordering', 'rating')
42 return self.model.objects.get_product_list(filters, ordering)
45class BaseProductItemView(RetrieveAPIView):
46 permission_classes = [AllowAny]
48 def get(self, request, *args, **kwargs):
49 pk = kwargs.get('pk')
50 product = self.model.objects.get_product_item(pk)
51 serializer = self.get_serializer(
52 product,
53 context={'request': request},
54 )
56 return Response(
57 {
58 'product': serializer.data,
59 }
60 )
63class BaseAttributeView(FilterMixin, RetrieveAPIView):
64 permission_classes = [AllowAny]
66 def get(self, request, *args, **kwargs):
67 try:
68 category = self.request.query_params.get('category', '')
70 if not isinstance(category, str):
71 category = ''
73 if category.endswith('s') and len(category) > 1:
74 if category == 'watches':
75 category = category[:-2]
76 else:
77 category = category[:-1]
79 categoryToLowerCase = convert_to_lower_case(category)
81 valid_categories = get_valid_categories()
83 if categoryToLowerCase and categoryToLowerCase not in valid_categories:
84 return Response(
85 {'error': 'Invalid category'},
86 status=status.HTTP_404_NOT_FOUND,
87 )
89 filters = self._get_filters_for_attributes(categoryToLowerCase)
90 data = self.model.objects.get_attributes_count(
91 filters, categoryToLowerCase)
92 serializer = self.get_serializer(data, many=True)
94 return Response({'results': serializer.data})
96 except Exception as e:
98 return Response(
99 {'error': 'Resource not found'},
100 status=status.HTTP_404_NOT_FOUND,
101 )