c2cgeoportal-admin 2.6.0__py3-none-any.whl → 2.7.1.156__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- c2cgeoportal_admin/__init__.py +17 -10
- c2cgeoportal_admin/lib/lingua_extractor.py +77 -0
- c2cgeoportal_admin/lib/ogcserver_synchronizer.py +166 -54
- c2cgeoportal_admin/py.typed +0 -0
- c2cgeoportal_admin/routes.py +4 -3
- c2cgeoportal_admin/schemas/dimensions.py +12 -10
- c2cgeoportal_admin/schemas/functionalities.py +62 -21
- c2cgeoportal_admin/schemas/interfaces.py +22 -18
- c2cgeoportal_admin/schemas/metadata.py +99 -46
- c2cgeoportal_admin/schemas/restriction_areas.py +21 -19
- c2cgeoportal_admin/schemas/roles.py +7 -5
- c2cgeoportal_admin/schemas/treegroup.py +37 -16
- c2cgeoportal_admin/schemas/treeitem.py +2 -3
- c2cgeoportal_admin/static/layertree.css +3 -4
- c2cgeoportal_admin/static/navbar.css +36 -35
- c2cgeoportal_admin/static/theme.css +16 -9
- c2cgeoportal_admin/subscribers.py +3 -3
- c2cgeoportal_admin/templates/layertree.jinja2 +31 -9
- c2cgeoportal_admin/templates/navigation_navbar.jinja2 +33 -0
- c2cgeoportal_admin/templates/ogcserver_synchronize.jinja2 +12 -0
- c2cgeoportal_admin/templates/widgets/functionality_fields.pt +51 -0
- c2cgeoportal_admin/templates/widgets/metadata.pt +7 -1
- c2cgeoportal_admin/views/dimension_layers.py +7 -6
- c2cgeoportal_admin/views/functionalities.py +31 -5
- c2cgeoportal_admin/views/home.py +5 -5
- c2cgeoportal_admin/views/interfaces.py +5 -7
- c2cgeoportal_admin/views/layer_groups.py +9 -11
- c2cgeoportal_admin/views/layers.py +8 -7
- c2cgeoportal_admin/views/layers_vectortiles.py +30 -10
- c2cgeoportal_admin/views/layers_wms.py +39 -35
- c2cgeoportal_admin/views/layers_wmts.py +39 -35
- c2cgeoportal_admin/views/layertree.py +35 -27
- c2cgeoportal_admin/views/oauth2_clients.py +26 -21
- c2cgeoportal_admin/views/ogc_servers.py +57 -29
- c2cgeoportal_admin/views/restriction_areas.py +11 -10
- c2cgeoportal_admin/views/roles.py +14 -11
- c2cgeoportal_admin/views/themes.py +15 -14
- c2cgeoportal_admin/views/themes_ordering.py +13 -8
- c2cgeoportal_admin/views/treeitems.py +12 -11
- c2cgeoportal_admin/views/users.py +7 -5
- c2cgeoportal_admin/widgets.py +17 -14
- {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.7.1.156.dist-info}/METADATA +15 -12
- c2cgeoportal_admin-2.7.1.156.dist-info/RECORD +92 -0
- {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.7.1.156.dist-info}/WHEEL +1 -1
- c2cgeoportal_admin-2.7.1.156.dist-info/entry_points.txt +5 -0
- tests/__init__.py +9 -9
- tests/conftest.py +2 -1
- tests/test_edit_url.py +11 -13
- tests/test_functionalities.py +23 -10
- tests/test_interface.py +7 -7
- tests/test_layer_groups.py +13 -17
- tests/test_layers_vectortiles.py +11 -13
- tests/test_layers_wms.py +25 -36
- tests/test_layers_wmts.py +15 -19
- tests/test_layertree.py +99 -15
- tests/test_lingua_extractor_config.py +66 -0
- tests/test_main.py +3 -1
- tests/test_metadatas.py +34 -20
- tests/test_oauth2_clients.py +4 -4
- tests/test_ogc_servers.py +21 -10
- tests/test_restriction_areas.py +10 -12
- tests/test_role.py +37 -35
- tests/test_themes.py +40 -33
- tests/test_themes_ordering.py +1 -1
- tests/test_treegroup.py +2 -2
- tests/test_user.py +15 -13
- tests/themes_ordering.py +1 -1
- c2cgeoportal_admin/templates/navigation_vertical.jinja2 +0 -33
- c2cgeoportal_admin-2.6.0.dist-info/RECORD +0 -89
- c2cgeoportal_admin-2.6.0.dist-info/entry_points.txt +0 -3
- {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.7.1.156.dist-info}/top_level.txt +0 -0
tests/test_metadatas.py
CHANGED
@@ -85,7 +85,9 @@ class TestMetadatasView(AbstractViewsTests):
|
|
85
85
|
return None
|
86
86
|
return metadata.value
|
87
87
|
|
88
|
-
def _check_metadatas(self, test_app, item, metadatas):
|
88
|
+
def _check_metadatas(self, test_app, item, metadatas, model):
|
89
|
+
from c2cgeoportal_admin.schemas.metadata import metadata_definitions
|
90
|
+
|
89
91
|
settings = test_app.app.registry.settings
|
90
92
|
self._check_sequence(
|
91
93
|
item,
|
@@ -96,9 +98,7 @@ class TestMetadatasView(AbstractViewsTests):
|
|
96
98
|
"name": "name",
|
97
99
|
"value": [
|
98
100
|
{"text": s_m["name"], "value": s_m["name"], "selected": s_m["name"] == m.name}
|
99
|
-
for s_m in sorted(
|
100
|
-
settings["admin_interface"]["available_metadata"], key=lambda m: m["name"]
|
101
|
-
)
|
101
|
+
for s_m in sorted(metadata_definitions(settings, model), key=lambda m: m["name"])
|
102
102
|
],
|
103
103
|
"label": "Name",
|
104
104
|
},
|
@@ -131,7 +131,7 @@ class TestMetadatasView(AbstractViewsTests):
|
|
131
131
|
resp = self._post_metadata(test_app, url, base_mapping, name, value, 200)
|
132
132
|
assert (
|
133
133
|
error_msg
|
134
|
-
== resp.html.select_one(".item-{
|
134
|
+
== resp.html.select_one(f".item-{self.__metadata_ui_type(test_app, name)} .help-block")
|
135
135
|
.getText()
|
136
136
|
.strip()
|
137
137
|
)
|
@@ -156,12 +156,16 @@ class TestMetadatasView(AbstractViewsTests):
|
|
156
156
|
)
|
157
157
|
|
158
158
|
def test_get_true_boolean_metadata(self, metadatas_test_data, test_app):
|
159
|
-
|
160
|
-
|
159
|
+
from c2cgeoportal_commons.models.main import LayerWMS
|
160
|
+
|
161
|
+
metadatas_test_data["layer_wms"].get_metadata("_boolean")[0].value = "true"
|
162
|
+
self._test_edit_treeitem("layers_wms", metadatas_test_data["layer_wms"], test_app, LayerWMS)
|
161
163
|
|
162
164
|
def test_get_false_boolean_metadata(self, metadatas_test_data, test_app):
|
163
|
-
|
164
|
-
|
165
|
+
from c2cgeoportal_commons.models.main import LayerWMS
|
166
|
+
|
167
|
+
metadatas_test_data["layer_wms"].get_metadata("_boolean")[0].value = "false"
|
168
|
+
self._test_edit_treeitem("layers_wms", metadatas_test_data["layer_wms"], test_app, LayerWMS)
|
165
169
|
|
166
170
|
def test_post_true_boolean_metadata(self, test_app, metadatas_test_data, dbsession):
|
167
171
|
from c2cgeoportal_commons.models.main import LayerWMS
|
@@ -175,7 +179,7 @@ class TestMetadatasView(AbstractViewsTests):
|
|
175
179
|
302,
|
176
180
|
)
|
177
181
|
layer = dbsession.query(LayerWMS).filter(LayerWMS.name == "new_name").one()
|
178
|
-
assert layer.
|
182
|
+
assert layer.get_metadata("_boolean")[0].value == "true"
|
179
183
|
|
180
184
|
def test_post_false_boolean_metadata(self, test_app, metadatas_test_data, dbsession):
|
181
185
|
from c2cgeoportal_commons.models.main import LayerWMS
|
@@ -189,7 +193,7 @@ class TestMetadatasView(AbstractViewsTests):
|
|
189
193
|
302,
|
190
194
|
)
|
191
195
|
layer = dbsession.query(LayerWMS).filter(LayerWMS.name == "new_name").one()
|
192
|
-
assert layer.
|
196
|
+
assert layer.get_metadata("_boolean")[0].value == "false"
|
193
197
|
|
194
198
|
def test_valid_float_metadata(self, test_app, metadatas_test_data):
|
195
199
|
self._post_metadata(
|
@@ -304,31 +308,41 @@ class TestMetadatasView(AbstractViewsTests):
|
|
304
308
|
302,
|
305
309
|
)
|
306
310
|
|
307
|
-
def _test_edit_treeitem(self, prefix, item, test_app):
|
308
|
-
resp = self.get(test_app, "{}/{
|
309
|
-
self._check_metadatas(test_app, resp.html.select_one(".item-metadatas"), item.metadatas)
|
311
|
+
def _test_edit_treeitem(self, prefix, item, test_app, model):
|
312
|
+
resp = self.get(test_app, f"{prefix}/{item.id}")
|
313
|
+
self._check_metadatas(test_app, resp.html.select_one(".item-metadatas"), item.metadatas, model)
|
310
314
|
resp.form.submit("submit", status=302)
|
311
315
|
|
312
316
|
def test_layer_wms_metadatas(self, metadatas_test_data, test_app):
|
313
|
-
|
317
|
+
from c2cgeoportal_commons.models.main import LayerWMS
|
318
|
+
|
319
|
+
self._test_edit_treeitem("layers_wms", metadatas_test_data["layer_wms"], test_app, LayerWMS)
|
314
320
|
|
315
321
|
def test_layer_wmts_metadatas(self, metadatas_test_data, test_app):
|
316
|
-
|
322
|
+
from c2cgeoportal_commons.models.main import LayerWMTS
|
323
|
+
|
324
|
+
self._test_edit_treeitem("layers_wmts", metadatas_test_data["layer_wmts"], test_app, LayerWMTS)
|
317
325
|
|
318
326
|
def test_theme_metadatas(self, metadatas_test_data, test_app):
|
319
|
-
|
327
|
+
from c2cgeoportal_commons.models.main import Theme
|
328
|
+
|
329
|
+
self._test_edit_treeitem("themes", metadatas_test_data["theme"], test_app, Theme)
|
320
330
|
|
321
331
|
def test_group_metadatas(self, metadatas_test_data, test_app):
|
322
|
-
|
332
|
+
from c2cgeoportal_commons.models.main import LayerGroup
|
333
|
+
|
334
|
+
self._test_edit_treeitem("layer_groups", metadatas_test_data["group"], test_app, LayerGroup)
|
323
335
|
|
324
336
|
def test_undefined_metadata(self, metadatas_test_data, test_app):
|
325
|
-
"""
|
337
|
+
"""
|
338
|
+
Undefined metadata must be kept intact across submissions.
|
339
|
+
"""
|
326
340
|
from c2cgeoportal_commons.models.main import Metadata
|
327
341
|
|
328
342
|
layer = metadatas_test_data["layer_wms"]
|
329
343
|
layer.metadatas = [Metadata("_undefined", "This is an undefined metadata")]
|
330
344
|
|
331
|
-
resp = self.get(test_app, "layers_wms/{
|
345
|
+
resp = self.get(test_app, f"layers_wms/{layer.id}")
|
332
346
|
resp.form.submit("submit", status=302)
|
333
347
|
|
334
348
|
metadata = layer.metadatas[0]
|
tests/test_oauth2_clients.py
CHANGED
@@ -117,7 +117,7 @@ class TestOAuth2Client(TestTreeGroup):
|
|
117
117
|
|
118
118
|
oauth2_client_proto = oauth2_clients_test_data["oauth2_clients"][7]
|
119
119
|
|
120
|
-
resp = test_app.get("/admin/oauth2_clients/{}/duplicate"
|
120
|
+
resp = test_app.get(f"/admin/oauth2_clients/{oauth2_client_proto.id}/duplicate", status=200)
|
121
121
|
form = resp.form
|
122
122
|
|
123
123
|
assert "" == self.get_first_field_named(form, "id").value
|
@@ -137,16 +137,16 @@ class TestOAuth2Client(TestTreeGroup):
|
|
137
137
|
from c2cgeoportal_commons.models.static import OAuth2Client
|
138
138
|
|
139
139
|
oauth2_client_id = dbsession.query(OAuth2Client.id).first().id
|
140
|
-
test_app.delete("/admin/oauth2_clients/{}"
|
140
|
+
test_app.delete(f"/admin/oauth2_clients/{oauth2_client_id}", status=200)
|
141
141
|
assert dbsession.query(OAuth2Client).get(oauth2_client_id) is None
|
142
142
|
|
143
143
|
def test_unicity_validator(self, oauth2_clients_test_data, test_app):
|
144
144
|
oauth2_client_proto = oauth2_clients_test_data["oauth2_clients"][7]
|
145
|
-
resp = test_app.get("/admin/oauth2_clients/{}/duplicate"
|
145
|
+
resp = test_app.get(f"/admin/oauth2_clients/{oauth2_client_proto.id}/duplicate", status=200)
|
146
146
|
|
147
147
|
resp = resp.form.submit("submit")
|
148
148
|
|
149
|
-
self._check_submission_problem(resp, "{} is already used."
|
149
|
+
self._check_submission_problem(resp, f"{oauth2_client_proto.client_id} is already used.")
|
150
150
|
|
151
151
|
@pytest.mark.usefixtures("raise_db_error_on_query")
|
152
152
|
def test_grid_dberror(self, dbsession):
|
tests/test_ogc_servers.py
CHANGED
@@ -17,8 +17,8 @@ def ogc_server_test_data(dbsession, transact):
|
|
17
17
|
auth = ["No auth", "Standard auth", "Geoserver auth", "Proxy"]
|
18
18
|
servers = []
|
19
19
|
for i in range(0, 8):
|
20
|
-
server = OGCServer(name="server_{}"
|
21
|
-
server.url = "https://somebasicurl_{}.com"
|
20
|
+
server = OGCServer(name=f"server_{i}", description=f"description_{i}")
|
21
|
+
server.url = f"https://somebasicurl_{i}.com"
|
22
22
|
server.image_type = "image/jpeg" if i % 2 == 0 else "image/png"
|
23
23
|
server.auth = auth[i % 4]
|
24
24
|
dbsession.add(server)
|
@@ -81,7 +81,7 @@ class TestOGCServer(AbstractViewsTests):
|
|
81
81
|
|
82
82
|
def test_edit(self, test_app, ogc_server_test_data):
|
83
83
|
ogc_server = ogc_server_test_data["ogc_servers"][0]
|
84
|
-
resp = test_app.get("/admin/ogc_servers/{
|
84
|
+
resp = test_app.get(f"/admin/ogc_servers/{ogc_server.id}", status=200)
|
85
85
|
form = resp.form
|
86
86
|
assert str(ogc_server.id) == self.get_first_field_named(form, "id").value
|
87
87
|
assert "hidden" == self.get_first_field_named(form, "id").attrs["type"]
|
@@ -95,14 +95,14 @@ class TestOGCServer(AbstractViewsTests):
|
|
95
95
|
|
96
96
|
ogc_server = ogc_server_test_data["ogc_servers"][0]
|
97
97
|
deleted_id = ogc_server.id
|
98
|
-
test_app.delete("/admin/ogc_servers/{}"
|
98
|
+
test_app.delete(f"/admin/ogc_servers/{deleted_id}", status=200)
|
99
99
|
assert dbsession.query(OGCServer).get(deleted_id) is None
|
100
100
|
|
101
101
|
def test_duplicate(self, ogc_server_test_data, test_app, dbsession):
|
102
102
|
from c2cgeoportal_commons.models.main import OGCServer
|
103
103
|
|
104
104
|
ogc_server = ogc_server_test_data["ogc_servers"][3]
|
105
|
-
resp = test_app.get("/admin/ogc_servers/{}/duplicate"
|
105
|
+
resp = test_app.get(f"/admin/ogc_servers/{ogc_server.id}/duplicate", status=200)
|
106
106
|
form = resp.form
|
107
107
|
assert "" == self.get_first_field_named(form, "id").value
|
108
108
|
self.set_first_field_named(form, "name", "clone")
|
@@ -115,16 +115,16 @@ class TestOGCServer(AbstractViewsTests):
|
|
115
115
|
|
116
116
|
def test_unicity_validator(self, ogc_server_test_data, test_app):
|
117
117
|
ogc_server = ogc_server_test_data["ogc_servers"][3]
|
118
|
-
resp = test_app.get("/admin/ogc_servers/{}/duplicate"
|
118
|
+
resp = test_app.get(f"/admin/ogc_servers/{ogc_server.id}/duplicate", status=200)
|
119
119
|
|
120
120
|
resp = resp.form.submit("submit")
|
121
121
|
|
122
|
-
self._check_submission_problem(resp, "{} is already used."
|
122
|
+
self._check_submission_problem(resp, f"{ogc_server.name} is already used.")
|
123
123
|
|
124
124
|
def test_check_success(self, ogc_server_test_data, test_app):
|
125
125
|
ogc_server = ogc_server_test_data["ogc_servers"][3]
|
126
126
|
ogc_server.url = "config://mapserver"
|
127
|
-
resp = test_app.get("/admin/ogc_servers/{}/synchronize"
|
127
|
+
resp = test_app.get(f"/admin/ogc_servers/{ogc_server.id}/synchronize", status=200)
|
128
128
|
|
129
129
|
resp = resp.forms["form-check"].submit("submit")
|
130
130
|
|
@@ -135,7 +135,7 @@ class TestOGCServer(AbstractViewsTests):
|
|
135
135
|
def test_dry_run_success(self, ogc_server_test_data, test_app):
|
136
136
|
ogc_server = ogc_server_test_data["ogc_servers"][3]
|
137
137
|
ogc_server.url = "config://mapserver"
|
138
|
-
resp = test_app.get("/admin/ogc_servers/{}/synchronize"
|
138
|
+
resp = test_app.get(f"/admin/ogc_servers/{ogc_server.id}/synchronize", status=200)
|
139
139
|
|
140
140
|
resp = resp.forms["form-dry-run"].submit("submit")
|
141
141
|
|
@@ -146,10 +146,21 @@ class TestOGCServer(AbstractViewsTests):
|
|
146
146
|
def test_synchronize_success(self, ogc_server_test_data, test_app):
|
147
147
|
ogc_server = ogc_server_test_data["ogc_servers"][3]
|
148
148
|
ogc_server.url = "config://mapserver"
|
149
|
-
resp = test_app.get("/admin/ogc_servers/{}/synchronize"
|
149
|
+
resp = test_app.get(f"/admin/ogc_servers/{ogc_server.id}/synchronize", status=200)
|
150
150
|
|
151
151
|
resp = resp.forms["form-synchronize"].submit("submit")
|
152
152
|
|
153
153
|
assert list(resp.html.find("div", class_="alert-success").stripped_strings) == [
|
154
154
|
"OGC Server has been successfully synchronized."
|
155
155
|
]
|
156
|
+
|
157
|
+
form = resp.forms["form-synchronize"]
|
158
|
+
form["force-parents"].checked = True
|
159
|
+
form["force-ordering"].checked = True
|
160
|
+
form["clean"].checked = True
|
161
|
+
|
162
|
+
resp = form.submit("submit")
|
163
|
+
|
164
|
+
assert list(resp.html.find("div", class_="alert-success").stripped_strings) == [
|
165
|
+
"OGC Server has been successfully synchronized."
|
166
|
+
]
|
tests/test_restriction_areas.py
CHANGED
@@ -25,16 +25,16 @@ def restriction_area_test_data(dbsession, transact):
|
|
25
25
|
ogc_server = OGCServer(name="test_server")
|
26
26
|
layers = []
|
27
27
|
for i in range(0, 4):
|
28
|
-
layer = LayerWMS(name="layer_{}"
|
28
|
+
layer = LayerWMS(name=f"layer_{i}", layer=f"layer_{i}", public=False)
|
29
29
|
layer.ogc_server = ogc_server
|
30
30
|
layers.append(layer)
|
31
31
|
dbsession.add_all(layers)
|
32
32
|
|
33
33
|
restrictionareas = []
|
34
34
|
for i in range(0, 4):
|
35
|
-
restrictionarea = RestrictionArea(name="restrictionarea_{}"
|
35
|
+
restrictionarea = RestrictionArea(name=f"restrictionarea_{i}")
|
36
36
|
restrictionarea.area = from_shape(box(485869.5728, 76443.1884, 837076.5648, 299941.7864), srid=21781)
|
37
|
-
restrictionarea.description = "description_{}"
|
37
|
+
restrictionarea.description = f"description_{i}"
|
38
38
|
restrictionarea.roles = [roles[i % 4], roles[(i + 2) % 4]]
|
39
39
|
restrictionarea.layers = [layers[i % 4], layers[(i + 2) % 4]]
|
40
40
|
dbsession.add(restrictionarea)
|
@@ -113,16 +113,16 @@ class TestRestrictionAreaViews(TestTreeGroup):
|
|
113
113
|
assert restriction_area.name == "new_name"
|
114
114
|
assert restriction_area.description == "new_description"
|
115
115
|
assert restriction_area.readwrite
|
116
|
-
assert set(restriction_area.roles) ==
|
117
|
-
assert set(restriction_area.layers) ==
|
116
|
+
assert set(restriction_area.roles) == {roles[0], roles[1]}
|
117
|
+
assert set(restriction_area.layers) == {layers[0], layers[1]}
|
118
118
|
|
119
119
|
def test_unicity_validator(self, restriction_area_test_data, test_app):
|
120
120
|
restriction_area = restriction_area_test_data["restriction_areas"][2]
|
121
121
|
|
122
|
-
resp = test_app.get("/admin/restriction_areas/{}/duplicate"
|
122
|
+
resp = test_app.get(f"/admin/restriction_areas/{restriction_area.id}/duplicate", status=200)
|
123
123
|
resp = resp.form.submit("submit")
|
124
124
|
|
125
|
-
self._check_submission_problem(resp, "{} is already used."
|
125
|
+
self._check_submission_problem(resp, f"{restriction_area.name} is already used.")
|
126
126
|
|
127
127
|
def test_edit(self, test_app, restriction_area_test_data, dbsession):
|
128
128
|
restriction_area = restriction_area_test_data["restriction_areas"][0]
|
@@ -162,14 +162,14 @@ class TestRestrictionAreaViews(TestTreeGroup):
|
|
162
162
|
|
163
163
|
dbsession.expire(restriction_area)
|
164
164
|
assert restriction_area.description == "new_description"
|
165
|
-
assert set(restriction_area.roles) ==
|
165
|
+
assert set(restriction_area.roles) == {roles[i] for i in range(0, 3)}
|
166
166
|
|
167
167
|
def test_delete(self, test_app, restriction_area_test_data, dbsession):
|
168
168
|
from c2cgeoportal_commons.models.main import RestrictionArea
|
169
169
|
|
170
170
|
restriction_area = restriction_area_test_data["restriction_areas"][0]
|
171
171
|
deleted_id = restriction_area.id
|
172
|
-
test_app.delete("/admin/restriction_areas/{}"
|
172
|
+
test_app.delete(f"/admin/restriction_areas/{deleted_id}", status=200)
|
173
173
|
assert dbsession.query(RestrictionArea).get(deleted_id) is None
|
174
174
|
|
175
175
|
def test_duplicate(self, restriction_area_test_data, test_app, dbsession):
|
@@ -181,9 +181,7 @@ class TestRestrictionAreaViews(TestTreeGroup):
|
|
181
181
|
# Ensure restriction_area.layers is loaded with relationship "order_by"
|
182
182
|
dbsession.expire(restriction_area)
|
183
183
|
|
184
|
-
form = test_app.get(
|
185
|
-
"/admin/restriction_areas/{}/duplicate".format(restriction_area.id), status=200
|
186
|
-
).form
|
184
|
+
form = test_app.get(f"/admin/restriction_areas/{restriction_area.id}/duplicate", status=200).form
|
187
185
|
|
188
186
|
assert "" == self.get_first_field_named(form, "id").value
|
189
187
|
self._check_roles(form, roles, restriction_area)
|
tests/test_role.py
CHANGED
@@ -19,17 +19,18 @@ def roles_test_data(dbsession, transact):
|
|
19
19
|
from c2cgeoportal_commons.models.main import Functionality, RestrictionArea, Role
|
20
20
|
from c2cgeoportal_commons.models.static import User
|
21
21
|
|
22
|
+
# Note that "default_basemap" is not relevant for roles
|
22
23
|
functionalities = {}
|
23
|
-
for name in ("default_basemap", "
|
24
|
+
for name in ("default_basemap", "default_theme", "print_template"):
|
24
25
|
functionalities[name] = []
|
25
26
|
for v in range(0, 4):
|
26
|
-
functionality = Functionality(name=name, value="value_{}"
|
27
|
+
functionality = Functionality(name=name, value=f"value_{v}")
|
27
28
|
dbsession.add(functionality)
|
28
29
|
functionalities[name].append(functionality)
|
29
30
|
|
30
31
|
restrictionareas = []
|
31
32
|
for i in range(0, 5):
|
32
|
-
restrictionarea = RestrictionArea(name="restrictionarea_{}"
|
33
|
+
restrictionarea = RestrictionArea(name=f"restrictionarea_{i}")
|
33
34
|
dbsession.add(restrictionarea)
|
34
35
|
restrictionareas.append(restrictionarea)
|
35
36
|
|
@@ -37,9 +38,9 @@ def roles_test_data(dbsession, transact):
|
|
37
38
|
for i in range(0, 23):
|
38
39
|
role = Role("secretary_" + str(i))
|
39
40
|
role.functionalities = [
|
40
|
-
functionalities["
|
41
|
-
functionalities["
|
42
|
-
functionalities["
|
41
|
+
functionalities["default_theme"][0],
|
42
|
+
functionalities["print_template"][0],
|
43
|
+
functionalities["print_template"][1],
|
43
44
|
]
|
44
45
|
role.restrictionareas = [restrictionareas[0], restrictionareas[1]]
|
45
46
|
role.extent = from_shape(box(485869.5728, 76443.1884, 837076.5648, 299941.7864), srid=21781)
|
@@ -120,7 +121,7 @@ class TestRole(TestTreeGroup):
|
|
120
121
|
("extent", ""),
|
121
122
|
("__start__", "functionalities:sequence"),
|
122
123
|
("functionalities", str(functionalities["default_basemap"][0].id)),
|
123
|
-
("functionalities", str(functionalities["
|
124
|
+
("functionalities", str(functionalities["print_template"][1].id)),
|
124
125
|
("__end__", "functionalities:sequence"),
|
125
126
|
("__start__", "restrictionareas:sequence"),
|
126
127
|
("restrictionareas", str(restrictionareas[0].id)),
|
@@ -146,11 +147,12 @@ class TestRole(TestTreeGroup):
|
|
146
147
|
|
147
148
|
assert role.name == "new_name"
|
148
149
|
assert role.description == "new_description"
|
149
|
-
assert set(role.functionalities) ==
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
assert set(role.
|
150
|
+
assert set(role.functionalities) == {
|
151
|
+
functionalities["default_basemap"][0],
|
152
|
+
functionalities["print_template"][1],
|
153
|
+
}
|
154
|
+
assert set(role.restrictionareas) == {restrictionareas[0], restrictionareas[1]}
|
155
|
+
assert set(role.users) == {users[0], users[1]}
|
154
156
|
|
155
157
|
def test_edit(self, dbsession, test_app, roles_test_data):
|
156
158
|
role = roles_test_data["roles"][10]
|
@@ -174,33 +176,33 @@ class TestRole(TestTreeGroup):
|
|
174
176
|
assert expected.almost_equals(shape(json.loads(form["extent"].value)), decimal=0)
|
175
177
|
|
176
178
|
functionalities = roles_test_data["functionalities"]
|
177
|
-
assert
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
functionalities["location"][1].id,
|
183
|
-
)
|
184
|
-
)
|
185
|
-
== set(f.id for f in role.functionalities)
|
186
|
-
)
|
179
|
+
assert {
|
180
|
+
functionalities["default_theme"][0].id,
|
181
|
+
functionalities["print_template"][0].id,
|
182
|
+
functionalities["print_template"][1].id,
|
183
|
+
} == {f.id for f in role.functionalities}
|
187
184
|
self.check_checkboxes(
|
188
185
|
form,
|
189
186
|
"functionalities",
|
190
187
|
[
|
191
188
|
{
|
192
|
-
"label": "{}={
|
189
|
+
"label": f"{f.name}={f.value}",
|
193
190
|
"value": str(f.id),
|
194
191
|
"checked": f in role.functionalities,
|
195
192
|
}
|
196
|
-
for f in
|
197
|
-
[
|
193
|
+
for f in sorted(
|
194
|
+
[
|
195
|
+
f
|
196
|
+
for f in sum(functionalities.values(), [])
|
197
|
+
if f.name in ("default_theme", "print_template")
|
198
|
+
],
|
199
|
+
key=lambda f: (f.name, f.value),
|
198
200
|
)
|
199
201
|
],
|
200
202
|
)
|
201
203
|
|
202
204
|
ras = roles_test_data["restrictionareas"]
|
203
|
-
assert
|
205
|
+
assert {ras[0].id, ras[1].id} == {ra.id for ra in role.restrictionareas}
|
204
206
|
self.check_checkboxes(
|
205
207
|
form,
|
206
208
|
"restrictionareas",
|
@@ -237,9 +239,9 @@ class TestRole(TestTreeGroup):
|
|
237
239
|
)
|
238
240
|
|
239
241
|
functionality_ids = [
|
240
|
-
roles_test_data["functionalities"]["
|
241
|
-
roles_test_data["functionalities"]["
|
242
|
-
roles_test_data["functionalities"]["
|
242
|
+
roles_test_data["functionalities"]["default_theme"][1].id,
|
243
|
+
roles_test_data["functionalities"]["print_template"][1].id,
|
244
|
+
roles_test_data["functionalities"]["print_template"][2].id,
|
243
245
|
]
|
244
246
|
form["functionalities"] = [str(id) for id in functionality_ids]
|
245
247
|
|
@@ -268,15 +270,15 @@ class TestRole(TestTreeGroup):
|
|
268
270
|
)
|
269
271
|
assert expected.almost_equals(to_shape(role.extent), decimal=0)
|
270
272
|
|
271
|
-
assert set(functionality_ids) ==
|
272
|
-
assert set(ra_ids) ==
|
273
|
+
assert set(functionality_ids) == {f.id for f in role.functionalities}
|
274
|
+
assert set(ra_ids) == {f.id for f in role.restrictionareas}
|
273
275
|
|
274
276
|
def test_duplicate(self, roles_test_data, test_app, dbsession):
|
275
277
|
from c2cgeoportal_commons.models.main import Role
|
276
278
|
|
277
279
|
role_proto = roles_test_data["roles"][7]
|
278
280
|
|
279
|
-
resp = test_app.get("/admin/roles/{}/duplicate"
|
281
|
+
resp = test_app.get(f"/admin/roles/{role_proto.id}/duplicate", status=200)
|
280
282
|
form = resp.form
|
281
283
|
|
282
284
|
assert "" == self.get_first_field_named(form, "id").value
|
@@ -298,16 +300,16 @@ class TestRole(TestTreeGroup):
|
|
298
300
|
from c2cgeoportal_commons.models.main import Role
|
299
301
|
|
300
302
|
role_id = dbsession.query(Role.id).first().id
|
301
|
-
test_app.delete("/admin/roles/{}"
|
303
|
+
test_app.delete(f"/admin/roles/{role_id}", status=200)
|
302
304
|
assert dbsession.query(Role).get(role_id) is None
|
303
305
|
|
304
306
|
def test_unicity_validator(self, roles_test_data, test_app):
|
305
307
|
role_proto = roles_test_data["roles"][7]
|
306
|
-
resp = test_app.get("/admin/roles/{}/duplicate"
|
308
|
+
resp = test_app.get(f"/admin/roles/{role_proto.id}/duplicate", status=200)
|
307
309
|
|
308
310
|
resp = resp.form.submit("submit")
|
309
311
|
|
310
|
-
self._check_submission_problem(resp, "{} is already used."
|
312
|
+
self._check_submission_problem(resp, f"{role_proto.name} is already used.")
|
311
313
|
|
312
314
|
@pytest.mark.usefixtures("raise_db_error_on_query")
|
313
315
|
def test_grid_dberror(self, dbsession):
|