diff --git a/core/tests/test_user.py b/core/tests/test_user.py index b15c7bbe..e19c98f4 100644 --- a/core/tests/test_user.py +++ b/core/tests/test_user.py @@ -318,3 +318,20 @@ def test_displayed_other_user_tabs(user_factory, expected_tabs: list[str]): view.object = subscriber_user.make() # user whose page is being seen tabs = [tab["slug"] for tab in view.get_list_of_tabs()] assert tabs == expected_tabs + + +@pytest.mark.django_db +class TestRedirectMe: + @pytest.mark.parametrize( + "route", ["core:user_profile", "core:user_account", "core:user_edit"] + ) + def test_redirect(self, client: Client, route: str): + user = subscriber_user.make() + client.force_login(user) + target_url = reverse(route, kwargs={"user_id": user.id}) + src_url = target_url.replace(str(user.id), "me") + assertRedirects(client.get(src_url), target_url) + + def test_anonymous_user(self, client: Client): + url = reverse("core:user_me_redirect") + assertRedirects(client.get(url), reverse("core:login", query={"next": url})) diff --git a/core/urls.py b/core/urls.py index 23fa9f11..8f8d6b58 100644 --- a/core/urls.py +++ b/core/urls.py @@ -21,7 +21,6 @@ # Place - Suite 330, Boston, MA 02111-1307, USA. # # - from django.urls import path, re_path, register_converter from django.views.generic import RedirectView @@ -68,6 +67,7 @@ from core.views import ( UserGodfathersTreeView, UserGodfathersView, UserListView, + UserMeRedirect, UserMiniView, UserPreferencesView, UserStatsView, @@ -141,6 +141,12 @@ urlpatterns = [ ), # User views path("user/", UserListView.as_view(), name="user_list"), + path( + "user/me//", + UserMeRedirect.as_view(), + name="user_me_redirect_with_path", + ), + path("user/me/", UserMeRedirect.as_view(), name="user_me_redirect"), path("user//mini/", UserMiniView.as_view(), name="user_profile_mini"), path("user//", UserView.as_view(), name="user_profile"), path( diff --git a/core/views/user.py b/core/views/user.py index 93b64d3b..ac5869a8 100644 --- a/core/views/user.py +++ b/core/views/user.py @@ -48,6 +48,7 @@ from django.views.generic import ( DeleteView, DetailView, ListView, + RedirectView, TemplateView, ) from django.views.generic.dates import MonthMixin, YearMixin @@ -182,6 +183,13 @@ class UserCreationView(FormView): return super().form_valid(form) +class UserMeRedirect(LoginRequiredMixin, RedirectView): + def get_redirect_url(self, *args, **kwargs): + if remaining := kwargs.get("remaining_path"): + return f"/user/{self.request.user.id}/{remaining}/" + return f"/user/{self.request.user.id}/" + + class UserTabsMixin(TabedViewMixin): def get_tabs_title(self): return self.object.get_display_name()