filters.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import django_filters
  2. from django.forms import DateField, IntegerField, NullBooleanField
  3. from .models import Tag
  4. from .choices import *
  5. __all__ = (
  6. 'CustomFieldFilter',
  7. 'TagFilter',
  8. )
  9. EXACT_FILTER_TYPES = (
  10. CustomFieldTypeChoices.TYPE_BOOLEAN,
  11. CustomFieldTypeChoices.TYPE_DATE,
  12. CustomFieldTypeChoices.TYPE_INTEGER,
  13. CustomFieldTypeChoices.TYPE_SELECT,
  14. CustomFieldTypeChoices.TYPE_MULTISELECT,
  15. )
  16. class CustomFieldFilter(django_filters.Filter):
  17. """
  18. Filter objects by the presence of a CustomFieldValue. The filter's name is used as the CustomField name.
  19. """
  20. def __init__(self, custom_field, *args, **kwargs):
  21. self.custom_field = custom_field
  22. if custom_field.type == CustomFieldTypeChoices.TYPE_INTEGER:
  23. self.field_class = IntegerField
  24. elif custom_field.type == CustomFieldTypeChoices.TYPE_BOOLEAN:
  25. self.field_class = NullBooleanField
  26. elif custom_field.type == CustomFieldTypeChoices.TYPE_DATE:
  27. self.field_class = DateField
  28. super().__init__(*args, **kwargs)
  29. self.field_name = f'custom_field_data__{self.field_name}'
  30. if custom_field.type == CustomFieldTypeChoices.TYPE_MULTISELECT:
  31. self.lookup_expr = 'has_key'
  32. elif custom_field.type not in EXACT_FILTER_TYPES:
  33. if custom_field.filter_logic == CustomFieldFilterLogicChoices.FILTER_LOOSE:
  34. self.lookup_expr = 'icontains'
  35. class TagFilter(django_filters.ModelMultipleChoiceFilter):
  36. """
  37. Match on one or more assigned tags. If multiple tags are specified (e.g. ?tag=foo&tag=bar), the queryset is filtered
  38. to objects matching all tags.
  39. """
  40. def __init__(self, *args, **kwargs):
  41. kwargs.setdefault('field_name', 'tags__slug')
  42. kwargs.setdefault('to_field_name', 'slug')
  43. kwargs.setdefault('conjoined', True)
  44. kwargs.setdefault('queryset', Tag.objects.all())
  45. super().__init__(*args, **kwargs)