diff --git a/taiga/base/filters.py b/taiga/base/filters.py index 8d63a0d4..4ccf331a 100644 --- a/taiga/base/filters.py +++ b/taiga/base/filters.py @@ -515,8 +515,13 @@ class TagsFilter(FilterBackend): def _prepare_filter_query(self, query): return Q(tags__contains=query) - def _prepare_exclude_query(self, query): - return ~Q(tags__contains=query) + def _prepare_exclude_query(self, tags): + queries = [Q(tags__contains=[tag]) for tag in tags] + query = queries.pop() + for item in queries: + query |= item + + return ~Q(query) def filter_queryset(self, request, queryset, view): operations = { diff --git a/tests/integration/test_issues.py b/tests/integration/test_issues.py index 2311f893..f297e230 100644 --- a/tests/integration/test_issues.py +++ b/tests/integration/test_issues.py @@ -476,6 +476,18 @@ def test_api_filters(client, filter_name, collection, expected, exclude_expected assert len(response.data) == exclude_expected +def test_mulitple_exclude_filter_tags(client): + data = create_filter_issues_context() + project = data["project"] + client.login(data["users"][0]) + tags = data["tags"] + + url = "{}?project={}&exclude_tags={},{}".format(reverse('issues-list'), project.id, tags[1], tags[2]) + response = client.get(url) + assert response.status_code == 200 + assert len(response.data) == 4 + + def test_api_filters_data(client): data = create_filter_issues_context() project = data["project"]