Coverage for products/filters.py: 69%

42 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2023-07-17 14:22 -0600

1import django_filters 

2from django.utils import timezone 

3from app.utils import get_subclass_as_dict 

4from memberships.models import Membership 

5from .models import Product, MembershipProduct, EventProduct 

6 

7 

8class ProductFilter(django_filters.rest_framework.FilterSet): 

9 ctype_dict = get_subclass_as_dict(Product) 

10 

11 product_type = django_filters.ChoiceFilter( 

12 method="product_type_filter", 

13 choices=list(ctype_dict.items()), 

14 ) 

15 

16 def product_type_filter(self, queryset, name, value): 

17 selected_product_type = self.ctype_dict[value] if value in self.ctype_dict.keys() else None 

18 return queryset.instance_of(selected_product_type) 

19 

20 class Meta: 

21 model = Product 

22 fields = { 

23 "invoice_configuration": ["isnull"], 

24 } 

25 

26 

27class MembershipProductFilter(django_filters.rest_framework.FilterSet): 

28 membership = django_filters.ChoiceFilter( 

29 method="membership_filter", choices=Membership.objects.values_list("random_slug", "name") 

30 ) 

31 purchasable = django_filters.BooleanFilter(method="purchasable_filter") 

32 

33 class Meta: 

34 model = MembershipProduct 

35 fields = { 

36 "renewal_type": ["exact"], 

37 "duration": ["exact"], 

38 "installable_from": ["lte", "gte"], 

39 "installable_until": ["lte", "gte"], 

40 "segments": ["exact"], 

41 } 

42 

43 def membership_filter(self, queryset, name, value): 

44 membership = Membership.objects.get(pk=value) 

45 return MembershipProduct.objects.available_for(membership).distinct() 

46 

47 def purchasable_filter(self, queryset, name, value): 

48 if value: 

49 today = timezone.datetime.today().date() 

50 return queryset.filter(installable_from__lte=today, installable_until__gte=today) 

51 else: 

52 return queryset 

53 

54 

55class EventProductFilter(django_filters.rest_framework.FilterSet): 

56 membership = django_filters.ChoiceFilter( 

57 method="membership_filter", choices=Membership.objects.values_list("random_slug", "name") 

58 ) 

59 purchasable = django_filters.BooleanFilter(method="purchasable_filter") 

60 

61 class Meta: 

62 model = EventProduct 

63 fields = { 

64 "event": ["exact"], 

65 "is_active": ["exact"], 

66 } 

67 

68 def membership_filter(self, queryset, name, value): 

69 membership = Membership.objects.get(pk=value) 

70 return EventProduct.objects.available_for(membership).distinct() 

71 

72 def purchasable_filter(self, queryset, name, value): 

73 if value: 

74 today = timezone.datetime.today().date() 

75 return queryset.filter(installable_from__lte=today, installable_until__gte=today) 

76 else: 

77 return queryset