Добавлен вид sitemap [closes #11], [closes #30]

master
Антон Касимов 2019-05-15 18:35:28 +03:00
parent 0cbc2a0bc3
commit c467375bec
5 changed files with 51 additions and 4 deletions

View File

@ -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():

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{%- for item in request.root.structure() %}{% if item != '/sitemap.xml' and item not in data.ignore %}
{%- for item in pages %}
<url>
<loc>{{data.base_url}}{{item}}</loc>
<loc>{{data.base_url}}/{{item}}</loc>
</url>
{%- endif %}{%- endfor %}
{%- endfor %}
</urlset>

View File

@ -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)

View File

@ -0,0 +1,6 @@
view:
flatfilecms.views.sitemap:
ignore:
- blog/.*$
data:
base_url: https://flatfilecms.test

View File

@ -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 == """<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://flatfilecms.test/</loc>
</url>
<url>
<loc>https://flatfilecms.test/view</loc>
</url>
<url>
<loc>https://flatfilecms.test/views</loc>
</url>
<url>
<loc>https://flatfilecms.test/view-with-options</loc>
</url>
</urlset>"""
assert response.content_type == 'text/xml'