jazzband / django-invitations

Generic invitations app for Django
GNU General Public License v3.0
559 stars 166 forks source link

Feature request: pass query params like ?next=/some/page through the flow #231

Closed elnygren closed 9 months ago

elnygren commented 1 year ago

Django already has a widespread convention of using ?next=/foo/ through Login and Signup (eg. see django-allauth). Might be a nice idea to support passing query parameters through the flow and keeping them when redirecting user to signup.

Example implementation (only for ?next)

from django.shortcuts import redirect
from django.urls import reverse
from invitations.views import AcceptInvite

class CustomAcceptInvite(AcceptInvite):
    def post(self, *args, **kwargs):
        r = super().post(*args, **kwargs)
        _next = self.request.GET.get("next")

        if r.url == reverse(self.get_signup_redirect()) and _next:
            return redirect(f"{r.url}?next={_next}")

        return r
@pytest.mark.django_db
def test_custom_accept_invitations(client):
    i = CustomInvitation.create(
        email="test@test.com",
    )
    req_get = RequestFactory().get("/test-invitations/{i.key}/?next=/foo/bar")
    req_get.session = {}

    req_post = RequestFactory().post("/test-invitations/{i.key}/?next=/foo/bar")
    req_post.session = {}

    i.send_invitation(req_get)  # so Invitation.sent is set

    view = CustomAcceptInvite()
    view.setup(req_get, key=i.key)

    res_get = view.get(req_get)
    res_post = view.post(req_get)

    assert res_get.status_code == 302
    assert res_get.url == "/accounts/signup/?next=/foo/bar"

    assert res_post.status_code == 302
    assert res_post.url == "/accounts/signup/?next=/foo/bar"