diff --git a/flatfilecms/models.py b/flatfilecms/models.py index 744a84a..c05c3c1 100644 --- a/flatfilecms/models.py +++ b/flatfilecms/models.py @@ -70,7 +70,7 @@ class Folder(dict): def __init__(self, name, parent, path): self.path = path self.name = name - self.parent = parent + self.__parent__ = parent if parent is not None: self.data_path = parent.data_path for entry in AssetResolver().resolve(path).listdir(): @@ -101,16 +101,17 @@ class Folder(dict): self[path.name] = Folder(path.name, self, asset) def walk(self): - for item in self.values(): - yield item + for name, item in self.items(): + yield name, item if isinstance(item, Folder): - yield from item.walk() + for subname, subitem in item.walk(): + yield f"{name}/{subname}", subitem class Document(object): def __init__(self, name, parent, path): self.name = name - self.parent = parent + self.__parent__ = parent self.path = path self.data_path = parent.data_path diff --git a/flatfilecms/views/__init__.py b/flatfilecms/views/__init__.py index faec57d..a6a2aa7 100644 --- a/flatfilecms/views/__init__.py +++ b/flatfilecms/views/__init__.py @@ -1,5 +1,7 @@ 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) @@ -7,3 +9,14 @@ def redirect(self, url): def set_content_type(self, content_type): self.request.response.content_type = content_type + + +def blog(self, options): + path = options.get('base', '/') + 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)) + self.pages = sorted(postlist, key=lambda t: t[1].page['published']) diff --git a/tests/pages/blogpost1.md b/tests/pages/blog/blogpost1.md similarity index 87% rename from tests/pages/blogpost1.md rename to tests/pages/blog/blogpost1.md index fd9b4a1..528096e 100644 --- a/tests/pages/blogpost1.md +++ b/tests/pages/blog/blogpost1.md @@ -2,6 +2,7 @@ title: Блоговая запись 1 в формате markdown description: Тест записей блогов template: blogpost +published: 2019-02-01 --- Hello World! diff --git a/tests/pages/blogpost2.yaml b/tests/pages/blog/blogpost2.yaml similarity index 82% rename from tests/pages/blogpost2.yaml rename to tests/pages/blog/blogpost2.yaml index 83fbf9b..0589b55 100644 --- a/tests/pages/blogpost2.yaml +++ b/tests/pages/blog/blogpost2.yaml @@ -1,3 +1,4 @@ title: Блоговая запись 2 в формате YAML template: blogpost +published: 2019-02-02 content: Hello World! 2 diff --git a/tests/pages/blog/index.yaml b/tests/pages/blog/index.yaml new file mode 100644 index 0000000..317a750 --- /dev/null +++ b/tests/pages/blog/index.yaml @@ -0,0 +1,4 @@ +view: + - flatfilecms.views.blog: + base: /blog +template: bloglist diff --git a/tests/pages/blog/noblogpost.md b/tests/pages/blog/noblogpost.md new file mode 100644 index 0000000..cd3339a --- /dev/null +++ b/tests/pages/blog/noblogpost.md @@ -0,0 +1,7 @@ +--- +title: Не блоговая запись +description: Тест записей блогов +template: blogpost +--- + +Hello World! diff --git a/tests/test_pages.py b/tests/test_pages.py index 708ea21..bd1d2d2 100644 --- a/tests/test_pages.py +++ b/tests/test_pages.py @@ -60,3 +60,16 @@ def test_views(pages, fake_request, config): view = PagesView(pages['views'], fake_request) assert view.process_yaml().text == \ 'Hello World! View1 View2 View3(a:1, b:2)' + + +def test_blogindex(pages, fake_request, config): + from flatfilecms.views import blog + from flatfilecms.views.pages import PagesView + fake_view_object = PagesView(pages['blog']['index'], fake_request) + blog(fake_view_object, {'base': '/blog'}) + assert hasattr(fake_view_object, 'pages') + 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' +