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

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.common.utils import convert_to_lower_case 

8from src.products.mixins import FilterMixin 

9from src.products.utils import get_valid_categories 

10 

11 

12class ProductPagination(PageNumberPagination): 

13 page_size = 8 

14 

15 

16class BaseProductListView(FilterMixin, ListAPIView): 

17 permission_classes = [AllowAny] 

18 pagination_class = ProductPagination 

19 

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

21 data = self._get_products_data() 

22 page = self.paginate_queryset(data) 

23 

24 if page is not None: 

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

26 response = self.get_paginated_response(serializer.data) 

27 

28 return response 

29 

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

31 

32 return Response( 

33 { 

34 'products': serializer.data, 

35 } 

36 ) 

37 

38 def _get_products_data(self): 

39 filters = self._get_filters_for_product() 

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

41 

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

43 

44 

45class BaseProductItemView(RetrieveAPIView): 

46 permission_classes = [AllowAny] 

47 

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 ) 

55 

56 return Response( 

57 { 

58 'product': serializer.data, 

59 } 

60 ) 

61 

62 

63class BaseAttributeView(FilterMixin, RetrieveAPIView): 

64 permission_classes = [AllowAny] 

65 

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

67 try: 

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

69 

70 if not isinstance(category, str): 

71 category = '' 

72 

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

74 if category == 'watches': 

75 category = category[:-2] 

76 else: 

77 category = category[:-1] 

78 

79 categoryToLowerCase = convert_to_lower_case(category) 

80 

81 valid_categories = get_valid_categories() 

82 

83 if categoryToLowerCase and categoryToLowerCase not in valid_categories: 

84 return Response( 

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

86 status=status.HTTP_404_NOT_FOUND, 

87 ) 

88 

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) 

93 

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

95 

96 except Exception as e: 

97 

98 return Response( 

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

100 status=status.HTTP_404_NOT_FOUND, 

101 )