Added blog archive.

May still need some style tweaking.
This commit is contained in:
Sybren A. Stüvel 2017-09-29 17:50:57 +02:00
parent e724c9c2ad
commit 73b50556be
8 changed files with 116 additions and 23 deletions

View File

@ -60,6 +60,18 @@ def project_blog(project_url, url=None):
return posts_view(project_url=project_url, url=url) return posts_view(project_url=project_url, url=url)
@blueprint.route('/blog-archive/')
@blueprint.route('/blog-archive/<int:page>')
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/<project_url>/blog-archive/')
def project_blog_archive(project_url):
return posts_view(project_url=project_url, archive=True)
@blueprint.route('/vrview') @blueprint.route('/vrview')
def vrview(): def vrview():
"""Call this from iframes to render sperical content (video and images)""" """Call this from iframes to render sperical content (video and images)"""

View File

@ -1,9 +1,10 @@
import functools
import logging import logging
from pillarsdk import Node from pillarsdk import Node
from pillarsdk import Project from pillarsdk import Project
from pillarsdk.exceptions import ResourceNotFound from pillarsdk.exceptions import ResourceNotFound
from flask import abort from flask import abort, url_for
from flask import current_app from flask import current_app
from flask import render_template from flask import render_template
from flask import redirect from flask import redirect
@ -23,12 +24,15 @@ log = logging.getLogger(__name__)
# Cached, see setup_app() below. # 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""" """View individual blogpost"""
if bool(project_id) == bool(project_url): if bool(project_id) == bool(project_url):
raise ValueError('posts_view(): pass either project_id or 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() api = system_util.pillar_api()
# Fetch project (for backgroud images and links generation) # 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}, 'where': {'parent': blog._id, **status_query},
'embedded': {'user': 1}, 'embedded': {'user': 1},
'sort': '-_created', 'sort': '-_created',
'max_results': 20 if archive else 5,
'page': page,
}, api=api) }, api=api)
for post in posts._items: for post in posts._items:
post.picture = get_file(post.picture, api=api) post.picture = get_file(post.picture, api=api)
# Use the *_main_project.html template for the main blog # 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 '' is_main_project = project_id == current_app.config['MAIN_PROJECT_ID']
template_path = f'nodes/custom/blog/index{main_project_template}.html', 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: if url:
template_path = f'nodes/custom/post/view{main_project_template}.html', 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) 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( return render_template(
template_path, template_path,
blog=blog, blog=blog,
node=post, node=post,
posts=posts._items, posts=posts._items,
posts_meta=posts._meta, posts_meta=pmeta,
more_posts_available=posts._meta['total'] > posts._meta['max_results'], more_posts_available=pmeta['total'] > pmeta['max_results'],
project=project, project=project,
title='blog', title='blog',
node_type_post=project.get_node_type('post'), node_type_post=project.get_node_type('post'),

View File

@ -647,3 +647,9 @@
.blog_index-item .blog_index-item
padding-top: 55px padding-top: 55px
font-size: .9em font-size: .9em
.blog-archive h1
border-bottom: thin solid $color-background
padding-bottom: 0.3ex
text-align: center
color: $color-text-dark-secondary

View File

@ -27,20 +27,7 @@
| {% endmacro %} | {% endmacro %}
//- ******************************************************* -// //- ******************************************************* -//
| {% macro render_blog_index(project, posts, can_create_blog_posts, api) %} | {% macro render_blog_list_item(node) %}
| {% 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 %}
.blog_index-item.list .blog_index-item.list
| {% if node.picture %} | {% if node.picture %}
.item-header .item-header
@ -61,7 +48,32 @@ h4.blog_index-title Blasts from the past
{% if node.properties.category %}| {{node.properties.category}}{% endif %} {% if node.properties.category %}| {{node.properties.category}}{% endif %}
| by {{node.user.full_name}} | by {{node.user.full_name}}
{% if node.properties.status != 'published' %} | {{ node.properties.status}} {% endif %} {% 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 %} | {% else %}
@ -70,3 +82,21 @@ h4.blog_index-title Blasts from the past
| {% endif %} {# posts #} | {% endif %} {# posts #}
| {% endmacro %} | {% 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 %}

View File

@ -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 %}

View File

@ -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 %}

View File

@ -11,7 +11,7 @@ link(href="{{ url_for('static_pillar', filename='assets/css/blog.css', v=1732017
| {% block project_context %} | {% block project_context %}
#blog_container #blog_container
#blog_index-container.expand-image-links #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 %} | {% endblock %}
| {% block project_tree %} | {% block project_tree %}

View File

@ -8,7 +8,7 @@
.container .container
#blog_container.cloud-blog #blog_container.cloud-blog
#blog_index-container.expand-image-links #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 %} | {% endblock %}
| {% block footer_scripts %} | {% block footer_scripts %}