1from plain.assets.views import AssetView
2from plain.http import Http404, ResponsePermanentRedirect, ResponseRedirect
3from plain.utils.functional import cached_property
4from plain.views import TemplateView, View
5
6from .exceptions import PageNotFoundError, RedirectPageError
7from .registry import pages_registry
8
9
10class PageViewMixin:
11 @cached_property
12 def page(self):
13 url_name = self.request.resolver_match.url_name
14
15 try:
16 return pages_registry.get_page(url_name)
17 except PageNotFoundError:
18 raise Http404()
19
20
21class PageView(PageViewMixin, TemplateView):
22 template_name = "page.html"
23
24 def get_template_names(self) -> list[str]:
25 """
26 Allow for more specific user templates like
27 markdown.html or html.html
28 """
29 return [self.page.get_template_name()] + super().get_template_names()
30
31 def get_template_context(self):
32 context = super().get_template_context()
33 context["page"] = self.page
34 self.page.set_template_context(context) # Pass the standard context through
35 return context
36
37
38class PageRedirectView(PageViewMixin, View):
39 def get(self):
40 url = self.page.vars.get("url")
41
42 if not url:
43 raise RedirectPageError("Redirect page is missing a url")
44
45 if self.page.vars.get("temporary", True):
46 return ResponseRedirect(url)
47 else:
48 return ResponsePermanentRedirect(url)
49
50
51class PageAssetView(PageViewMixin, AssetView):
52 def get_url_path(self):
53 return self.page.get_url_path()
54
55 def get_asset_path(self, path):
56 return self.page.absolute_path
57
58 def get_debug_asset_path(self, path):
59 return self.page.absolute_path