filters.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from __future__ import unicode_literals
  2. import django_filters
  3. from django.contrib.auth.models import User
  4. from django.contrib.contenttypes.models import ContentType
  5. from dcim.models import Site
  6. from .models import CF_TYPE_SELECT, CustomField, Graph, ExportTemplate, TopologyMap, UserAction
  7. class CustomFieldFilter(django_filters.Filter):
  8. """
  9. Filter objects by the presence of a CustomFieldValue. The filter's name is used as the CustomField name.
  10. """
  11. def __init__(self, cf_type, *args, **kwargs):
  12. self.cf_type = cf_type
  13. super(CustomFieldFilter, self).__init__(*args, **kwargs)
  14. def filter(self, queryset, value):
  15. # Skip filter on empty value
  16. if not value.strip():
  17. return queryset
  18. # Treat 0 as None for Select fields
  19. try:
  20. if self.cf_type == CF_TYPE_SELECT and int(value) == 0:
  21. return queryset.exclude(
  22. custom_field_values__field__name=self.name,
  23. )
  24. except ValueError:
  25. pass
  26. return queryset.filter(
  27. custom_field_values__field__name=self.name,
  28. custom_field_values__serialized_value=value,
  29. )
  30. class CustomFieldFilterSet(django_filters.FilterSet):
  31. """
  32. Dynamically add a Filter for each CustomField applicable to the parent model.
  33. """
  34. def __init__(self, *args, **kwargs):
  35. super(CustomFieldFilterSet, self).__init__(*args, **kwargs)
  36. obj_type = ContentType.objects.get_for_model(self._meta.model)
  37. custom_fields = CustomField.objects.filter(obj_type=obj_type, is_filterable=True)
  38. for cf in custom_fields:
  39. self.filters['cf_{}'.format(cf.name)] = CustomFieldFilter(name=cf.name, cf_type=cf.type)
  40. class GraphFilter(django_filters.FilterSet):
  41. class Meta:
  42. model = Graph
  43. fields = ['type', 'name']
  44. class ExportTemplateFilter(django_filters.FilterSet):
  45. class Meta:
  46. model = ExportTemplate
  47. fields = ['content_type', 'name']
  48. class TopologyMapFilter(django_filters.FilterSet):
  49. site_id = django_filters.ModelMultipleChoiceFilter(
  50. name='site',
  51. queryset=Site.objects.all(),
  52. label='Site',
  53. )
  54. site = django_filters.ModelMultipleChoiceFilter(
  55. name='site__slug',
  56. queryset=Site.objects.all(),
  57. to_field_name='slug',
  58. label='Site (slug)',
  59. )
  60. class Meta:
  61. model = TopologyMap
  62. fields = ['name', 'slug']
  63. class UserActionFilter(django_filters.FilterSet):
  64. username = django_filters.ModelMultipleChoiceFilter(
  65. name='user__username',
  66. queryset=User.objects.all(),
  67. to_field_name='username',
  68. )
  69. class Meta:
  70. model = UserAction
  71. fields = ['user']