1from plain.http import RedirectResponse
2from plain.urls import reverse
3
4from .base import View
5
6
7class RedirectView(View):
8 """Provide a redirect on any GET request."""
9
10 status_code = 302
11 url: str | None = None
12 url_name: str | None = None
13 preserve_query_params = False
14 allow_external = False
15
16 def get_redirect_url(self) -> str:
17 """
18 Return the URL redirect to. Keyword arguments from the URL pattern
19 match generating the redirect request are provided as kwargs to this
20 method.
21 """
22 if self.url:
23 url = self.url % self.url_kwargs
24 elif self.url_name:
25 url = reverse(self.url_name, **self.url_kwargs)
26 else:
27 raise ValueError("RedirectView requires either url or url_name to be set")
28
29 if self.preserve_query_params and self.request.query_string:
30 url = f"{url}?{self.request.query_string}"
31 return url
32
33 def get(self) -> RedirectResponse:
34 url = self.get_redirect_url()
35 return RedirectResponse(
36 url, status_code=self.status_code, allow_external=self.allow_external
37 )
38
39 def head(self) -> RedirectResponse:
40 return self.get()
41
42 def post(self) -> RedirectResponse:
43 return self.get()
44
45 def options(self) -> RedirectResponse:
46 return self.get()
47
48 def delete(self) -> RedirectResponse:
49 return self.get()
50
51 def put(self) -> RedirectResponse:
52 return self.get()
53
54 def patch(self) -> RedirectResponse:
55 return self.get()