diff --git a/src/wuttaweb/views/master.py b/src/wuttaweb/views/master.py index ef9473d..6876603 100644 --- a/src/wuttaweb/views/master.py +++ b/src/wuttaweb/views/master.py @@ -1777,14 +1777,14 @@ class MasterView(View): context = self.get_template_context(context) # first try the template path most specific to this view - template_prefix = self.get_template_prefix() - mako_path = f'{template_prefix}/{template}.mako' + page_templates = self.get_page_templates(template) + mako_path = page_templates[0] try: return render_to_response(mako_path, context, request=self.request) except IOError: # failing that, try one or more fallback templates - for fallback in self.get_fallback_templates(template): + for fallback in page_templates[1:]: try: return render_to_response(fallback, context, request=self.request) except IOError: @@ -1815,21 +1815,51 @@ class MasterView(View): """ return context + def get_page_templates(self, template): + """ + Returns a list of all templates which can be attempted, to + render the current page. This is called by + :meth:`render_to_response()`. + + The list should be in order of preference, e.g. the first + entry will be the most "specific" template, with subsequent + entries becoming more generic. + + In practice this method defines the first entry but calls + :meth:`get_fallback_templates()` for the rest. + + :param template: Base name for a template (without prefix), e.g. + ``'view'``. + + :returns: List of template paths to be tried, based on the + specified template. For instance if ``template`` is + ``'view'`` this will (by default) return:: + + [ + '/widgets/view.mako', + '/master/view.mako', + ] + + """ + template_prefix = self.get_template_prefix() + page_templates = [f'{template_prefix}/{template}.mako'] + page_templates.extend(self.get_fallback_templates(template)) + return page_templates + def get_fallback_templates(self, template): """ Returns a list of "fallback" template paths which may be - attempted for rendering a view. This is used within - :meth:`render_to_response()` if the "first guess" template - file was not found. + attempted for rendering the current page. See also + :meth:`get_page_templates()`. :param template: Base name for a template (without prefix), e.g. - ``'custom'``. + ``'view'``. - :returns: List of full template paths to be tried, based on - the specified template. For instance if ``template`` is - ``'custom'`` this will (by default) return:: + :returns: List of template paths to be tried, based on the + specified template. For instance if ``template`` is + ``'view'`` this will (by default) return:: - ['/master/custom.mako'] + ['/master/view.mako'] """ return [f'/master/{template}.mako']