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
|
|
|
|