Coverage for /Users/davegaeddert/Developer/dropseed/plain/plain/plain/views/redirect.py: 45%
40 statements
« prev ^ index » next coverage.py v7.6.9, created at 2024-12-23 11:16 -0600
« prev ^ index » next coverage.py v7.6.9, created at 2024-12-23 11:16 -0600
1import logging
3from plain.http import (
4 ResponseGone,
5 ResponsePermanentRedirect,
6 ResponseRedirect,
7)
8from plain.urls import reverse
10from .base import View
12logger = logging.getLogger("plain.request")
15class RedirectView(View):
16 """Provide a redirect on any GET request."""
18 permanent = False
19 url: str | None = None
20 pattern_name: str | None = None
21 query_string = False
23 def get_redirect_url(self):
24 """
25 Return the URL redirect to. Keyword arguments from the URL pattern
26 match generating the redirect request are provided as kwargs to this
27 method.
28 """
29 if self.url:
30 url = self.url % self.url_kwargs
31 elif self.pattern_name:
32 url = reverse(self.pattern_name, args=self.url_args, kwargs=self.url_kwargs)
33 else:
34 return None
36 args = self.request.META.get("QUERY_STRING", "")
37 if args and self.query_string:
38 url = f"{url}?{args}"
39 return url
41 def get(self):
42 url = self.get_redirect_url()
43 if url:
44 if self.permanent:
45 return ResponsePermanentRedirect(url)
46 else:
47 return ResponseRedirect(url)
48 else:
49 logger.warning(
50 "Gone: %s",
51 self.request.path,
52 extra={"status_code": 410, "request": self.request},
53 )
54 return ResponseGone()
56 def head(self):
57 return self.get()
59 def post(self):
60 return self.get()
62 def options(self):
63 return self.get()
65 def delete(self):
66 return self.get()
68 def put(self):
69 return self.get()
71 def patch(self):
72 return self.get()