Coverage for products/filters.py: 69%
42 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« 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
8class ProductFilter(django_filters.rest_framework.FilterSet):
9 ctype_dict = get_subclass_as_dict(Product)
11 product_type = django_filters.ChoiceFilter(
12 method="product_type_filter",
13 choices=list(ctype_dict.items()),
14 )
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)
20 class Meta:
21 model = Product
22 fields = {
23 "invoice_configuration": ["isnull"],
24 }
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")
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 }
43 def membership_filter(self, queryset, name, value):
44 membership = Membership.objects.get(pk=value)
45 return MembershipProduct.objects.available_for(membership).distinct()
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
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")
61 class Meta:
62 model = EventProduct
63 fields = {
64 "event": ["exact"],
65 "is_active": ["exact"],
66 }
68 def membership_filter(self, queryset, name, value):
69 membership = Membership.objects.get(pk=value)
70 return EventProduct.objects.available_for(membership).distinct()
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