diff --git a/taiga/base/filters.py b/taiga/base/filters.py index 8b0b1fd8..424f4e87 100644 --- a/taiga/base/filters.py +++ b/taiga/base/filters.py @@ -19,6 +19,8 @@ from django.db.models import Q from rest_framework import filters +from taiga.base.utils.db import filter_by_tags + class QueryParamsFilterMixin(object): _special_values_dict = { @@ -94,8 +96,6 @@ class IsProjectMemberFilterBackend(FilterBackend): class TagsFilter(FilterBackend): - FILTER_TAGS_SQL = "unpickle({table}.tags) && %s" - def __init__(self, filter_name='tags'): self.filter_name = filter_name @@ -108,7 +108,6 @@ class TagsFilter(FilterBackend): def filter_queryset(self, request, queryset, view): tags = self._get_tags_queryparams(request.QUERY_PARAMS) if tags: - where_sql = self.FILTER_TAGS_SQL.format(table=view.model._meta.db_table) - queryset = queryset.extra(where=[where_sql], params=[tags]) + queryset = filter_by_tags(tags, queryset) return queryset diff --git a/taiga/base/utils/db.py b/taiga/base/utils/db.py new file mode 100644 index 00000000..6e056fda --- /dev/null +++ b/taiga/base/utils/db.py @@ -0,0 +1,9 @@ +FILTER_TAGS_SQL = "unpickle({table}.tags) && %s" + + +def filter_by_tags(tags, queryset): + """Filter a queryset of a model with pickled field named tags, by tags.""" + table_name = queryset.model._meta.db_table + where_sql = FILTER_TAGS_SQL.format(table=table_name) + + return queryset.extra(where=[where_sql], params=[tags])