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