Passed
Push — master ( 97b1b2...a0bd49 )
by Jochen
02:14
created

index_for_party()   A

Complexity

Conditions 2

Size

Total Lines 18
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 14
nop 1
dl 0
loc 18
rs 9.7
c 0
b 0
f 0
1
"""
2
byceps.blueprints.admin.site.views
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2006-2019 Jochen Kupperschmidt
6
:License: Modified BSD, see LICENSE for details.
7
"""
8
9
from collections import defaultdict
10
11
from flask import abort, request
12
13
from ....services.party import service as party_service
14
from ....services.site import \
15
    service as site_service, \
16
    settings_service as site_settings_service
17
from ....util.framework.blueprint import create_blueprint
18
from ....util.framework.flash import flash_success
19
from ....util.framework.templating import templated
20
from ....util.views import redirect_to
21
22
from ...authorization.decorators import permission_required
23
from ...authorization.registry import permission_registry
24
25
from .authorization import SitePermission
26
from .forms import CreateForm, UpdateForm
27
28
29
blueprint = create_blueprint('site_admin', __name__)
30
31
32
permission_registry.register_enum(SitePermission)
33
34
35
@blueprint.route('/')
36
@permission_required(SitePermission.view)
37
@templated
38
def index():
39
    """List all sites."""
40
    sites = site_service.get_all_sites()
41
42
    return {
43
        'sites': sites,
44
    }
45
46
47
@blueprint.route('/parties/<party_id>')
48
@permission_required(SitePermission.view)
49
@templated
50
def index_for_party(party_id):
51
    """List sites and their settings for this party."""
52
    party = party_service.find_party(party_id)
53
    if party is None:
54
        abort(404)
55
56
    sites = site_service.get_sites_for_party(party.id)
57
    settings = site_settings_service.get_settings_for_party(party.id)
58
59
    settings_by_site = _group_settings_by_site(settings)
60
61
    return {
62
        'party': party,
63
        'sites': sites,
64
        'settings_by_site': settings_by_site,
65
    }
66
67
68
def _group_settings_by_site(settings):
69
    settings_by_site = defaultdict(list)
70
71
    for setting in settings:
72
        settings_by_site[setting.site_id].append(setting)
73
74
    return dict(settings_by_site)
75
76
77
@blueprint.route('/sites/<site_id>')
78
@permission_required(SitePermission.view)
79
@templated
80
def view(site_id):
81
    """Show a site's settings."""
82
    site = site_service.find_site(site_id)
83
    if site is None:
84
        abort(404)
85
86
    settings = site_settings_service.get_settings(site.id)
87
88
    return {
89
        'site': site,
90
        'settings': settings,
91
    }
92
93
94
@blueprint.route('/for_party/<party_id>/create')
95
@permission_required(SitePermission.create)
96
@templated
97
def create_form(party_id, erroneous_form=None):
98
    """Show form to create a site for that party."""
99
    party = _get_party_or_404(party_id)
100
101
    form = erroneous_form if erroneous_form else CreateForm()
102
103
    return {
104
        'party': party,
105
        'form': form,
106
    }
107
108
109
@blueprint.route('/for_party/<party_id>', methods=['POST'])
110
@permission_required(SitePermission.create)
111
def create(party_id):
112
    """Create a site for that party."""
113
    party = _get_party_or_404(party_id)
114
115
    form = CreateForm(request.form)
116
117
    if not form.validate():
118
        return create_form(party.id, form)
119
120
    site_id = form.id.data.strip().lower()
121
    title = form.title.data.strip()
122
    server_name = form.server_name.data.strip()
123
124
    site = site_service.create_site(site_id, party.id, title, server_name)
125
126
    flash_success('Die Site "{}" wurde angelegt.', site.title)
127
    return redirect_to('.view', site_id=site.id)
128
129
130
@blueprint.route('/sites/<site_id>/update')
131
@permission_required(SitePermission.update)
132
@templated
133
def update_form(site_id, erroneous_form=None):
134
    """Show form to update the site."""
135
    site = _get_site_or_404(site_id)
136
    party = party_service.find_party(site.party_id)
137
138
    form = erroneous_form if erroneous_form else UpdateForm(obj=site)
139
140
    return {
141
        'party': party,
142
        'site': site,
143
        'form': form,
144
    }
145
146
147
@blueprint.route('/sites/<site_id>', methods=['POST'])
148
@permission_required(SitePermission.update)
149
def update(site_id):
150
    """Update the site."""
151
    site = _get_site_or_404(site_id)
152
153
    form = UpdateForm(request.form)
154
    if not form.validate():
155
        return update_form(site.id, form)
156
157
    title = form.title.data.strip()
158
    server_name = form.server_name.data.strip()
159
160
    try:
161
        site = site_service.update_site(site.id, title, server_name)
162
    except site_service.UnknownSiteId:
163
        abort(404, 'Unknown site ID "{}".'.format(site_id))
164
165
    flash_success('Der Site "{}" wurde aktualisiert.', site.title)
166
167
    return redirect_to('.view', site_id=site.id)
168
169
170
def _get_party_or_404(party_id):
171
    party = party_service.find_party(party_id)
172
173
    if party is None:
174
        abort(404)
175
176
    return party
177
178
179
def _get_site_or_404(site_id):
180
    site = site_service.find_site(site_id)
181
182
    if site is None:
183
        abort(404)
184
185
    return site
186