import yaml from pyramid.renderers import render_to_response from pyramid.path import AssetResolver from pathlib import PurePath from flatfilecms.models import LoaderFactory from pyramid.httpexceptions import HTTPFound from pyramid.traversal import (find_root, find_resource) from flatfilecms.models import (YAML, Markdown) def redirect(self, url): return HTTPFound(location=url) def set_content_type(self, content_type): self.request.response.content_type = content_type def blog(self, options={}): path = options.get('base', '') format = options.get('format', 'blogposts') root = find_root(self.context) tree = find_resource(root, path) postlist = [] for name, item in tree.walk(): if isinstance(item, (YAML, Markdown)) and 'published' in item.page: postlist.append((f"{path}/{name}", item)) post = self.context.page.copy() post['pages'] = sorted( postlist, key=lambda t: t[1].page['published'], reverse=True) if 'menu' not in post: post['menu'] = yaml.load( AssetResolver().resolve( str(PurePath(self.context.data_path) / 'menu/default.yaml')).stream(), LoaderFactory(self.context.data_path)) if format == 'atom': set_content_type(self, 'application/atom+xml') return render_to_response( '{0}.jinja2'.format(post.get('template', format)), post, request=self.request, response=self.request.response)