Passed
Push — master ( 0b7d34...61b3a3 )
by Jochen
02:49
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
    enabled = form.enabled.data
134
135
    if party_id:
136
        party = party_service.find_party(party_id)
137
        if not party:
138
            flash_error(f'Die Party-ID "{party_id}" ist unbekannt.')
139
            return create_form(form)
140
    else:
141
        party_id = None
142
143
    site = site_service.create_site(
144
        site_id, title, server_name, email_config_id, enabled, party_id=party_id
145
    )
146
147
    flash_success(f'Die Site "{site.title}" wurde angelegt.')
148
    return redirect_to('.view', site_id=site.id)
149
150
151
@blueprint.route('/sites/<site_id>/update')
152
@permission_required(SitePermission.update)
153
@templated
154
def update_form(site_id, erroneous_form=None):
155
    """Show form to update the site."""
156
    site = _get_site_or_404(site_id)
157
158
    form = erroneous_form if erroneous_form else UpdateForm(obj=site)
159
    form.set_email_config_choices()
160
    form.set_party_choices()
161
162
    return {
163
        'site': site,
164
        'form': form,
165
    }
166
167
168
@blueprint.route('/sites/<site_id>', methods=['POST'])
169
@permission_required(SitePermission.update)
170
def update(site_id):
171
    """Update the site."""
172
    site = _get_site_or_404(site_id)
173
174
    form = UpdateForm(request.form)
175
    form.set_email_config_choices()
176
    form.set_party_choices()
177
178
    if not form.validate():
179
        return update_form(site.id, form)
180
181
    title = form.title.data.strip()
182
    server_name = form.server_name.data.strip()
183
    email_config_id = form.email_config_id.data
184
    party_id = form.party_id.data
185
    enabled = form.enabled.data
186
187
    if party_id:
188
        party = party_service.find_party(party_id)
189
    else:
190
        if not party:
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable party does not seem to be defined.
Loading history...
191
            flash_error(f'Die Party-ID "{party_id}" ist unbekannt.')
192
            return update_form(site.id, form)
193
        party_id = None
194
195
    try:
196
        site = site_service.update_site(
197
            site.id, title, server_name, email_config_id, party_id, enabled
198
        )
199
    except site_service.UnknownSiteId:
200
        abort(404, f'Unknown site ID "{site_id}".')
201
202
    flash_success(f'Die Site "{site.title}" wurde aktualisiert.')
203
204
    return redirect_to('.view', site_id=site.id)
205
206
207
def _get_site_or_404(site_id):
208
    site = site_service.find_site(site_id)
209
210
    if site is None:
211
        abort(404)
212
213
    return site
214