Skip to content

Commit

Permalink
Add unapproved threads filter
Browse files Browse the repository at this point in the history
  • Loading branch information
rafalp committed Jul 8, 2024
1 parent 02dc476 commit dd550c8
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 5 deletions.
10 changes: 9 additions & 1 deletion misago/threads/filters.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from dataclasses import dataclass

from django.http import HttpRequest
from django.db.models import QuerySet
from django.db.models import Q, QuerySet
from django.utils.translation import pgettext_lazy


Expand Down Expand Up @@ -37,6 +37,14 @@ def __call__(self, queryset: QuerySet) -> QuerySet:
return queryset.none()


class UnapprovedThreadsFilter(ThreadsFilter):
slug: str = "my"
name: str = pgettext_lazy("threads filter", "Unapproved threads")

def __call__(self, queryset: QuerySet) -> QuerySet:
return queryset.filter(Q(is_unapproved=True) | Q(has_unapproved_posts=True))


@dataclass(frozen=True)
class ThreadsFilterChoice:
name: str
Expand Down
46 changes: 45 additions & 1 deletion misago/threads/tests/test_threads_filters.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from unittest.mock import Mock

from ..filters import MyThreadsFilter
from ..filters import MyThreadsFilter, UnapprovedThreadsFilter
from ..models import Thread
from ..test import post_thread

Expand Down Expand Up @@ -71,3 +71,47 @@ def test_my_threads_filter_returns_empty_queryset_if_user_is_anonymous(

filtered_queryset = choice.filter(queryset)
assert list(filtered_queryset) == []


def test_unapproved_threads_filter_returns_unapproved_thread(default_category):
queryset = Thread.objects.all()
thread = post_thread(default_category, is_unapproved=True)

filter = UnapprovedThreadsFilter(Mock())
choice = filter.as_choice("/base/url/", False)

filtered_queryset = choice.filter(queryset)
assert list(filtered_queryset) == [thread]


def test_unapproved_threads_filter_returns_thread_with_unapproved_posts(
default_category,
):
queryset = Thread.objects.all()

thread = post_thread(default_category)
thread.has_unapproved_posts = True
thread.save()

filter = UnapprovedThreadsFilter(Mock())
choice = filter.as_choice("/base/url/", False)

filtered_queryset = choice.filter(queryset)
assert list(filtered_queryset) == [thread]


def test_unapproved_threads_filter_excludes_threads_without_unapproved_status(
default_category,
):
queryset = Thread.objects.all()

thread = post_thread(default_category)
thread.is_unapproved = False
thread.has_unapproved_posts = False
thread.save()

filter = UnapprovedThreadsFilter(Mock())
choice = filter.as_choice("/base/url/", False)

filtered_queryset = choice.filter(queryset)
assert list(filtered_queryset) == []
27 changes: 24 additions & 3 deletions misago/threads/views/list.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,12 @@
ThreadsQuerysetFilter,
)
from ..enums import PrivateThreadUrl, ThreadsListsPolling, ThreadUrl
from ..filters import MyThreadsFilter, ThreadsFilter, ThreadsFilterChoice
from ..filters import (
MyThreadsFilter,
ThreadsFilter,
ThreadsFilterChoice,
UnapprovedThreadsFilter,
)
from ..hooks import (
get_category_threads_filters_hook,
get_category_threads_page_context_hook,
Expand Down Expand Up @@ -273,7 +278,15 @@ def get_threads_filters_action(self, request: HttpRequest) -> list[ThreadsFilter
if request.user.is_anonymous:
return []

return [MyThreadsFilter(request)]
filters = [MyThreadsFilter(request)]

if (
request.user_permissions.is_global_moderator
or request.user_permissions.categories_moderator
):
filters.append(UnapprovedThreadsFilter(request))

return filters

def get_threads_queryset(self, request: HttpRequest):
return get_threads_page_queryset_hook(self.get_threads_queryset_action, request)
Expand Down Expand Up @@ -539,7 +552,15 @@ def get_threads_filters_action(
if request.user.is_anonymous:
return []

return [MyThreadsFilter(request)]
filters = [MyThreadsFilter(request)]

if (
request.user_permissions.is_global_moderator
or category.id in request.user_permissions.categories_moderator
):
filters.append(UnapprovedThreadsFilter(request))

return filters

def get_threads_queryset(self, request: HttpRequest):
return get_category_threads_page_queryset_hook(
Expand Down

0 comments on commit dd550c8

Please sign in to comment.