Passed
Push — master ( 69ad40...f1cd88 )
by Jochen
02:35
created

byceps/blueprints/admin/site/views.py (1 issue)

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
)
18
from ....util.framework.blueprint import create_blueprint
19
from ....util.framework.flash import flash_error, flash_success
20
from ....util.framework.templating import templated
21
from ....util.views import redirect_to
22
23
from ...authorization.decorators import permission_required
24
from ...authorization.registry import permission_registry
25
26
from .authorization import SitePermission
27
from .forms import CreateForm, UpdateForm
28
29
30
blueprint = create_blueprint('site_admin', __name__)
31
32
33
permission_registry.register_enum(SitePermission)
34
35
36
@blueprint.route('/')
37
@permission_required(SitePermission.view)
38
@templated
39
def index():
40
    """List all sites."""
41
    sites = site_service.get_all_sites()
42
43
    parties = party_service.get_all_parties()
44
    party_titles_by_id = {p.id: p.title for p in parties}
45
46
    sites.sort(key=lambda site: (site.title, site.party_id))
47
48
    return {
49
        'sites': sites,
50
        'party_titles_by_id': party_titles_by_id,
51
    }
52
53
54
@blueprint.route('/parties/<party_id>')
55
@permission_required(SitePermission.view)
56
@templated
57
def index_for_party(party_id):
58
    """List sites and their settings for this party."""
59
    party = party_service.find_party(party_id)
60
    if party is None:
61
        abort(404)
62
63
    sites = site_service.get_sites_for_party(party.id)
64
    settings = site_settings_service.get_settings_for_party(party.id)
65
66
    settings_by_site = _group_settings_by_site(settings)
67
68
    return {
69
        'party': party,
70
        'sites': sites,
71
        'settings_by_site': settings_by_site,
72
    }
73
74
75
def _group_settings_by_site(settings):
76
    settings_by_site = defaultdict(list)
77
78
    for setting in settings:
79
        settings_by_site[setting.site_id].append(setting)
80
81
    return dict(settings_by_site)
82
83
84
@blueprint.route('/sites/<site_id>')
85
@permission_required(SitePermission.view)
86
@templated
87
def view(site_id):
88
    """Show a site's settings."""
89
    site = site_service.find_site(site_id)
90
    if site is None:
91
        abort(404)
92
93
    settings = site_settings_service.get_settings(site.id)
94
95
    return {
96
        'site': site,
97
        'settings': settings,
98
    }
99
100
101
@blueprint.route('/sites/create')
102
@permission_required(SitePermission.create)
103
@templated
104
def create_form(erroneous_form=None):
105
    """Show form to create a site."""
106
    party_id = request.args.get('party_id')
107
108
    form = erroneous_form if erroneous_form else CreateForm(party_id=party_id)
109
    form.set_email_config_choices()
110
    form.set_party_choices()
111
112
    return {
113
        'form': form,
114
    }
115
116
117
@blueprint.route('/sites', methods=['POST'])
118
@permission_required(SitePermission.create)
119
def create():
120
    """Create a site."""
121
    form = CreateForm(request.form)
122
    form.set_email_config_choices()
123
    form.set_party_choices()
124
125
    if not form.validate():
126
        return create_form(form)
127
128
    site_id = form.id.data.strip().lower()
129
    title = form.title.data.strip()
130
    server_name = form.server_name.data.strip()
131
    email_config_id = form.email_config_id.data
132
    party_id = form.party_id.data
133
134
    if party_id:
135
        party = party_service.find_party(party_id)
136
        if not party:
137
            flash_error(f'Die Party-ID "{party_id}" ist unbekannt.')
138
            return create_form(form)
139
    else:
140
        party_id = None
141
142
    site = site_service.create_site(
143
        site_id, title, server_name, email_config_id, party_id=party_id
144
    )
145
146
    flash_success(f'Die Site "{site.title}" wurde angelegt.')
147
    return redirect_to('.view', site_id=site.id)
148
149
150
@blueprint.route('/sites/<site_id>/update')
151
@permission_required(SitePermission.update)
152
@templated
153
def update_form(site_id, erroneous_form=None):
154
    """Show form to update the site."""
155
    site = _get_site_or_404(site_id)
156
157
    form = erroneous_form if erroneous_form else UpdateForm(obj=site)
158
    form.set_email_config_choices()
159
    form.set_party_choices()
160
161
    return {
162
        'site': site,
163
        'form': form,
164
    }
165
166
167
@blueprint.route('/sites/<site_id>', methods=['POST'])
168
@permission_required(SitePermission.update)
169
def update(site_id):
170
    """Update the site."""
171
    site = _get_site_or_404(site_id)
172
173
    form = UpdateForm(request.form)
174
    form.set_email_config_choices()
175
    form.set_party_choices()
176
177
    if not form.validate():
178
        return update_form(site.id, form)
179
180
    title = form.title.data.strip()
181
    server_name = form.server_name.data.strip()
182
    email_config_id = form.email_config_id.data
183
    party_id = form.party_id.data
184
185
    if party_id:
186
        party = party_service.find_party(party_id)
187
    else:
188
        if not party:
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable party does not seem to be defined.
Loading history...
189
            flash_error(f'Die Party-ID "{party_id}" ist unbekannt.')
190
            return update_form(site.id, form)
191
        party_id = None
192
193
    try:
194
        site = site_service.update_site(
195
            site.id, title, server_name, email_config_id, party_id=party_id
196
        )
197
    except site_service.UnknownSiteId:
198
        abort(404, f'Unknown site ID "{site_id}".')
199
200
    flash_success(f'Die Site "{site.title}" wurde aktualisiert.')
201
202
    return redirect_to('.view', site_id=site.id)
203
204
205
def _get_site_or_404(site_id):
206
    site = site_service.find_site(site_id)
207
208
    if site is None:
209
        abort(404)
210
211
    return site
212