Skip to content

Commit 79e7f8a

Browse files
committed
WIP redo redirects
1 parent f328ab9 commit 79e7f8a

File tree

19 files changed

+223
-263
lines changed

19 files changed

+223
-263
lines changed

misago/categories/tests/test_redirect_to_post.py

Whitespace-only changes.

misago/notifications/registry.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from django.http import HttpRequest
55
from django.utils.translation import pgettext
66

7-
from ..posts.views import redirect_to_post
7+
from ..posts.redirect import redirect_to_post
88
from .enums import NotificationVerb
99
from .exceptions import NotificationVerbError
1010

misago/posts/hooks/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
from .redirect_to_post import redirect_to_post_hook
22

3-
__all__ = ["redirect_to_post_hook"]
3+
__all__ = ["redirect_to_post_hook"]

misago/posts/redirect.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,33 @@
1-
from ..categories.tree
1+
from django.http import HttpRequest, HttpResponse
22

3+
from ..categories.treeid import get_category_tree_id
4+
from .models import Post
35

4-
def redirect_to_post
6+
7+
class RedirectView:
8+
def __call__(
9+
self, request: HttpRequest, *, thread_id: int, slug: str, post: int
10+
) -> HttpResponse: ...
11+
12+
13+
class PostRedirect:
14+
views: dict[int, RedirectView]
15+
16+
def __init__(self):
17+
self.views = {}
18+
19+
def view(self, tree_id: int, view: RedirectView):
20+
self.views[tree_id] = view
21+
22+
def __call__(self, request: HttpRequest, post: Post) -> HttpResponse:
23+
tree_id = get_category_tree_id(post.category_id)
24+
25+
try:
26+
view = self.views[tree_id]
27+
except KeyError as error:
28+
raise ValueError(f"Unknown 'Category' type: {tree_id}") from error
29+
30+
return view(request, id=post.thread_id, slug="", post=post.id)
31+
32+
33+
redirect_to_post = PostRedirect()

misago/posts/tests/test_post_paginator.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
from ..paginator import PostPaginator
22

33

4-
def test_post_paginator_counts_pages_without_orphans(
5-
thread_reply_factory, thread
6-
):
4+
def test_post_paginator_counts_pages_without_orphans(thread_reply_factory, thread):
75
paginator = PostPaginator(thread.post_set, 5, 0)
86
assert paginator.count == 1
97
assert paginator.num_pages == 1
@@ -42,9 +40,7 @@ def test_post_paginator_counts_pages_without_orphans(
4240
assert paginator.num_pages == 3
4341

4442

45-
def test_post_paginator_counts_pages_with_orphans(
46-
thread_reply_factory, thread
47-
):
43+
def test_post_paginator_counts_pages_with_orphans(thread_reply_factory, thread):
4844
paginator = PostPaginator(thread.post_set, 5, 2)
4945
assert paginator.count == 1
5046
assert paginator.num_pages == 1
@@ -245,9 +241,7 @@ def test_post_paginator_without_orphans_calculates_item_page(
245241
assert paginator.num_pages == 3
246242

247243

248-
def test_post_paginator_with_orphans_calculates_item_page(
249-
thread_reply_factory, thread
250-
):
244+
def test_post_paginator_with_orphans_calculates_item_page(thread_reply_factory, thread):
251245
# First item page
252246
paginator = PostPaginator(thread.post_set, 5, 2)
253247
assert paginator.get_item_page(0) == 1

misago/posts/urls.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from django.urls import path
22

3-
from .views import PostRedirectView
3+
from .views.redirect import PostView
44

55

66
urlpatterns = [
77
path(
88
"post/<int:id>/",
9-
PostRedirectView.as_view(),
9+
PostView.as_view(),
1010
name="post",
1111
),
12-
]
12+
]

misago/posts/views.py

Lines changed: 0 additions & 58 deletions
This file was deleted.

misago/posts/views/redirect.py

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,10 @@
55
from django.utils.translation import pgettext
66
from django.views import View
77

8-
from ...categories.enums import CategoryTree
98
from ...posts.models import Post
109
from ...readtracker.readtime import get_default_read_time
11-
from ..hooks import get_redirect_to_post_response_hook
12-
from ..models import Thread
13-
from .generic import PrivateThreadView, ThreadView
10+
from ...threads.models import Thread
11+
from ..redirect import redirect_to_post
1412

1513

1614
class RedirectView(View):
@@ -80,49 +78,30 @@ class UnapprovedPostRedirectView(RedirectView):
8078
def raise_permission_denied_error(self):
8179
raise PermissionDenied(
8280
pgettext(
83-
"unaproved post redirect",
81+
"unapproved post redirect",
8482
"You must be a moderator to view unapproved posts.",
8583
)
8684
)
8785

8886

89-
def _get_redirect_to_post_response_action(
90-
request: HttpRequest, post: Post
91-
) -> HttpResponse:
92-
if post.category.tree_id == CategoryTree.THREADS:
93-
return thread_post_redirect(request, post.thread_id, "t", post=post.id)
94-
95-
if post.category.tree_id == CategoryTree.PRIVATE_THREADS:
96-
return private_thread_post_redirect(request, post.thread_id, "t", post=post.id)
97-
98-
raise Http404()
99-
100-
101-
class GetPostRedirectView(RedirectView):
87+
class PostRedirectView(RedirectView):
10288
def get_post(
10389
self, request: HttpRequest, thread: Thread, queryset: QuerySet, kwargs: dict
10490
) -> Post | None:
10591
return get_object_or_404(queryset, id=kwargs["post"])
10692

10793

108-
class PostRedirectView(View):
94+
class PostView(View):
10995
def get(self, request: HttpRequest, id: int) -> HttpResponse:
11096
return self.real_dispatch(request, id)
11197

11298
def post(self, request: HttpRequest, id: int) -> HttpResponse:
11399
return self.real_dispatch(request, id)
114100

115101
def real_dispatch(self, request: HttpRequest, id: int) -> HttpResponse:
116-
queryset = Post.objects.select_related("category")
117-
post = get_object_or_404(queryset, id=id)
118-
return get_redirect_to_post_response(request, post)
119-
120-
121-
def get_redirect_to_post_response(request: HttpRequest, post: Post) -> HttpResponse:
122-
try:
123-
return get_redirect_to_post_response_hook(
124-
_get_redirect_to_post_response_action, request, post
125-
)
126-
except PermissionDenied:
127-
raise Http404()
102+
try:
103+
post = Post.objects.get(id=id)
104+
except Post.DoesNotExist as error:
105+
raise Http404("Post not found") from error
128106

107+
return redirect_to_post(request, post)

misago/privatethreads/redirect.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from django.http import HttpRequest, HttpResponse
2+
from django.shortcuts import redirect
3+
from django.urls import reverse
4+
5+
from ..permissions.privatethreads import filter_private_thread_posts_queryset
6+
from ..posts.models import Post
7+
from ..posts.paginator import PostPaginator
8+
from ..threads.models import Thread
9+
10+
11+
def redirect_to_private_thread_post(
12+
request: HttpRequest, thread: Thread, post: Post
13+
) -> HttpResponse:
14+
queryset = filter_private_thread_posts_queryset(
15+
request.user_permissions, thread, thread.post_set.order_by("id")
16+
)
17+
paginator = PostPaginator(
18+
queryset,
19+
request.settings.posts_per_page,
20+
request.settings.posts_per_page_orphans,
21+
)
22+
23+
offset = queryset.filter(id__lt=post.id).count()
24+
page = paginator.get_item_page(offset)
25+
26+
url_kwargs = {"id": thread.id, "slug": thread.slug}
27+
if page > 1:
28+
url_kwargs["page"] = page
29+
30+
url = reverse("misago:private-thread", kwargs=url_kwargs) + f"#post-{post.id}"
31+
32+
return redirect(url)

misago/privatethreads/tests/test_private_thread_members_add_view.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99

1010
@pytest.fixture
1111
def mock_notify_on_new_private_thread(mocker):
12-
return mocker.patch("misago.privatethreads.views.members.notify_on_new_private_thread")
12+
return mocker.patch(
13+
"misago.privatethreads.views.members.notify_on_new_private_thread"
14+
)
1315

1416

1517
def test_private_thread_members_add_view_renders_form(user_client, user_private_thread):

0 commit comments

Comments
 (0)