Passed
Push — master ( 875b3f...ba269f )
by Jochen
02:30
created

byceps.blueprints.news.views._render_body()   A

Complexity

Conditions 1

Size

Total Lines 2
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nop 1
dl 0
loc 2
rs 10
c 0
b 0
f 0
1
"""
2
byceps.blueprints.news.views
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2006-2020 Jochen Kupperschmidt
6
:License: Modified BSD, see LICENSE for details.
7
"""
8
9
from flask import abort, g
10
11
from ...services.news import service as news_service
12
from ...services.site import settings_service as site_settings_service
13
from ...util.framework.blueprint import create_blueprint
14
from ...util.framework.templating import templated
15
16
from ..admin.news.authorization import NewsItemPermission
17
from ..authorization.registry import permission_registry
18
19
20
blueprint = create_blueprint('news', __name__)
21
22
23
permission_registry.register_enum(NewsItemPermission)
24
25
26
DEFAULT_ITEMS_PER_PAGE = 4
27
28
29
@blueprint.route('/', defaults={'page': 1})
30
@blueprint.route('/pages/<int:page>')
31
@templated
32
def index(page):
33
    """Show a page of news items."""
34
    channel_id = _get_channel_id()
35
    items_per_page = _get_items_per_page_value()
36
    published_only = not _may_view_drafts(g.current_user)
37
38
    items = news_service.get_aggregated_items_paginated(
39
        channel_id, page, items_per_page, published_only=published_only
40
    )
41
42
    return {
43
        'items': items,
44
        'page': page,
45
        'render_body': _render_body,
46
    }
47
48
49
@blueprint.route('/<slug>')
50
@templated
51
def view(slug):
52
    """Show a single news item."""
53
    channel_id = _get_channel_id()
54
    published_only = not _may_view_drafts(g.current_user)
55
56
    item = news_service.find_aggregated_item_by_slug(
57
        channel_id, slug, published_only=published_only
58
    )
59
60
    if item is None:
61
        abort(404)
62
63
    return {
64
        'item': item,
65
        'render_body': _render_body,
66
    }
67
68
69
def _get_channel_id():
70
    channel_id = site_settings_service.find_setting_value(
71
        g.site_id, 'news_channel_id'
72
    )
73
74
    if channel_id is None:
75
        abort(404)
76
77
    return channel_id
78
79
80
def _get_items_per_page_value():
81
    items_per_page = site_settings_service.find_setting_value(
82
        g.site_id, 'news_items_per_page'
83
    )
84
85
    if items_per_page is None:
86
        return DEFAULT_ITEMS_PER_PAGE
87
88
    return int(items_per_page)
89
90
91
def _may_view_drafts(user):
92
    return user.has_permission(NewsItemPermission.view_draft)
93
94
95
def _render_body(raw_body):
96
    return news_service.render_body(raw_body)
97