Plain is headed towards 1.0! Subscribe for development updates →

 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