1fromplain.assets.viewsimportAssetView 2fromplain.httpimportHttp404,ResponsePermanentRedirect,ResponseRedirect 3fromplain.utils.functionalimportcached_property 4fromplain.viewsimportTemplateView,View 5 6from.exceptionsimportPageNotFoundError,RedirectPageError 7from.registryimportpages_registry 8 910classPageViewMixin:11@cached_property12defpage(self):13url_name=self.request.resolver_match.url_name1415try:16returnpages_registry.get_page(url_name)17exceptPageNotFoundError:18raiseHttp404()192021classPageView(PageViewMixin,TemplateView):22template_name="page.html"2324defget_template_names(self)->list[str]:25"""26 Allow for more specific user templates like27 markdown.html or html.html28 """29return[self.page.get_template_name()]+super().get_template_names()3031defget_template_context(self):32context=super().get_template_context()33context["page"]=self.page34self.page.set_template_context(context)# Pass the standard context through35returncontext363738classPageRedirectView(PageViewMixin,View):39defget(self):40url=self.page.vars.get("url")4142ifnoturl:43raiseRedirectPageError("Redirect page is missing a url")4445ifself.page.vars.get("temporary",True):46returnResponseRedirect(url)47else:48returnResponsePermanentRedirect(url)495051classPageAssetView(PageViewMixin,AssetView):52defget_url_path(self):53returnself.page.get_url_path()5455defget_asset_path(self,path):56returnself.page.absolute_path5758defget_debug_asset_path(self,path):59returnself.page.absolute_path