diff --git a/froide/foirequest/documents.py b/froide/foirequest/documents.py index 6274c98e0..0ac98fd1c 100644 --- a/froide/foirequest/documents.py +++ b/froide/foirequest/documents.py @@ -50,6 +50,8 @@ class FoiRequestDocument(Document): team = fields.IntegerField(attr="team_id") public = fields.BooleanField() + project = fields.IntegerField(attr="project_id") + project_order = fields.IntegerField() class Django: model = FoiRequest diff --git a/froide/foirequest/filters.py b/froide/foirequest/filters.py index bf95cd77b..8d8ad0ce0 100644 --- a/froide/foirequest/filters.py +++ b/froide/foirequest/filters.py @@ -246,6 +246,10 @@ class BaseFoiRequestFilterSet(BaseSearchFilterSet): widget=BootstrapSelect, method="add_sort", ) + hide_project_duplicates = django_filters.BooleanFilter( + label=_("hide project duplicated"), + method="filter_hide_project_duplicates", + ) class Meta: model = FoiRequest @@ -326,6 +330,16 @@ def add_sort(self, qs, name, value): return qs.add_sort("%s_message" % value) return qs + def filter_hide_project_duplicates(self, qs, name, value): + if value: + return self.apply_filter( + qs, + name, + Q("bool", must_not={"exists": {"field": "project"}}) + | Q("term", project_order=0), + ) + return qs + class FoiRequestFilterSet(BaseFoiRequestFilterSet): pass diff --git a/froide/foirequest/models/request.py b/froide/foirequest/models/request.py index b278a7e98..b4fa04873 100644 --- a/froide/foirequest/models/request.py +++ b/froide/foirequest/models/request.py @@ -110,15 +110,6 @@ def get_queryset(self): def by_last_update(self): return self.get_queryset().order_by("-last_message") - def for_list_view(self): - return ( - self.by_last_update() - .filter( - same_as__isnull=True, - ) - .filter(models.Q(project__isnull=True) | models.Q(project_order=0)) - ) - def get_resolution_count_by_public_body(self, obj): from ..filters import REVERSE_FILTER_DICT @@ -633,12 +624,7 @@ def is_public(self): return self.visibility == self.VISIBILITY.VISIBLE_TO_PUBLIC def in_public_search_index(self): - return ( - self.is_public() - and self.is_foi - and self.same_as_id is None - and (self.project_id is None or self.project_order == 0) - ) + return self.is_public() and self.is_foi and self.same_as_id is None def get_redaction_regexes(self): from ..utils import get_foi_mail_domains diff --git a/froide/foirequest/views/list_requests.py b/froide/foirequest/views/list_requests.py index bad7bdac7..756bed0cb 100644 --- a/froide/foirequest/views/list_requests.py +++ b/froide/foirequest/views/list_requests.py @@ -5,6 +5,8 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ +from elasticsearch_dsl.query import Q + from froide.helper.search.views import BaseSearchView from froide.publicbody.models import Jurisdiction @@ -38,7 +40,14 @@ class BaseListRequestView(BaseSearchView): filterset = FoiRequestFilterSet def get_base_search(self): - return super().get_base_search().filter("term", public=True) + base_search = super().get_base_search().filter("term", public=True) + # TODO: move this into facet so it is not removed if other filter are applied, e.g. through the filter-dropdowns + if not self.request.GET.get("show_project_requests"): + base_search = base_search.filter( + Q("bool", must_not={"exists": {"field": "project"}}) + | Q("term", project_order=0) + ) + return base_search class ListRequestView(BaseListRequestView):