From 73b50556bedb9a86590ff1bd67b58fd69dff8a95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Fri, 29 Sep 2017 17:50:57 +0200 Subject: [PATCH] Added blog archive. May still need some style tweaking. --- pillar/web/main/routes.py | 12 ++++ pillar/web/nodes/custom/posts.py | 38 ++++++++++-- src/styles/blog.sass | 6 ++ src/templates/nodes/custom/blog/_macros.pug | 60 ++++++++++++++----- src/templates/nodes/custom/blog/archive.pug | 8 +++ .../custom/blog/archive_main_project.pug | 11 ++++ src/templates/nodes/custom/blog/index.pug | 2 +- .../nodes/custom/blog/index_main_project.pug | 2 +- 8 files changed, 116 insertions(+), 23 deletions(-) create mode 100644 src/templates/nodes/custom/blog/archive.pug create mode 100644 src/templates/nodes/custom/blog/archive_main_project.pug diff --git a/pillar/web/main/routes.py b/pillar/web/main/routes.py index 832c6f52..9b5bd8e0 100644 --- a/pillar/web/main/routes.py +++ b/pillar/web/main/routes.py @@ -60,6 +60,18 @@ def project_blog(project_url, url=None): return posts_view(project_url=project_url, url=url) +@blueprint.route('/blog-archive/') +@blueprint.route('/blog-archive/') +def main_blog_archive(page=1): + project_id = current_app.config['MAIN_PROJECT_ID'] + return posts_view(project_id, archive=True, page=page) + + +@blueprint.route('/p//blog-archive/') +def project_blog_archive(project_url): + return posts_view(project_url=project_url, archive=True) + + @blueprint.route('/vrview') def vrview(): """Call this from iframes to render sperical content (video and images)""" diff --git a/pillar/web/nodes/custom/posts.py b/pillar/web/nodes/custom/posts.py index 84cb8e9d..473c5d52 100644 --- a/pillar/web/nodes/custom/posts.py +++ b/pillar/web/nodes/custom/posts.py @@ -1,9 +1,10 @@ +import functools import logging from pillarsdk import Node from pillarsdk import Project from pillarsdk.exceptions import ResourceNotFound -from flask import abort +from flask import abort, url_for from flask import current_app from flask import render_template from flask import redirect @@ -23,12 +24,15 @@ log = logging.getLogger(__name__) # Cached, see setup_app() below. -def posts_view(project_id=None, project_url=None, url=None): +def posts_view(project_id=None, project_url=None, url=None, *, archive=False, page=1): """View individual blogpost""" if bool(project_id) == bool(project_url): raise ValueError('posts_view(): pass either project_id or project_url') + if url and archive: + raise ValueError('posts_view(): cannot pass both url and archive') + api = system_util.pillar_api() # Fetch project (for backgroud images and links generation) @@ -49,14 +53,18 @@ def posts_view(project_id=None, project_url=None, url=None): 'where': {'parent': blog._id, **status_query}, 'embedded': {'user': 1}, 'sort': '-_created', + 'max_results': 20 if archive else 5, + 'page': page, }, api=api) for post in posts._items: post.picture = get_file(post.picture, api=api) # Use the *_main_project.html template for the main blog - main_project_template = '_main_project' if project_id == current_app.config['MAIN_PROJECT_ID'] else '' - template_path = f'nodes/custom/blog/index{main_project_template}.html', + is_main_project = project_id == current_app.config['MAIN_PROJECT_ID'] + main_project_template = '_main_project' if is_main_project else '' + index_arch = 'archive' if archive else 'index' + template_path = f'nodes/custom/blog/{index_arch}{main_project_template}.html', if url: template_path = f'nodes/custom/post/view{main_project_template}.html', @@ -90,13 +98,31 @@ def posts_view(project_id=None, project_url=None, url=None): can_create_blog_posts = project.node_type_has_method('post', 'POST', api=api) + # Use functools.partial so we can later pass page=X. + if is_main_project: + url_func = functools.partial(url_for, 'main.main_blog_archive') + else: + url_func = functools.partial(url_for, 'main.project_blog_archive', project_url=project.url) + + project.blog_archive_url = url_func() + pmeta = posts._meta + seen_now = pmeta['max_results'] * pmeta['page'] + if pmeta['total'] > seen_now: + project.blog_archive_next = url_func(page=pmeta['page'] + 1) + else: + project.blog_archive_next = None + if pmeta['page'] > 1: + project.blog_archive_prev = url_func(page=pmeta['page'] - 1) + else: + project.blog_archive_prev = None + return render_template( template_path, blog=blog, node=post, posts=posts._items, - posts_meta=posts._meta, - more_posts_available=posts._meta['total'] > posts._meta['max_results'], + posts_meta=pmeta, + more_posts_available=pmeta['total'] > pmeta['max_results'], project=project, title='blog', node_type_post=project.get_node_type('post'), diff --git a/src/styles/blog.sass b/src/styles/blog.sass index 72bfb3aa..08768e18 100644 --- a/src/styles/blog.sass +++ b/src/styles/blog.sass @@ -647,3 +647,9 @@ .blog_index-item padding-top: 55px font-size: .9em + +.blog-archive h1 + border-bottom: thin solid $color-background + padding-bottom: 0.3ex + text-align: center + color: $color-text-dark-secondary diff --git a/src/templates/nodes/custom/blog/_macros.pug b/src/templates/nodes/custom/blog/_macros.pug index 8a5db5b0..163dca84 100644 --- a/src/templates/nodes/custom/blog/_macros.pug +++ b/src/templates/nodes/custom/blog/_macros.pug @@ -27,20 +27,7 @@ | {% endmacro %} //- ******************************************************* -// -| {% macro render_blog_index(project, posts, can_create_blog_posts, api) %} -| {% if can_create_blog_posts %} -a.btn.btn-default.button-create(href="{{url_for('nodes.posts_create', project_id=project._id)}}") - i.pi-plus - | Create New Post -| {% endif %} - -| {% if posts %} -| {{ render_blog_post(posts[0]) }} - -| {% for node in posts[1:] %} -| {% if loop.first %} -h4.blog_index-title Blasts from the past -| {% endif %} +| {% macro render_blog_list_item(node) %} .blog_index-item.list | {% if node.picture %} .item-header @@ -61,7 +48,32 @@ h4.blog_index-title Blasts from the past {% if node.properties.category %}| {{node.properties.category}}{% endif %} | by {{node.user.full_name}} {% if node.properties.status != 'published' %} | {{ node.properties.status}} {% endif %} -| {% endfor %} {# posts #} +| {% endmacro %} + + +//- ******************************************************* -// +| {% macro render_blog_index(project, posts, can_create_blog_posts, api, more_posts_available, posts_meta) %} +| {% if can_create_blog_posts %} +a.btn.btn-default.button-create(href="{{url_for('nodes.posts_create', project_id=project._id)}}") + i.pi-plus + | Create New Post +| {% endif %} + +| {% if posts %} +| {{ render_blog_post(posts[0]) }} + +| {% for node in posts[1:] %} +| {% if loop.first %} +h4.blog_index-title Blasts from the past +| {% endif %} +| {{ render_blog_list_item(node) }} +| {% endfor %} + +| {% if more_posts_available %} +.blog_index-item + a.item-title.blog-archive(href="{{ project.blog_archive_url }}") + | {{posts_meta.total - posts|length}} more blog posts live here +| {% endif %} | {% else %} @@ -70,3 +82,21 @@ h4.blog_index-title Blasts from the past | {% endif %} {# posts #} | {% endmacro %} + +//- ******************************************************* -// +| {% macro render_archive(project, posts, posts_meta) %} +| {% if project.blog_archive_prev %} +.blog_index-item.list + a(href="{{ project.blog_archive_prev }}", rel="prev") Previous page +| {% endif %} + +| {% for node in posts %} +| {{ render_blog_list_item(node) }} +| {% endfor %} + +| {% if project.blog_archive_next %} +.blog_index-item.list + a(href="{{ project.blog_archive_next }}", rel="next") Next page +| {% endif %} + +| {% endmacro %} diff --git a/src/templates/nodes/custom/blog/archive.pug b/src/templates/nodes/custom/blog/archive.pug new file mode 100644 index 00000000..bfc48972 --- /dev/null +++ b/src/templates/nodes/custom/blog/archive.pug @@ -0,0 +1,8 @@ +| {% extends 'nodes/custom/blog/index.html' %} +| {% import 'nodes/custom/blog/_macros.html' as blogmacros %} + +| {% block project_context %} +#blog_container.blog-archive + #blog_index-container.expand-image-links + | {{ blogmacros.render_archive(project, posts, posts_meta) }} +| {% endblock %} diff --git a/src/templates/nodes/custom/blog/archive_main_project.pug b/src/templates/nodes/custom/blog/archive_main_project.pug new file mode 100644 index 00000000..1b821198 --- /dev/null +++ b/src/templates/nodes/custom/blog/archive_main_project.pug @@ -0,0 +1,11 @@ +| {% extends 'nodes/custom/blog/index_main_project.html' %} +| {% import 'nodes/custom/blog/_macros.html' as blogmacros %} + +| {% block body %} +.container.blog-archive + #blog_container.cloud-blog + #blog_index-container.expand-image-links + .blog_index-header + h1 Blog Archive + | {{ blogmacros.render_archive(project, posts, posts_meta) }} +| {% endblock %} diff --git a/src/templates/nodes/custom/blog/index.pug b/src/templates/nodes/custom/blog/index.pug index 63f44f19..b2917873 100644 --- a/src/templates/nodes/custom/blog/index.pug +++ b/src/templates/nodes/custom/blog/index.pug @@ -11,7 +11,7 @@ link(href="{{ url_for('static_pillar', filename='assets/css/blog.css', v=1732017 | {% block project_context %} #blog_container #blog_index-container.expand-image-links - | {{ blogmacros.render_blog_index(project, posts, can_create_blog_posts, api) }} + | {{ blogmacros.render_blog_index(project, posts, can_create_blog_posts, api, more_posts_available, posts_meta) }} | {% endblock %} | {% block project_tree %} diff --git a/src/templates/nodes/custom/blog/index_main_project.pug b/src/templates/nodes/custom/blog/index_main_project.pug index f8a748e4..f5255791 100644 --- a/src/templates/nodes/custom/blog/index_main_project.pug +++ b/src/templates/nodes/custom/blog/index_main_project.pug @@ -8,7 +8,7 @@ .container #blog_container.cloud-blog #blog_index-container.expand-image-links - | {{ blogmacros.render_blog_index(project, posts, can_create_blog_posts, api) }} + | {{ blogmacros.render_blog_index(project, posts, can_create_blog_posts, api, more_posts_available, posts_meta) }} | {% endblock %} | {% block footer_scripts %}