From c467375bec8edf35de86f9cc86825b6ec1f9669d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D1=82=D0=BE=D0=BD=20=D0=9A=D0=B0=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D0=B2?= Date: Wed, 15 May 2019 18:35:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B2=D0=B8=D0=B4=20sitemap=20[closes=20#11],=20[clos?= =?UTF-8?q?es=20#30]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flatfilecms/models.py | 2 ++ flatfilecms/templates/sitemap.jinja2 | 6 +++--- flatfilecms/views/__init__.py | 20 +++++++++++++++++++- tests/pages/sitemap.xml.yaml | 6 ++++++ tests/test_pages.py | 21 +++++++++++++++++++++ 5 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 tests/pages/sitemap.xml.yaml diff --git a/flatfilecms/models.py b/flatfilecms/models.py index ba8b69d..e8412d2 100644 --- a/flatfilecms/models.py +++ b/flatfilecms/models.py @@ -111,6 +111,8 @@ class Folder(dict): def walk(self): for name, item in self.items(): + if name == 'index': + name = '' yield name, item if isinstance(item, Folder): for subname, subitem in item.walk(): diff --git a/flatfilecms/templates/sitemap.jinja2 b/flatfilecms/templates/sitemap.jinja2 index 295bc38..26510da 100644 --- a/flatfilecms/templates/sitemap.jinja2 +++ b/flatfilecms/templates/sitemap.jinja2 @@ -1,8 +1,8 @@ - {%- for item in request.root.structure() %}{% if item != '/sitemap.xml' and item not in data.ignore %} + {%- for item in pages %} - {{data.base_url}}{{item}} + {{data.base_url}}/{{item}} - {%- endif %}{%- endfor %} + {%- endfor %} diff --git a/flatfilecms/views/__init__.py b/flatfilecms/views/__init__.py index d671002..53124d5 100644 --- a/flatfilecms/views/__init__.py +++ b/flatfilecms/views/__init__.py @@ -1,3 +1,4 @@ +import re import yaml from pyramid.renderers import render_to_response from pyramid.path import AssetResolver @@ -6,7 +7,7 @@ from flatfilecms.models import LoaderFactory from pyramid.httpexceptions import HTTPFound from pyramid.traversal import (find_root, find_resource) -from flatfilecms.models import (YAML, Markdown) +from flatfilecms.models import (Folder, YAML, Markdown) def redirect(self, url): @@ -42,3 +43,20 @@ def blog(self, options={}): post, request=self.request, response=self.request.response) + + +def sitemap(self, options={}): + ignore = [re.compile(i) for i in options.get('ignore', [])] + root = find_root(self.context) + post = self.context.page.copy() + post['pages'] = [] + for name, item in root.walk(): + if not isinstance(item, Folder) and name != 'sitemap.xml' and not next( + (True for r in ignore if r.match(name)), False): + post['pages'].append(name) + set_content_type(self, 'text/xml') + return render_to_response( + '{0}.jinja2'.format(post.get('template', 'sitemap')), + post, + request=self.request, + response=self.request.response) diff --git a/tests/pages/sitemap.xml.yaml b/tests/pages/sitemap.xml.yaml new file mode 100644 index 0000000..d830aed --- /dev/null +++ b/tests/pages/sitemap.xml.yaml @@ -0,0 +1,6 @@ +view: + flatfilecms.views.sitemap: + ignore: + - blog/.*$ +data: + base_url: https://flatfilecms.test diff --git a/tests/test_pages.py b/tests/test_pages.py index 554ce2e..f871353 100644 --- a/tests/test_pages.py +++ b/tests/test_pages.py @@ -70,3 +70,24 @@ def test_blogindex(pages, fake_request, config): fake_view_object = PagesView(pages['blog']['index'], fake_request) response = blog(fake_view_object, {'base': '/blog'}) assert response.text == '/blog/blogpost2 /blog/blogpost1 ' + + +def test_sitemap(pages, fake_request, config): + from flatfilecms.views.pages import PagesView + response = PagesView(pages['sitemap.xml'], fake_request).process_yaml() + assert response.text == """ + + + https://flatfilecms.test/ + + + https://flatfilecms.test/view + + + https://flatfilecms.test/views + + + https://flatfilecms.test/view-with-options + +""" + assert response.content_type == 'text/xml'