Шаблон генерации списка записей блога. [closes #3]
parent
e19e65f2e2
commit
07c77500e4
|
@ -1,7 +1,20 @@
|
||||||
{% extends "layout.jinja2" %}
|
{% extends "layout.jinja2" %}
|
||||||
{% if header_class is not defined %}{% set header_class="light" %}{%endif%}
|
{% if header_class is not defined %}{% set header_class="light" %}{%endif%}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% for item in request.root.walk()|selectattr("page") if item.page[] %}
|
<div class="card-columns">
|
||||||
{{ item }}
|
{% for item in pages %}
|
||||||
|
<div class="card">
|
||||||
|
{%- if item[1].page['image'] %}<img src="{{item[1].page['image']}}" class="card-img-top">{% endif %}
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="card-title">{{item[1].page['title']}}</h2>
|
||||||
|
{%- if item[1].page['description'] %}<p class="card-text">{{item[1].page['description']}}</p>{% endif %}
|
||||||
|
<a href="{{item[0]}}" class="btn btn-primary">Читать</a>
|
||||||
|
</div>
|
||||||
|
<div class="card-footer"><small class=text-muted">
|
||||||
|
Опубликовано {{item[1].page['published']}}
|
||||||
|
{%- if item[1].page['updated'] %}, обновлено {{item[1].page['updated']}}{% endif %}
|
||||||
|
</small></div>
|
||||||
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
|
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.httpexceptions import HTTPFound
|
||||||
from pyramid.traversal import (find_root, find_resource)
|
from pyramid.traversal import (find_root, find_resource)
|
||||||
|
|
||||||
from flatfilecms.models import (YAML, Markdown)
|
from flatfilecms.models import (YAML, Markdown)
|
||||||
|
|
||||||
|
|
||||||
def redirect(self, url):
|
def redirect(self, url):
|
||||||
return HTTPFound(location=url)
|
return HTTPFound(location=url)
|
||||||
|
|
||||||
|
@ -11,12 +17,29 @@ def set_content_type(self, content_type):
|
||||||
self.request.response.content_type = content_type
|
self.request.response.content_type = content_type
|
||||||
|
|
||||||
|
|
||||||
def blog(self, options):
|
def blog(self, options={}):
|
||||||
path = options.get('base', '/')
|
path = options.get('base', '')
|
||||||
root = find_root(self.context)
|
root = find_root(self.context)
|
||||||
tree = find_resource(root, path)
|
tree = find_resource(root, path)
|
||||||
postlist = []
|
postlist = []
|
||||||
for name, item in tree.walk():
|
for name, item in tree.walk():
|
||||||
if isinstance(item, (YAML, Markdown)) and 'published' in item.page:
|
if isinstance(item, (YAML, Markdown)) and 'published' in item.page:
|
||||||
postlist.append((f"{path}/{name}", item))
|
postlist.append((f"{path}/{name}", item))
|
||||||
self.pages = sorted(postlist, key=lambda t: t[1].page['published'])
|
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))
|
||||||
|
return render_to_response(
|
||||||
|
'{0}.jinja2'.format(
|
||||||
|
post.get('template', 'blogposts')),
|
||||||
|
post,
|
||||||
|
request=self.request,
|
||||||
|
response=self.request.response
|
||||||
|
)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
{% for item in pages %}{{item[0]}} {% endfor %}
|
|
@ -26,6 +26,8 @@ def config(current_directory):
|
||||||
from pyramid.testing import testConfig
|
from pyramid.testing import testConfig
|
||||||
with testConfig() as config:
|
with testConfig() as config:
|
||||||
config.include('pyramid_jinja2')
|
config.include('pyramid_jinja2')
|
||||||
|
config.add_jinja2_search_path('tests:templates')
|
||||||
|
config.add_jinja2_search_path('flatfilecms:templates')
|
||||||
yield config
|
yield config
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,10 +68,5 @@ def test_blogindex(pages, fake_request, config):
|
||||||
from flatfilecms.views import blog
|
from flatfilecms.views import blog
|
||||||
from flatfilecms.views.pages import PagesView
|
from flatfilecms.views.pages import PagesView
|
||||||
fake_view_object = PagesView(pages['blog']['index'], fake_request)
|
fake_view_object = PagesView(pages['blog']['index'], fake_request)
|
||||||
blog(fake_view_object, {'base': '/blog'})
|
response = blog(fake_view_object, {'base': '/blog'})
|
||||||
assert hasattr(fake_view_object, 'pages')
|
assert response.text == '/blog/blogpost2 /blog/blogpost1 '
|
||||||
assert isinstance(fake_view_object.pages, list)
|
|
||||||
assert len(fake_view_object.pages) == 2
|
|
||||||
assert fake_view_object.pages[0][0] == '/blog/blogpost1' and \
|
|
||||||
fake_view_object.pages[1][0] == '/blog/blogpost2'
|
|
||||||
|
|
||||||
|
|
Reference in New Issue