c2cgeoportal-admin 2.5.0.100__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 +19 -12
- c2cgeoportal_admin/lib/__init__.py +0 -0
- c2cgeoportal_admin/lib/lingua_extractor.py +77 -0
- c2cgeoportal_admin/lib/ogcserver_synchronizer.py +409 -0
- c2cgeoportal_admin/py.typed +0 -0
- c2cgeoportal_admin/routes.py +18 -10
- c2cgeoportal_admin/schemas/dimensions.py +13 -11
- c2cgeoportal_admin/schemas/functionalities.py +63 -22
- c2cgeoportal_admin/schemas/interfaces.py +23 -19
- c2cgeoportal_admin/schemas/metadata.py +121 -47
- c2cgeoportal_admin/schemas/restriction_areas.py +22 -20
- c2cgeoportal_admin/schemas/roles.py +8 -6
- c2cgeoportal_admin/schemas/treegroup.py +84 -18
- c2cgeoportal_admin/schemas/treeitem.py +2 -3
- c2cgeoportal_admin/static/layertree.css +26 -4
- c2cgeoportal_admin/static/navbar.css +59 -36
- c2cgeoportal_admin/static/theme.css +48 -11
- c2cgeoportal_admin/subscribers.py +3 -3
- c2cgeoportal_admin/templates/404.jinja2 +23 -0
- c2cgeoportal_admin/templates/edit.jinja2 +23 -0
- c2cgeoportal_admin/templates/home.jinja2 +23 -0
- c2cgeoportal_admin/templates/index.jinja2 +23 -0
- c2cgeoportal_admin/templates/layertree.jinja2 +55 -11
- c2cgeoportal_admin/templates/layout.jinja2 +23 -0
- c2cgeoportal_admin/templates/navigation_navbar.jinja2 +56 -0
- c2cgeoportal_admin/templates/ogcserver_synchronize.jinja2 +90 -0
- c2cgeoportal_admin/templates/widgets/child.pt +35 -3
- c2cgeoportal_admin/templates/widgets/children.pt +121 -92
- c2cgeoportal_admin/templates/widgets/dimension.pt +23 -0
- c2cgeoportal_admin/templates/widgets/dimensions.pt +23 -0
- c2cgeoportal_admin/templates/widgets/functionality_fields.pt +51 -0
- c2cgeoportal_admin/templates/widgets/layer_fields.pt +23 -0
- c2cgeoportal_admin/templates/widgets/layer_group_fields.pt +23 -0
- c2cgeoportal_admin/templates/widgets/layer_v1_fields.pt +23 -0
- c2cgeoportal_admin/templates/widgets/metadata.pt +30 -1
- c2cgeoportal_admin/templates/widgets/metadatas.pt +23 -0
- c2cgeoportal_admin/templates/widgets/ogcserver_fields.pt +23 -0
- c2cgeoportal_admin/templates/widgets/restriction_area_fields.pt +25 -9
- c2cgeoportal_admin/templates/widgets/role_fields.pt +52 -25
- c2cgeoportal_admin/templates/widgets/theme_fields.pt +23 -0
- c2cgeoportal_admin/templates/widgets/user_fields.pt +23 -0
- 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 +8 -8
- 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 +45 -37
- c2cgeoportal_admin/views/layers_wmts.py +39 -33
- c2cgeoportal_admin/views/layertree.py +34 -26
- c2cgeoportal_admin/views/oauth2_clients.py +89 -0
- c2cgeoportal_admin/views/ogc_servers.py +130 -27
- c2cgeoportal_admin/views/restriction_areas.py +50 -8
- c2cgeoportal_admin/views/roles.py +60 -8
- c2cgeoportal_admin/views/themes.py +15 -14
- c2cgeoportal_admin/views/themes_ordering.py +38 -18
- c2cgeoportal_admin/views/treeitems.py +12 -11
- c2cgeoportal_admin/views/users.py +7 -5
- c2cgeoportal_admin/widgets.py +79 -28
- {c2cgeoportal_admin-2.5.0.100.dist-info → c2cgeoportal_admin-2.7.1.156.dist-info}/METADATA +16 -11
- c2cgeoportal_admin-2.7.1.156.dist-info/RECORD +92 -0
- {c2cgeoportal_admin-2.5.0.100.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 +23 -18
- tests/conftest.py +4 -15
- tests/test_edit_url.py +16 -18
- tests/test_functionalities.py +23 -10
- tests/test_interface.py +8 -8
- tests/test_layer_groups.py +15 -23
- tests/test_layers_vectortiles.py +16 -20
- tests/test_layers_wms.py +37 -75
- tests/test_layers_wmts.py +20 -24
- tests/test_layertree.py +107 -100
- tests/test_learn.py +1 -1
- tests/test_lingua_extractor_config.py +66 -0
- tests/test_main.py +4 -2
- tests/test_metadatas.py +79 -70
- tests/test_oauth2_clients.py +157 -0
- tests/test_ogc_servers.py +51 -7
- tests/test_restriction_areas.py +81 -17
- tests/test_role.py +110 -76
- tests/test_themes.py +44 -37
- tests/test_themes_ordering.py +1 -1
- tests/test_treegroup.py +2 -2
- tests/test_user.py +31 -64
- tests/themes_ordering.py +1 -1
- c2cgeoportal_admin/templates/navigation_vertical.jinja2 +0 -10
- c2cgeoportal_admin-2.5.0.100.dist-info/RECORD +0 -84
- c2cgeoportal_admin-2.5.0.100.dist-info/entry_points.txt +0 -3
- {c2cgeoportal_admin-2.5.0.100.dist-info → c2cgeoportal_admin-2.7.1.156.dist-info}/top_level.txt +0 -0
tests/test_interface.py
CHANGED
@@ -12,18 +12,18 @@ from . import AbstractViewsTests
|
|
12
12
|
def interface_test_data(dbsession, transact):
|
13
13
|
del transact
|
14
14
|
|
15
|
-
from c2cgeoportal_commons.models.main import Interface,
|
15
|
+
from c2cgeoportal_commons.models.main import Interface, LayerWMS, OGCServer, Theme
|
16
16
|
|
17
17
|
themes = []
|
18
18
|
for i in range(0, 5):
|
19
|
-
theme = Theme(name="theme_{}"
|
19
|
+
theme = Theme(name=f"theme_{i}", ordering=1)
|
20
20
|
themes.append(theme)
|
21
21
|
|
22
|
-
servers = [OGCServer(name="server_{}"
|
22
|
+
servers = [OGCServer(name=f"server_{i}") for i in range(0, 4)]
|
23
23
|
|
24
24
|
layers = []
|
25
25
|
for i in range(0, 15):
|
26
|
-
layer = LayerWMS(name="layer_wms_{}"
|
26
|
+
layer = LayerWMS(name=f"layer_wms_{i}")
|
27
27
|
layer.public = 1 == i % 2
|
28
28
|
layer.ogc_server = servers[i % 4]
|
29
29
|
dbsession.add(layer)
|
@@ -31,7 +31,7 @@ def interface_test_data(dbsession, transact):
|
|
31
31
|
|
32
32
|
interfaces = []
|
33
33
|
for i in range(0, 5):
|
34
|
-
interface = Interface(name="interface_{}"
|
34
|
+
interface = Interface(name=f"interface_{i}", description=f"description_{i}")
|
35
35
|
interface.themes = [themes[i % 2], themes[(i + 5) % 5]]
|
36
36
|
interface.layers = [layers[i % 2], layers[(i + 4) % 5]]
|
37
37
|
|
@@ -101,7 +101,7 @@ class TestInterface(AbstractViewsTests):
|
|
101
101
|
descriptions = "{}, {}".format(
|
102
102
|
interface_test_data["interfaces"][0].description, interface_test_data["interfaces"][1].description
|
103
103
|
)
|
104
|
-
resp = test_app.get("/admin/interfaces/{
|
104
|
+
resp = test_app.get(f"/admin/interfaces/{interface.id}", status=200)
|
105
105
|
form = resp.form
|
106
106
|
form["description"] = descriptions
|
107
107
|
assert str(interface.id) == self.get_first_field_named(form, "id").value
|
@@ -114,12 +114,12 @@ class TestInterface(AbstractViewsTests):
|
|
114
114
|
from c2cgeoportal_commons.models.main import Interface
|
115
115
|
|
116
116
|
interface = interface_test_data["interfaces"][0]
|
117
|
-
test_app.delete("/admin/interfaces/{
|
117
|
+
test_app.delete(f"/admin/interfaces/{interface.id}", status=200)
|
118
118
|
assert len(dbsession.query(Interface).filter(Interface.id == interface.id).all()) == 0
|
119
119
|
|
120
120
|
def test_duplicate(self, interface_test_data, test_app):
|
121
121
|
interface = interface_test_data["interfaces"][3]
|
122
|
-
resp = test_app.get("/admin/interfaces/{}/duplicate"
|
122
|
+
resp = test_app.get(f"/admin/interfaces/{interface.id}/duplicate", status=200)
|
123
123
|
form = resp.form
|
124
124
|
assert "" == self.get_first_field_named(form, "id").value
|
125
125
|
assert str(interface.description or "") == "description_3"
|
tests/test_layer_groups.py
CHANGED
@@ -12,7 +12,7 @@ from .test_treegroup import TestTreeGroup
|
|
12
12
|
def layer_groups_test_data(dbsession, transact):
|
13
13
|
del transact
|
14
14
|
|
15
|
-
from c2cgeoportal_commons.models.main import LayerGroup,
|
15
|
+
from c2cgeoportal_commons.models.main import LayerGroup, LayergroupTreeitem, Metadata
|
16
16
|
|
17
17
|
metadatas_protos = [
|
18
18
|
("copyable", "true"),
|
@@ -22,7 +22,7 @@ def layer_groups_test_data(dbsession, transact):
|
|
22
22
|
|
23
23
|
groups = []
|
24
24
|
for i in range(0, 12):
|
25
|
-
group = LayerGroup(name="groups_{
|
25
|
+
group = LayerGroup(name=f"groups_{i:02d}")
|
26
26
|
group.metadatas = [
|
27
27
|
Metadata(name=metadatas_protos[id][0], value=metadatas_protos[id][1])
|
28
28
|
for id in [i % 3, (i + 2) % 3]
|
@@ -73,7 +73,6 @@ class TestLayersGroups(TestTreeGroup):
|
|
73
73
|
("id", "id", "true"),
|
74
74
|
("name", "Name"),
|
75
75
|
("description", "Description"),
|
76
|
-
("is_expanded", "Expanded"),
|
77
76
|
("parents_relation", "Parents", "false"),
|
78
77
|
("metadatas", "Metadatas", "false"),
|
79
78
|
]
|
@@ -90,10 +89,6 @@ class TestLayersGroups(TestTreeGroup):
|
|
90
89
|
assert "groups_02, groups_06" == row["parents_relation"]
|
91
90
|
assert "disclaimer: © le momo, copyable: true" == row["metadatas"]
|
92
91
|
|
93
|
-
@pytest.mark.skip(reason="use value to be defined")
|
94
|
-
def test_grid_filter_on_parents(self, test_app):
|
95
|
-
self.check_search(test_app, "groups_11", total=4)
|
96
|
-
|
97
92
|
def test_grid_search(self, test_app):
|
98
93
|
# search on metadatas
|
99
94
|
self.check_search(test_app, "copyable", total=8)
|
@@ -107,8 +102,6 @@ class TestLayersGroups(TestTreeGroup):
|
|
107
102
|
assert "hidden" == self.get_first_field_named(form, "id").attrs["type"]
|
108
103
|
assert group.name == self.get_first_field_named(form, "name").value
|
109
104
|
assert str(group.description or "") == self.get_first_field_named(form, "description").value
|
110
|
-
assert group.is_expanded is False
|
111
|
-
assert group.is_expanded == form["is_expanded"].checked
|
112
105
|
|
113
106
|
self.check_children(
|
114
107
|
form,
|
@@ -125,7 +118,6 @@ class TestLayersGroups(TestTreeGroup):
|
|
125
118
|
new_values = {
|
126
119
|
"name": "new_name",
|
127
120
|
"description": "new description",
|
128
|
-
"is_expanded": True,
|
129
121
|
}
|
130
122
|
for key, value in new_values.items():
|
131
123
|
self.set_first_field_named(form, key, value)
|
@@ -148,7 +140,7 @@ class TestLayersGroups(TestTreeGroup):
|
|
148
140
|
"""
|
149
141
|
groups = layer_groups_test_data["groups"]
|
150
142
|
resp = test_app.post(
|
151
|
-
"{}/new"
|
143
|
+
f"{self._prefix}/new",
|
152
144
|
(
|
153
145
|
("_charset_", "UTF-8"),
|
154
146
|
("__formid__", "deform"),
|
@@ -169,7 +161,7 @@ class TestLayersGroups(TestTreeGroup):
|
|
169
161
|
def test_post_new_with_children_success(self, test_app, dbsession, layer_groups_test_data):
|
170
162
|
groups = layer_groups_test_data["groups"]
|
171
163
|
resp = test_app.post(
|
172
|
-
"{}/new"
|
164
|
+
f"{self._prefix}/new",
|
173
165
|
(
|
174
166
|
("_charset_", "UTF-8"),
|
175
167
|
("__formid__", "deform"),
|
@@ -211,10 +203,12 @@ class TestLayersGroups(TestTreeGroup):
|
|
211
203
|
]
|
212
204
|
|
213
205
|
def test_post_with_ancestor(self, layer_groups_test_data, test_app):
|
214
|
-
"""
|
206
|
+
"""
|
207
|
+
Check that ancestors are refused to avoid cycles.
|
208
|
+
"""
|
215
209
|
groups = layer_groups_test_data["groups"]
|
216
210
|
resp = test_app.post(
|
217
|
-
"{}/{
|
211
|
+
f"{self._prefix}/{groups[3].id}",
|
218
212
|
(
|
219
213
|
("_charset_", "UTF-8"),
|
220
214
|
("__formid__", "deform"),
|
@@ -232,7 +226,7 @@ class TestLayersGroups(TestTreeGroup):
|
|
232
226
|
status=200,
|
233
227
|
)
|
234
228
|
assert (
|
235
|
-
"Value {} does not exist in table treeitem or is not allowed to avoid cycles"
|
229
|
+
f"Value {groups[1].id} does not exist in table treeitem or is not allowed to avoid cycles"
|
236
230
|
== resp.html.select_one(".item-children_relation + .help-block").getText().strip()
|
237
231
|
)
|
238
232
|
|
@@ -241,7 +235,7 @@ class TestLayersGroups(TestTreeGroup):
|
|
241
235
|
|
242
236
|
group = layer_groups_test_data["groups"][1]
|
243
237
|
|
244
|
-
resp = test_app.get("{}/{}/duplicate"
|
238
|
+
resp = test_app.get(f"{self._prefix}/{group.id}/duplicate", status=200)
|
245
239
|
form = resp.form
|
246
240
|
|
247
241
|
group = dbsession.query(LayerGroup).filter(LayerGroup.id == group.id).one()
|
@@ -249,8 +243,6 @@ class TestLayersGroups(TestTreeGroup):
|
|
249
243
|
assert "" == self.get_first_field_named(form, "id").value
|
250
244
|
assert group.name == self.get_first_field_named(form, "name").value
|
251
245
|
assert str(group.description or "") == self.get_first_field_named(form, "description").value
|
252
|
-
assert group.is_expanded is False
|
253
|
-
assert group.is_expanded == form["is_expanded"].checked
|
254
246
|
|
255
247
|
self.check_children(
|
256
248
|
form,
|
@@ -267,7 +259,7 @@ class TestLayersGroups(TestTreeGroup):
|
|
267
259
|
duplicated = dbsession.query(LayerGroup).filter(LayerGroup.name == "duplicated").one()
|
268
260
|
|
269
261
|
assert str(duplicated.id) == re.match(
|
270
|
-
|
262
|
+
rf"http://localhost{self._prefix}/(.*)\?msg_col=submit_ok", resp.location
|
271
263
|
).group(1)
|
272
264
|
assert duplicated.id != group.id
|
273
265
|
assert duplicated.children_relation[0].id != group.children_relation[0].id
|
@@ -275,14 +267,14 @@ class TestLayersGroups(TestTreeGroup):
|
|
275
267
|
|
276
268
|
def test_unicity_validator(self, layer_groups_test_data, test_app):
|
277
269
|
group = layer_groups_test_data["groups"][1]
|
278
|
-
resp = test_app.get("{}/{}/duplicate"
|
270
|
+
resp = test_app.get(f"{self._prefix}/{group.id}/duplicate", status=200)
|
279
271
|
|
280
272
|
resp = resp.form.submit("submit")
|
281
273
|
|
282
|
-
self._check_submission_problem(resp, "{} is already used."
|
274
|
+
self._check_submission_problem(resp, f"{group.name} is already used.")
|
283
275
|
|
284
276
|
def test_delete(self, test_app, dbsession, layer_groups_test_data):
|
285
|
-
from c2cgeoportal_commons.models.main import LayerGroup, TreeGroup, TreeItem
|
277
|
+
from c2cgeoportal_commons.models.main import LayerGroup, LayergroupTreeitem, TreeGroup, TreeItem
|
286
278
|
|
287
279
|
group_id = layer_groups_test_data["groups"][9].id
|
288
280
|
|
@@ -296,7 +288,7 @@ class TestLayersGroups(TestTreeGroup):
|
|
296
288
|
== dbsession.query(LayergroupTreeitem).filter(LayergroupTreeitem.treeitem_id == group_id).count()
|
297
289
|
)
|
298
290
|
|
299
|
-
test_app.delete("/admin/layer_groups/{}"
|
291
|
+
test_app.delete(f"/admin/layer_groups/{group_id}", status=200)
|
300
292
|
|
301
293
|
dbsession.expire_all()
|
302
294
|
|
tests/test_layers_vectortiles.py
CHANGED
@@ -14,13 +14,13 @@ def layer_vectortiles_test_data(dbsession, transact):
|
|
14
14
|
|
15
15
|
from c2cgeoportal_commons.models.main import LayerVectorTiles, OGCServer
|
16
16
|
|
17
|
-
servers = [OGCServer(name="server_{}"
|
17
|
+
servers = [OGCServer(name=f"server_{i}") for i in range(0, 4)]
|
18
18
|
for i, server in enumerate(servers):
|
19
|
-
server.url = "http://wms.geo.admin.ch_{}"
|
19
|
+
server.url = f"http://wms.geo.admin.ch_{i}"
|
20
20
|
server.image_type = "image/jpeg" if i % 2 == 0 else "image/png"
|
21
21
|
|
22
22
|
def layer_builder(i):
|
23
|
-
name = "layer_vectortiles_{}"
|
23
|
+
name = f"layer_vectortiles_{i}"
|
24
24
|
layer = LayerVectorTiles(name=name)
|
25
25
|
layer.layer = name
|
26
26
|
layer.public = 1 == i % 2
|
@@ -28,12 +28,12 @@ def layer_vectortiles_test_data(dbsession, transact):
|
|
28
28
|
layer.xyz = "https://vectortiles-staging.geoportail.lu/styles/roadmap/{z}/{x}/{y}.png"
|
29
29
|
return layer
|
30
30
|
|
31
|
-
|
32
|
-
|
31
|
+
data = factory_build_layers(layer_builder, dbsession)
|
32
|
+
data["default"] = get_test_default_layers(dbsession, server)
|
33
33
|
|
34
34
|
dbsession.flush()
|
35
35
|
|
36
|
-
yield
|
36
|
+
yield data
|
37
37
|
|
38
38
|
|
39
39
|
@pytest.mark.usefixtures("layer_vectortiles_test_data", "test_app")
|
@@ -85,10 +85,8 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
85
85
|
assert "" == self.get_first_field_named(form, "style").value
|
86
86
|
assert "" == self.get_first_field_named(form, "xyz").value
|
87
87
|
|
88
|
-
@pytest.mark.skip(reason="Not working now")
|
89
88
|
def test_grid_search(self, test_app):
|
90
|
-
|
91
|
-
self.check_search(test_app, "layer_vectortiles_1", total=1)
|
89
|
+
self.check_search(test_app, "layer_vectortiles_10", total=1)
|
92
90
|
|
93
91
|
def test_base_edit(self, test_app, layer_vectortiles_test_data):
|
94
92
|
layer = layer_vectortiles_test_data["layers"][10]
|
@@ -124,11 +122,11 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
124
122
|
assert str(layer.xyz or "") == form["xyz"].value
|
125
123
|
|
126
124
|
interfaces = layer_vectortiles_test_data["interfaces"]
|
127
|
-
assert
|
125
|
+
assert {interfaces[0].id, interfaces[2].id} == {i.id for i in layer.interfaces}
|
128
126
|
self._check_interfaces(form, interfaces, layer)
|
129
127
|
|
130
128
|
ras = layer_vectortiles_test_data["restrictionareas"]
|
131
|
-
assert
|
129
|
+
assert {ras[0].id, ras[2].id} == {i.id for i in layer.restrictionareas}
|
132
130
|
self._check_restrictionsareas(form, ras, layer)
|
133
131
|
|
134
132
|
new_values = {
|
@@ -148,7 +146,7 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
148
146
|
|
149
147
|
resp = form.submit("submit")
|
150
148
|
assert str(layer.id) == re.match(
|
151
|
-
|
149
|
+
rf"http://localhost{self._prefix}/(.*)\?msg_col=submit_ok", resp.location
|
152
150
|
).group(1)
|
153
151
|
|
154
152
|
dbsession.expire(layer)
|
@@ -157,10 +155,8 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
157
155
|
assert value == getattr(layer, key)
|
158
156
|
else:
|
159
157
|
assert str(value or "") == str(getattr(layer, key) or "")
|
160
|
-
assert
|
161
|
-
|
162
|
-
)
|
163
|
-
assert set([ras[1].id, ras[3].id]) == set([ra.id for ra in layer.restrictionareas])
|
158
|
+
assert {interfaces[1].id, interfaces[3].id} == {interface.id for interface in layer.interfaces}
|
159
|
+
assert {ras[1].id, ras[3].id} == {ra.id for ra in layer.restrictionareas}
|
164
160
|
|
165
161
|
def test_submit_new(self, dbsession, test_app, layer_vectortiles_test_data):
|
166
162
|
from c2cgeoportal_commons.models.main import LayerVectorTiles
|
@@ -187,7 +183,7 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
187
183
|
|
188
184
|
layer = layer_vectortiles_test_data["layers"][3]
|
189
185
|
|
190
|
-
resp = test_app.get("/admin/layers_vectortiles/{}/duplicate"
|
186
|
+
resp = test_app.get(f"/admin/layers_vectortiles/{layer.id}/duplicate", status=200)
|
191
187
|
form = resp.form
|
192
188
|
|
193
189
|
assert "" == self.get_first_field_named(form, "id").value
|
@@ -200,7 +196,7 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
200
196
|
assert str(layer.style or "") == form["style"].value
|
201
197
|
assert str(layer.xyz or "") == form["xyz"].value
|
202
198
|
interfaces = layer_vectortiles_test_data["interfaces"]
|
203
|
-
assert
|
199
|
+
assert {interfaces[3].id, interfaces[1].id} == {i.id for i in layer.interfaces}
|
204
200
|
self._check_interfaces(form, interfaces, layer)
|
205
201
|
|
206
202
|
self.set_first_field_named(form, "name", "clone")
|
@@ -216,11 +212,11 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
216
212
|
assert layer_vectortiles_test_data["layers"][3].metadatas[1].name == layer.metadatas[1].name
|
217
213
|
|
218
214
|
def test_delete(self, test_app, dbsession):
|
219
|
-
from c2cgeoportal_commons.models.main import
|
215
|
+
from c2cgeoportal_commons.models.main import Layer, LayerVectorTiles, TreeItem
|
220
216
|
|
221
217
|
layer_id = dbsession.query(LayerVectorTiles.id).first().id
|
222
218
|
|
223
|
-
test_app.delete("/admin/layers_vectortiles/{}"
|
219
|
+
test_app.delete(f"/admin/layers_vectortiles/{layer_id}", status=200)
|
224
220
|
|
225
221
|
assert dbsession.query(LayerVectorTiles).get(layer_id) is None
|
226
222
|
assert dbsession.query(Layer).get(layer_id) is None
|
tests/test_layers_wms.py
CHANGED
@@ -3,10 +3,8 @@
|
|
3
3
|
import re
|
4
4
|
|
5
5
|
import pytest
|
6
|
-
from selenium.webdriver.common.by import By
|
7
6
|
|
8
|
-
from . import AbstractViewsTests, factory_build_layers, get_test_default_layers
|
9
|
-
from .selenium.page import IndexPage
|
7
|
+
from . import AbstractViewsTests, factory_build_layers, get_test_default_layers
|
10
8
|
|
11
9
|
|
12
10
|
@pytest.fixture(scope="function")
|
@@ -16,27 +14,27 @@ def layer_wms_test_data(dbsession, transact):
|
|
16
14
|
|
17
15
|
from c2cgeoportal_commons.models.main import LayerWMS, OGCServer
|
18
16
|
|
19
|
-
servers = [OGCServer(name="server_{}"
|
17
|
+
servers = [OGCServer(name=f"server_{i}") for i in range(0, 4)]
|
20
18
|
for i, server in enumerate(servers):
|
21
|
-
server.url = "http://wms.geo.admin.ch_{}"
|
19
|
+
server.url = f"http://wms.geo.admin.ch_{i}"
|
22
20
|
server.image_type = "image/jpeg" if i % 2 == 0 else "image/png"
|
23
21
|
|
24
22
|
def layer_builder(i):
|
25
|
-
layer = LayerWMS(name="layer_wms_{}"
|
26
|
-
layer.layer = "layer_{}"
|
23
|
+
layer = LayerWMS(name=f"layer_wms_{i}")
|
24
|
+
layer.layer = f"layer_{i}"
|
27
25
|
layer.public = 1 == i % 2
|
28
|
-
layer.geo_table = "geotable_{}"
|
26
|
+
layer.geo_table = f"geotable_{i}"
|
29
27
|
layer.ogc_server = servers[i % 4]
|
30
28
|
layer.style = "décontrasté"
|
31
29
|
return layer
|
32
30
|
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
data = factory_build_layers(layer_builder, dbsession)
|
32
|
+
data["servers"] = servers
|
33
|
+
data["default"] = get_test_default_layers(dbsession, servers[1])
|
36
34
|
|
37
35
|
dbsession.flush()
|
38
36
|
|
39
|
-
yield
|
37
|
+
yield data
|
40
38
|
|
41
39
|
|
42
40
|
@pytest.mark.usefixtures("layer_wms_test_data", "test_app")
|
@@ -57,11 +55,13 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
57
55
|
("public", "Public"),
|
58
56
|
("geo_table", "Geo table"),
|
59
57
|
("exclude_properties", "Exclude properties"),
|
58
|
+
("ogc_server", "OGC server"),
|
60
59
|
("layer", "WMS layer name"),
|
61
60
|
("style", "Style"),
|
61
|
+
("valid", "Valid"),
|
62
|
+
("invalid_reason", "Reason why I am not valid"),
|
62
63
|
("time_mode", "Time mode"),
|
63
64
|
("time_widget", "Time widget"),
|
64
|
-
("ogc_server", "OGC server"),
|
65
65
|
("dimensions", "Dimensions", "false"),
|
66
66
|
("interfaces", "Interfaces"),
|
67
67
|
("restrictionareas", "Restriction areas", "false"),
|
@@ -173,11 +173,11 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
173
173
|
assert str(layer.time_widget) == form["time_widget"].value
|
174
174
|
|
175
175
|
interfaces = layer_wms_test_data["interfaces"]
|
176
|
-
assert
|
176
|
+
assert {interfaces[0].id, interfaces[2].id} == {i.id for i in layer.interfaces}
|
177
177
|
self._check_interfaces(form, interfaces, layer)
|
178
178
|
|
179
179
|
ras = layer_wms_test_data["restrictionareas"]
|
180
|
-
assert
|
180
|
+
assert {ras[0].id, ras[2].id} == {i.id for i in layer.restrictionareas}
|
181
181
|
self._check_restrictionsareas(form, ras, layer)
|
182
182
|
|
183
183
|
new_values = {
|
@@ -200,7 +200,7 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
200
200
|
|
201
201
|
resp = form.submit("submit")
|
202
202
|
assert str(layer.id) == re.match(
|
203
|
-
|
203
|
+
rf"http://localhost{self._prefix}/(.*)\?msg_col=submit_ok", resp.location
|
204
204
|
).group(1)
|
205
205
|
|
206
206
|
dbsession.expire(layer)
|
@@ -209,10 +209,8 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
209
209
|
assert value == getattr(layer, key)
|
210
210
|
else:
|
211
211
|
assert str(value or "") == str(getattr(layer, key) or "")
|
212
|
-
assert
|
213
|
-
|
214
|
-
)
|
215
|
-
assert set([ras[1].id, ras[3].id]) == set([ra.id for ra in layer.restrictionareas])
|
212
|
+
assert {interfaces[1].id, interfaces[3].id} == {interface.id for interface in layer.interfaces}
|
213
|
+
assert {ras[1].id, ras[3].id} == {ra.id for ra in layer.restrictionareas}
|
216
214
|
|
217
215
|
def test_submit_new(self, dbsession, test_app, layer_wms_test_data):
|
218
216
|
from c2cgeoportal_commons.models.main import LayerWMS
|
@@ -244,7 +242,7 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
244
242
|
|
245
243
|
layer = layer_wms_test_data["layers"][3]
|
246
244
|
|
247
|
-
resp = test_app.get("/admin/layers_wms/{}/duplicate"
|
245
|
+
resp = test_app.get(f"/admin/layers_wms/{layer.id}/duplicate", status=200)
|
248
246
|
form = resp.form
|
249
247
|
|
250
248
|
assert "" == self.get_first_field_named(form, "id").value
|
@@ -260,11 +258,11 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
260
258
|
assert str(layer.time_mode) == form["time_mode"].value
|
261
259
|
assert str(layer.time_widget) == form["time_widget"].value
|
262
260
|
interfaces = layer_wms_test_data["interfaces"]
|
263
|
-
assert
|
261
|
+
assert {interfaces[3].id, interfaces[1].id} == {i.id for i in layer.interfaces}
|
264
262
|
self._check_interfaces(form, interfaces, layer)
|
265
263
|
|
266
264
|
ras = layer_wms_test_data["restrictionareas"]
|
267
|
-
assert
|
265
|
+
assert {ras[3].id, ras[0].id} == {i.id for i in layer.restrictionareas}
|
268
266
|
self._check_restrictionsareas(form, ras, layer)
|
269
267
|
|
270
268
|
self._check_dimensions(resp.html, layer.dimensions, duplicated=True)
|
@@ -282,19 +280,16 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
282
280
|
assert layer_wms_test_data["layers"][3].metadatas[1].name == layer.metadatas[1].name
|
283
281
|
|
284
282
|
def test_convert_common_fields_copied(self, layer_wms_test_data, test_app, dbsession):
|
285
|
-
from c2cgeoportal_commons.models.main import
|
283
|
+
from c2cgeoportal_commons.models.main import LayerWMS, LayerWMTS
|
286
284
|
|
287
285
|
layer = layer_wms_test_data["layers"][3]
|
288
286
|
|
289
287
|
assert 0 == dbsession.query(LayerWMTS).filter(LayerWMTS.name == layer.name).count()
|
290
288
|
assert 1 == dbsession.query(LayerWMS).filter(LayerWMS.name == layer.name).count()
|
291
289
|
|
292
|
-
resp = test_app.post("/admin/layers_wms/{}/convert_to_wmts"
|
290
|
+
resp = test_app.post(f"/admin/layers_wms/{layer.id}/convert_to_wmts", status=200)
|
293
291
|
assert resp.json["success"]
|
294
|
-
assert
|
295
|
-
"http://localhost/admin/layers_wmts/{}?msg_col=submit_ok".format(layer.id)
|
296
|
-
== resp.json["redirect"]
|
297
|
-
)
|
292
|
+
assert f"http://localhost/admin/layers_wmts/{layer.id}?msg_col=submit_ok" == resp.json["redirect"]
|
298
293
|
|
299
294
|
assert 1 == dbsession.query(LayerWMTS).filter(LayerWMTS.name == layer.name).count()
|
300
295
|
assert 0 == dbsession.query(LayerWMS).filter(LayerWMS.name == layer.name).count()
|
@@ -328,23 +323,17 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
328
323
|
def test_convert_image_type_from_ogcserver(self, layer_wms_test_data, test_app):
|
329
324
|
layer = layer_wms_test_data["layers"][3]
|
330
325
|
|
331
|
-
resp = test_app.post("/admin/layers_wms/{}/convert_to_wmts"
|
326
|
+
resp = test_app.post(f"/admin/layers_wms/{layer.id}/convert_to_wmts", status=200)
|
332
327
|
assert resp.json["success"]
|
333
|
-
assert
|
334
|
-
"http://localhost/admin/layers_wmts/{}?msg_col=submit_ok".format(layer.id)
|
335
|
-
== resp.json["redirect"]
|
336
|
-
)
|
328
|
+
assert f"http://localhost/admin/layers_wmts/{layer.id}?msg_col=submit_ok" == resp.json["redirect"]
|
337
329
|
|
338
330
|
resp = test_app.get(resp.json["redirect"], status=200)
|
339
331
|
assert "image/png" == resp.form["image_type"].value
|
340
332
|
|
341
333
|
layer = layer_wms_test_data["layers"][2]
|
342
|
-
resp = test_app.post("/admin/layers_wms/{}/convert_to_wmts"
|
334
|
+
resp = test_app.post(f"/admin/layers_wms/{layer.id}/convert_to_wmts", status=200)
|
343
335
|
assert resp.json["success"]
|
344
|
-
assert
|
345
|
-
"http://localhost/admin/layers_wmts/{}?msg_col=submit_ok".format(layer.id)
|
346
|
-
== resp.json["redirect"]
|
347
|
-
)
|
336
|
+
assert f"http://localhost/admin/layers_wmts/{layer.id}?msg_col=submit_ok" == resp.json["redirect"]
|
348
337
|
|
349
338
|
resp = test_app.get(resp.json["redirect"], status=200)
|
350
339
|
assert "image/jpeg" == resp.form["image_type"].value
|
@@ -354,25 +343,25 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
354
343
|
|
355
344
|
dbsession.delete(LayerWMTS.get_default(dbsession))
|
356
345
|
layer = layer_wms_test_data["layers"][3]
|
357
|
-
test_app.post("/admin/layers_wms/{}/convert_to_wmts"
|
346
|
+
test_app.post(f"/admin/layers_wms/{layer.id}/convert_to_wmts", status=200)
|
358
347
|
|
359
348
|
def test_unicity_validator(self, layer_wms_test_data, test_app):
|
360
349
|
layer = layer_wms_test_data["layers"][2]
|
361
|
-
resp = test_app.get("/admin/layers_wms/{}/duplicate"
|
350
|
+
resp = test_app.get(f"/admin/layers_wms/{layer.id}/duplicate", status=200)
|
362
351
|
|
363
352
|
resp = resp.form.submit("submit")
|
364
353
|
|
365
|
-
self._check_submission_problem(resp, "{} is already used."
|
354
|
+
self._check_submission_problem(resp, f"{layer.name} is already used.")
|
366
355
|
|
367
356
|
def test_unicity_validator_does_not_matter_amongst_cousin(self, layer_wms_test_data, test_app, dbsession):
|
368
|
-
from c2cgeoportal_commons.models.main import
|
357
|
+
from c2cgeoportal_commons.models.main import LayerGroup, LayerWMS
|
369
358
|
|
370
359
|
assert 1 == dbsession.query(LayerGroup).filter(LayerGroup.name == "layer_group_0").count()
|
371
360
|
|
372
361
|
assert dbsession.query(LayerWMS).filter(LayerWMS.name == "layer_group_0").one_or_none() is None
|
373
362
|
|
374
363
|
layer = layer_wms_test_data["layers"][2]
|
375
|
-
resp = test_app.get("/admin/layers_wms/{}/duplicate"
|
364
|
+
resp = test_app.get(f"/admin/layers_wms/{layer.id}/duplicate", status=200)
|
376
365
|
self.set_first_field_named(resp.form, "name", "layer_group_0")
|
377
366
|
resp = resp.form.submit("submit")
|
378
367
|
|
@@ -382,18 +371,17 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
382
371
|
# assert str(layer.id) == re.match('http://localhost/admin/layers_wms/(.*)', resp.location).group(1)
|
383
372
|
|
384
373
|
def test_delete(self, test_app, dbsession):
|
385
|
-
from c2cgeoportal_commons.models.main import
|
374
|
+
from c2cgeoportal_commons.models.main import Layer, LayerWMS, TreeItem
|
386
375
|
|
387
376
|
layer_id = dbsession.query(LayerWMS.id).first().id
|
388
377
|
|
389
|
-
test_app.delete("/admin/layers_wms/{}"
|
378
|
+
test_app.delete(f"/admin/layers_wms/{layer_id}", status=200)
|
390
379
|
|
391
380
|
assert dbsession.query(LayerWMS).get(layer_id) is None
|
392
381
|
assert dbsession.query(Layer).get(layer_id) is None
|
393
382
|
assert dbsession.query(TreeItem).get(layer_id) is None
|
394
383
|
|
395
|
-
|
396
|
-
def test_submit_new_no_layer_name(self, test_app):
|
384
|
+
def test_submit_new_no_layer_name(self, test_app, layer_wms_test_data):
|
397
385
|
resp = test_app.post(
|
398
386
|
"/admin/layers_wms/new",
|
399
387
|
{
|
@@ -418,31 +406,5 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
418
406
|
"Errors have been highlighted below" == resp.html.select_one('div[class="error-msg-detail"]').text
|
419
407
|
)
|
420
408
|
assert ["WMS layer name"] == sorted(
|
421
|
-
|
409
|
+
(x.select_one("label").text.strip()) for x in resp.html.select("[class~='has-error']")
|
422
410
|
)
|
423
|
-
|
424
|
-
|
425
|
-
@skip_if_ci
|
426
|
-
@pytest.mark.selenium
|
427
|
-
@pytest.mark.usefixtures("selenium", "selenium_app", "layer_wms_test_data")
|
428
|
-
class TestLayerWMSSelenium:
|
429
|
-
|
430
|
-
_prefix = "/admin/layers_wms"
|
431
|
-
|
432
|
-
def test_index(self, selenium, selenium_app, layer_wms_test_data):
|
433
|
-
selenium.get(selenium_app + self._prefix)
|
434
|
-
|
435
|
-
layer = layer_wms_test_data["layers"][5]
|
436
|
-
index_page = IndexPage(selenium)
|
437
|
-
index_page.select_language("en")
|
438
|
-
index_page.check_pagination_info("Showing 1 to 25 of 26 rows", 10)
|
439
|
-
index_page.select_page_size(10)
|
440
|
-
index_page.check_pagination_info("Showing 1 to 10 of 26 rows", 10)
|
441
|
-
index_page.wait_jquery_to_be_active()
|
442
|
-
|
443
|
-
el = index_page.find_element(
|
444
|
-
By.XPATH, '//td[contains(text(),"{}")]'.format(layer.geo_table), timeout=5
|
445
|
-
)
|
446
|
-
index_page.dbl_click(el)
|
447
|
-
|
448
|
-
assert selenium.current_url.endswith("/admin/layers_wms/{}".format(layer.id))
|