1import logging
2
3from plain.http import (
4 ResponseGone,
5 ResponsePermanentRedirect,
6 ResponseRedirect,
7)
8from plain.urls import reverse
9
10from .base import View
11
12logger = logging.getLogger("plain.request")
13
14
15class RedirectView(View):
16 """Provide a redirect on any GET request."""
17
18 permanent = False
19 url: str | None = None
20 pattern_name: str | None = None
21 query_string = False
22
23 def __init__(self, url=None, permanent=None):
24 # Allow url and permanent to be set in RedirectView.as_view(url="...", permanent=True)
25 self.url = url or self.url
26 self.permanent = permanent if permanent is not None else self.permanent
27
28 def get_redirect_url(self):
29 """
30 Return the URL redirect to. Keyword arguments from the URL pattern
31 match generating the redirect request are provided as kwargs to this
32 method.
33 """
34 if self.url:
35 url = self.url % self.url_kwargs
36 elif self.pattern_name:
37 url = reverse(self.pattern_name, *self.url_args, **self.url_kwargs)
38 else:
39 return None
40
41 args = self.request.meta.get("QUERY_STRING", "")
42 if args and self.query_string:
43 url = f"{url}?{args}"
44 return url
45
46 def get(self):
47 url = self.get_redirect_url()
48 if url:
49 if self.permanent:
50 return ResponsePermanentRedirect(url)
51 else:
52 return ResponseRedirect(url)
53 else:
54 logger.warning(
55 "Gone: %s",
56 self.request.path,
57 extra={"status_code": 410, "request": self.request},
58 )
59 return ResponseGone()
60
61 def head(self):
62 return self.get()
63
64 def post(self):
65 return self.get()
66
67 def options(self):
68 return self.get()
69
70 def delete(self):
71 return self.get()
72
73 def put(self):
74 return self.get()
75
76 def patch(self):
77 return self.get()