Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/django_filters/rest_framework/backends.py: 51%
81 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 warnings
3from django.template import loader
5from .. import compat, utils
6from . import filters, filterset
9class DjangoFilterBackend:
10 filterset_base = filterset.FilterSet
11 raise_exception = True
13 @property
14 def template(self):
15 if compat.is_crispy():
16 return "django_filters/rest_framework/crispy_form.html"
17 return "django_filters/rest_framework/form.html"
19 def get_filterset(self, request, queryset, view):
20 filterset_class = self.get_filterset_class(view, queryset)
21 if filterset_class is None:
22 return None
24 kwargs = self.get_filterset_kwargs(request, queryset, view)
25 return filterset_class(**kwargs)
27 def get_filterset_class(self, view, queryset=None):
28 """
29 Return the `FilterSet` class used to filter the queryset.
30 """
31 filterset_class = getattr(view, "filterset_class", None)
32 filterset_fields = getattr(view, "filterset_fields", None)
34 if filterset_class:
35 filterset_model = filterset_class._meta.model
37 # FilterSets do not need to specify a Meta class
38 if filterset_model and queryset is not None: 38 ↛ 46line 38 didn't jump to line 46, because the condition on line 38 was never false
39 assert issubclass(
40 queryset.model, filterset_model
41 ), "FilterSet model %s does not match queryset model %s" % (
42 filterset_model,
43 queryset.model,
44 )
46 return filterset_class
48 if filterset_fields and queryset is not None:
49 MetaBase = getattr(self.filterset_base, "Meta", object)
51 class AutoFilterSet(self.filterset_base):
52 class Meta(MetaBase):
53 model = queryset.model
54 fields = filterset_fields
56 return AutoFilterSet
58 return None
60 def get_filterset_kwargs(self, request, queryset, view):
61 return {
62 "data": request.query_params,
63 "queryset": queryset,
64 "request": request,
65 }
67 def filter_queryset(self, request, queryset, view):
68 filterset = self.get_filterset(request, queryset, view)
69 if filterset is None:
70 return queryset
72 if not filterset.is_valid() and self.raise_exception: 72 ↛ 73line 72 didn't jump to line 73, because the condition on line 72 was never true
73 raise utils.translate_validation(filterset.errors)
74 return filterset.qs
76 def to_html(self, request, queryset, view):
77 filterset = self.get_filterset(request, queryset, view)
78 if filterset is None:
79 return None
81 template = loader.get_template(self.template)
82 context = {"filter": filterset}
83 return template.render(context, request)
85 def get_coreschema_field(self, field):
86 if isinstance(field, filters.NumberFilter):
87 field_cls = compat.coreschema.Number
88 else:
89 field_cls = compat.coreschema.String
90 return field_cls(description=str(field.extra.get("help_text", "")))
92 def get_schema_fields(self, view):
93 # This is not compatible with widgets where the query param differs from the
94 # filter's attribute name. Notably, this includes `MultiWidget`, where query
95 # params will be of the format `<name>_0`, `<name>_1`, etc...
96 assert (
97 compat.coreapi is not None
98 ), "coreapi must be installed to use `get_schema_fields()`"
99 assert (
100 compat.coreschema is not None
101 ), "coreschema must be installed to use `get_schema_fields()`"
103 try:
104 queryset = view.get_queryset()
105 except Exception:
106 queryset = None
107 warnings.warn(
108 "{} is not compatible with schema generation".format(view.__class__)
109 )
111 filterset_class = self.get_filterset_class(view, queryset)
113 return (
114 []
115 if not filterset_class
116 else [
117 compat.coreapi.Field(
118 name=field_name,
119 required=field.extra["required"],
120 location="query",
121 schema=self.get_coreschema_field(field),
122 )
123 for field_name, field in filterset_class.base_filters.items()
124 ]
125 )
127 def get_schema_operation_parameters(self, view):
128 try:
129 queryset = view.get_queryset()
130 except Exception:
131 queryset = None
132 warnings.warn(
133 "{} is not compatible with schema generation".format(view.__class__)
134 )
136 filterset_class = self.get_filterset_class(view, queryset)
138 if not filterset_class:
139 return []
141 parameters = []
142 for field_name, field in filterset_class.base_filters.items():
143 parameter = {
144 "name": field_name,
145 "required": field.extra["required"],
146 "in": "query",
147 "description": field.label if field.label is not None else field_name,
148 "schema": {
149 "type": "string",
150 },
151 }
152 if field.extra and "choices" in field.extra:
153 parameter["schema"]["enum"] = [c[0] for c in field.extra["choices"]]
154 parameters.append(parameter)
155 return parameters