Added blog archive.
May still need some style tweaking.
This commit is contained in:
parent
e724c9c2ad
commit
73b50556be
@ -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)"""
|
||||||
|
@ -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'),
|
||||||
|
@ -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
|
||||||
|
@ -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 %}
|
||||||
|
8
src/templates/nodes/custom/blog/archive.pug
Normal file
8
src/templates/nodes/custom/blog/archive.pug
Normal 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 %}
|
11
src/templates/nodes/custom/blog/archive_main_project.pug
Normal file
11
src/templates/nodes/custom/blog/archive_main_project.pug
Normal 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 %}
|
@ -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 %}
|
||||||
|
@ -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 %}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user