diff --git a/core/views/__init__.py b/core/views/__init__.py index 84cffaaf..4b690c4c 100644 --- a/core/views/__init__.py +++ b/core/views/__init__.py @@ -201,29 +201,6 @@ class CanViewMixin(View): return super(CanViewMixin, self).dispatch(request, *arg, **kwargs) -class CanViewSearchMixin(View): - """ - This view removes all forbidden content from a SearchQuerySet - """ - - def dispatch(self, request, *arg, **kwargs): - - queryset = self.get_queryset() - excluded = [ - o.object.id for o in queryset if not can_view(o.object, request.user) - ] - - self._queryset = queryset - - def get_qs(self2): - q = self2._queryset.exclude(id__in=excluded) - resp = [r.object for r in q] - return resp - - self.get_queryset = types.MethodType(get_qs, self) - return super(CanViewSearchMixin, self).dispatch(request, *arg, **kwargs) - - class FormerSubscriberMixin(View): """ This view check if the user was at least an old subscriber diff --git a/forum/models.py b/forum/models.py index c52f56db..4ef955ba 100644 --- a/forum/models.py +++ b/forum/models.py @@ -331,9 +331,9 @@ class ForumMessage(models.Model): return user.can_edit(self.topic.forum) def can_be_viewed_by(self, user): - return not self._deleted and self.topic.can_be_viewed_by( - user - ) # Useful in search engine + # No need to check the real rights since it's already done by the Topic view + # and it impacts performances too much + return not self._deleted def can_be_moderated_by(self, user): return self.topic.forum.is_owned_by(user) or user.id == self.author.id diff --git a/forum/views.py b/forum/views.py index 61d87fe8..65b09e45 100644 --- a/forum/views.py +++ b/forum/views.py @@ -42,19 +42,26 @@ from core.views import ( CanEditMixin, CanEditPropMixin, CanCreateMixin, - CanViewSearchMixin, + can_view, ) from core.views.forms import MarkdownInput from forum.models import Forum, ForumMessage, ForumTopic, ForumMessageMeta from haystack.query import SearchQuerySet -class ForumSearchView(CanViewSearchMixin, ListView): +class ForumSearchView(ListView): template_name = "forum/search.jinja" def get_queryset(self): query = self.request.GET.get("query", "") - return SearchQuerySet().models(ForumMessage).autocomplete(auto=query) + queryset = SearchQuerySet().models(ForumMessage).autocomplete(auto=query) + excluded = [ + o.object.id + for o in queryset + if not can_view(o.object.topic, self.request.user) + ] + queryset.exclude(id__in=excluded) + return [r.object for r in queryset] class ForumMainView(ListView):