from pyramid.view import ( view_config, render_view_to_response, ) from pyramid.renderers import render_to_response from pyramid.httpexceptions import (HTTPFound, HTTPNotFound) from pyramid.response import FileResponse from pyramid.path import AssetResolver from pathlib import PurePath import yaml from flatfilecms.models import ( Folder, Document, IMarkdown, Jinja2, LoaderFactory) class PagesView: def __init__(self, context, request): self.context = context self.request = request @view_config(context=Folder) def folder(self): if 'index' not in self.context: raise HTTPNotFound return render_view_to_response(self.context['index'], self.request) @view_config(context=Document) def document(self): return FileResponse( AssetResolver().resolve(self.context.path).abspath(), request=self.request) @view_config(context=IMarkdown) def process_yaml(self): post = self.context.page if 'redirect' in post: return HTTPFound(location=post['redirect']) 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)) response = render_to_response( '{0}.jinja2'.format( post.get('template', 'default')), post, request=self.request ) if 'content_type' in post: response.content_type = post['content_type'] return response @view_config(context=Jinja2) def jinja2(self): return render_to_response( self.context.path, {}, request=self.request )