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

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 

6 

7from src.products.mixins import FilterMixin 

8from src.products.utils import get_valid_categories 

9 

10 

11class ProductPagination(PageNumberPagination): 

12 page_size = 8 

13 

14 

15class BaseProductListView(FilterMixin, ListAPIView): 

16 permission_classes = [AllowAny] 

17 pagination_class = ProductPagination 

18 

19 def list(self, request, *args, **kwargs): 

20 data = self._get_products_data() 

21 page = self.paginate_queryset(data) 

22 

23 if page is not None: 

24 serializer = self.get_serializer(page, many=True) 

25 response = self.get_paginated_response(serializer.data) 

26 

27 return response 

28 

29 serializer = self.get_serializer(data, many=True) 

30 

31 return Response( 

32 { 

33 'products': serializer.data, 

34 } 

35 ) 

36 

37 def _get_products_data(self): 

38 filters = self._get_filters_for_product() 

39 ordering = self.request.query_params.get('ordering', 'rating') 

40 

41 return self.model.objects.get_product_list(filters, ordering) 

42 

43 

44class BaseProductItemView(RetrieveAPIView): 

45 permission_classes = [AllowAny] 

46 

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 ) 

54 

55 return Response( 

56 { 

57 'product': serializer.data, 

58 } 

59 ) 

60 

61 

62class BaseAttributeView(FilterMixin, RetrieveAPIView): 

63 permission_classes = [AllowAny] 

64 

65 def get(self, request, *args, **kwargs): 

66 try: 

67 category = self.request.query_params.get('category', '') 

68 

69 if not isinstance(category, str): 

70 category = '' 

71 

72 if category.endswith('s') and len(category) > 1: 

73 category = category[:-1] 

74 

75 valid_categories = get_valid_categories() 

76 

77 if category and category not in valid_categories: 

78 return Response( 

79 {'error': 'Invalid category'}, 

80 status=status.HTTP_404_NOT_FOUND, 

81 ) 

82 

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) 

86 

87 return Response({'results': serializer.data}) 

88 

89 except Exception as e: 

90 

91 return Response( 

92 {'error': 'Resource not found'}, 

93 status=status.HTTP_404_NOT_FOUND, 

94 )