This repository has been archived on 2020-09-29. You can view files and clone it, but cannot push or open issues/pull-requests.
flatfilecms/flatfilecms/views/pages.py

74 lines
2.7 KiB
Python

from pyramid.view import (
view_config,
render_view_to_response,
)
from pyramid.renderers import render_to_response
from pyramid.httpexceptions import HTTPNotFound
from pyramid.response import FileResponse
from pyramid.path import (DottedNameResolver, 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):
if 'view' in self.context.page:
r = DottedNameResolver()
if isinstance(self.context.page['view'], str):
response = r.resolve(self.context.page['view'])(self)
if response:
return response
elif isinstance(self.context.page['view'], dict):
for name, options in self.context.page['view'].items():
response = r.resolve(name)(self, options)
if response:
return response
else:
for view in self.context.page['view']:
if isinstance(view, str):
response = r.resolve(view)(self)
if response:
return response
else:
for name, options in view.items():
response = r.resolve(name)(self, options)
if response:
return response
post = self.context.page
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))
return render_to_response(
'{0}.jinja2'.format(post.get('template', 'default')),
post,
request=self.request,
response=self.request.response)
@view_config(context=Jinja2)
def jinja2(self):
return render_to_response(self.context.path, {}, request=self.request)