c2cgeoportal-admin 2.5.0.100__py3-none-any.whl → 2.9rc44__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 +44 -14
- c2cgeoportal_admin/lib/__init__.py +0 -0
- c2cgeoportal_admin/lib/lingva_extractor.py +77 -0
- c2cgeoportal_admin/lib/ogcserver_synchronizer.py +410 -0
- c2cgeoportal_admin/py.typed +0 -0
- c2cgeoportal_admin/routes.py +30 -11
- c2cgeoportal_admin/schemas/dimensions.py +17 -11
- c2cgeoportal_admin/schemas/functionalities.py +60 -22
- c2cgeoportal_admin/schemas/interfaces.py +27 -19
- c2cgeoportal_admin/schemas/metadata.py +122 -48
- c2cgeoportal_admin/schemas/restriction_areas.py +26 -20
- c2cgeoportal_admin/schemas/roles.py +13 -7
- c2cgeoportal_admin/schemas/treegroup.py +90 -20
- c2cgeoportal_admin/schemas/treeitem.py +3 -4
- c2cgeoportal_admin/static/layertree.css +26 -4
- c2cgeoportal_admin/static/navbar.css +59 -36
- c2cgeoportal_admin/static/theme.css +51 -11
- c2cgeoportal_admin/subscribers.py +3 -3
- c2cgeoportal_admin/templates/404.jinja2 +41 -2
- 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/__init__.py +29 -0
- c2cgeoportal_admin/views/dimension_layers.py +14 -9
- c2cgeoportal_admin/views/functionalities.py +52 -18
- c2cgeoportal_admin/views/home.py +5 -5
- c2cgeoportal_admin/views/interfaces.py +29 -21
- c2cgeoportal_admin/views/layer_groups.py +36 -25
- c2cgeoportal_admin/views/layers.py +17 -13
- c2cgeoportal_admin/views/layers_cog.py +135 -0
- c2cgeoportal_admin/views/layers_vectortiles.py +62 -27
- c2cgeoportal_admin/views/layers_wms.py +61 -36
- c2cgeoportal_admin/views/layers_wmts.py +54 -32
- c2cgeoportal_admin/views/layertree.py +37 -28
- c2cgeoportal_admin/views/logged_views.py +83 -0
- c2cgeoportal_admin/views/logs.py +91 -0
- c2cgeoportal_admin/views/oauth2_clients.py +96 -0
- c2cgeoportal_admin/views/ogc_servers.py +192 -21
- c2cgeoportal_admin/views/restriction_areas.py +78 -25
- c2cgeoportal_admin/views/roles.py +88 -25
- c2cgeoportal_admin/views/themes.py +47 -35
- c2cgeoportal_admin/views/themes_ordering.py +44 -24
- c2cgeoportal_admin/views/treeitems.py +21 -17
- c2cgeoportal_admin/views/users.py +46 -26
- c2cgeoportal_admin/widgets.py +79 -28
- {c2cgeoportal_admin-2.5.0.100.dist-info → c2cgeoportal_admin-2.9rc44.dist-info}/METADATA +15 -13
- c2cgeoportal_admin-2.9rc44.dist-info/RECORD +97 -0
- {c2cgeoportal_admin-2.5.0.100.dist-info → c2cgeoportal_admin-2.9rc44.dist-info}/WHEEL +1 -1
- c2cgeoportal_admin-2.9rc44.dist-info/entry_points.txt +5 -0
- tests/__init__.py +36 -27
- tests/conftest.py +23 -24
- tests/test_edit_url.py +16 -19
- tests/test_functionalities.py +52 -14
- tests/test_home.py +0 -1
- tests/test_interface.py +35 -12
- tests/test_layer_groups.py +58 -32
- tests/test_layers_cog.py +243 -0
- tests/test_layers_vectortiles.py +46 -30
- tests/test_layers_wms.py +77 -82
- tests/test_layers_wmts.py +51 -30
- tests/test_layertree.py +107 -101
- tests/test_learn.py +1 -1
- tests/test_left_menu.py +0 -1
- tests/test_lingva_extractor_config.py +64 -0
- tests/test_logs.py +102 -0
- tests/test_main.py +4 -2
- tests/test_metadatas.py +79 -71
- tests/test_oauth2_clients.py +186 -0
- tests/test_ogc_servers.py +110 -28
- tests/test_restriction_areas.py +109 -20
- tests/test_role.py +142 -82
- tests/test_themes.py +75 -41
- tests/test_themes_ordering.py +1 -2
- tests/test_treegroup.py +2 -2
- tests/test_user.py +72 -70
- tests/themes_ordering.py +1 -2
- 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.9rc44.dist-info}/top_level.txt +0 -0
tests/test_layers_vectortiles.py
CHANGED
@@ -12,15 +12,10 @@ from . import AbstractViewsTests, factory_build_layers, get_test_default_layers
|
|
12
12
|
def layer_vectortiles_test_data(dbsession, transact):
|
13
13
|
del transact
|
14
14
|
|
15
|
-
from c2cgeoportal_commons.models.main import LayerVectorTiles
|
16
|
-
|
17
|
-
servers = [OGCServer(name="server_{}".format(i)) for i in range(0, 4)]
|
18
|
-
for i, server in enumerate(servers):
|
19
|
-
server.url = "http://wms.geo.admin.ch_{}".format(i)
|
20
|
-
server.image_type = "image/jpeg" if i % 2 == 0 else "image/png"
|
15
|
+
from c2cgeoportal_commons.models.main import LayerVectorTiles
|
21
16
|
|
22
17
|
def layer_builder(i):
|
23
|
-
name = "layer_vectortiles_{}"
|
18
|
+
name = f"layer_vectortiles_{i}"
|
24
19
|
layer = LayerVectorTiles(name=name)
|
25
20
|
layer.layer = name
|
26
21
|
layer.public = 1 == i % 2
|
@@ -28,17 +23,16 @@ def layer_vectortiles_test_data(dbsession, transact):
|
|
28
23
|
layer.xyz = "https://vectortiles-staging.geoportail.lu/styles/roadmap/{z}/{x}/{y}.png"
|
29
24
|
return layer
|
30
25
|
|
31
|
-
|
32
|
-
|
26
|
+
data = factory_build_layers(layer_builder, dbsession)
|
27
|
+
data["default"] = get_test_default_layers(dbsession, None)
|
33
28
|
|
34
29
|
dbsession.flush()
|
35
30
|
|
36
|
-
yield
|
31
|
+
yield data
|
37
32
|
|
38
33
|
|
39
34
|
@pytest.mark.usefixtures("layer_vectortiles_test_data", "test_app")
|
40
35
|
class TestLayerVectortiles(AbstractViewsTests):
|
41
|
-
|
42
36
|
_prefix = "/admin/layers_vectortiles"
|
43
37
|
|
44
38
|
def test_index_rendering(self, test_app):
|
@@ -85,10 +79,8 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
85
79
|
assert "" == self.get_first_field_named(form, "style").value
|
86
80
|
assert "" == self.get_first_field_named(form, "xyz").value
|
87
81
|
|
88
|
-
@pytest.mark.skip(reason="Not working now")
|
89
82
|
def test_grid_search(self, test_app):
|
90
|
-
|
91
|
-
self.check_search(test_app, "layer_vectortiles_1", total=1)
|
83
|
+
self.check_search(test_app, "layer_vectortiles_10", total=1)
|
92
84
|
|
93
85
|
def test_base_edit(self, test_app, layer_vectortiles_test_data):
|
94
86
|
layer = layer_vectortiles_test_data["layers"][10]
|
@@ -108,6 +100,8 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
108
100
|
assert form["public"].checked
|
109
101
|
|
110
102
|
def test_edit(self, test_app, layer_vectortiles_test_data, dbsession):
|
103
|
+
from c2cgeoportal_commons.models.main import Log, LogAction
|
104
|
+
|
111
105
|
layer = layer_vectortiles_test_data["layers"][0]
|
112
106
|
|
113
107
|
form = self.get_item(test_app, layer.id).form
|
@@ -124,11 +118,11 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
124
118
|
assert str(layer.xyz or "") == form["xyz"].value
|
125
119
|
|
126
120
|
interfaces = layer_vectortiles_test_data["interfaces"]
|
127
|
-
assert
|
121
|
+
assert {interfaces[0].id, interfaces[2].id} == {i.id for i in layer.interfaces}
|
128
122
|
self._check_interfaces(form, interfaces, layer)
|
129
123
|
|
130
124
|
ras = layer_vectortiles_test_data["restrictionareas"]
|
131
|
-
assert
|
125
|
+
assert {ras[0].id, ras[2].id} == {i.id for i in layer.restrictionareas}
|
132
126
|
self._check_restrictionsareas(form, ras, layer)
|
133
127
|
|
134
128
|
new_values = {
|
@@ -148,7 +142,7 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
148
142
|
|
149
143
|
resp = form.submit("submit")
|
150
144
|
assert str(layer.id) == re.match(
|
151
|
-
|
145
|
+
rf"http://localhost{self._prefix}/(.*)\?msg_col=submit_ok", resp.location
|
152
146
|
).group(1)
|
153
147
|
|
154
148
|
dbsession.expire(layer)
|
@@ -157,13 +151,19 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
157
151
|
assert value == getattr(layer, key)
|
158
152
|
else:
|
159
153
|
assert str(value or "") == str(getattr(layer, key) or "")
|
160
|
-
assert
|
161
|
-
|
162
|
-
|
163
|
-
|
154
|
+
assert {interfaces[1].id, interfaces[3].id} == {interface.id for interface in layer.interfaces}
|
155
|
+
assert {ras[1].id, ras[3].id} == {ra.id for ra in layer.restrictionareas}
|
156
|
+
|
157
|
+
log = dbsession.query(Log).one()
|
158
|
+
assert log.date != None
|
159
|
+
assert log.action == LogAction.UPDATE
|
160
|
+
assert log.element_type == "layer_vectortiles"
|
161
|
+
assert log.element_id == layer.id
|
162
|
+
assert log.element_name == layer.name
|
163
|
+
assert log.username == "test_user"
|
164
164
|
|
165
165
|
def test_submit_new(self, dbsession, test_app, layer_vectortiles_test_data):
|
166
|
-
from c2cgeoportal_commons.models.main import LayerVectorTiles
|
166
|
+
from c2cgeoportal_commons.models.main import LayerVectorTiles, Log, LogAction
|
167
167
|
|
168
168
|
resp = test_app.post(
|
169
169
|
"/admin/layers_vectortiles/new",
|
@@ -182,12 +182,20 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
182
182
|
r"http://localhost/admin/layers_vectortiles/(.*)\?msg_col=submit_ok", resp.location
|
183
183
|
).group(1)
|
184
184
|
|
185
|
+
log = dbsession.query(Log).one()
|
186
|
+
assert log.date != None
|
187
|
+
assert log.action == LogAction.INSERT
|
188
|
+
assert log.element_type == "layer_vectortiles"
|
189
|
+
assert log.element_id == layer.id
|
190
|
+
assert log.element_name == layer.name
|
191
|
+
assert log.username == "test_user"
|
192
|
+
|
185
193
|
def test_duplicate(self, layer_vectortiles_test_data, test_app, dbsession):
|
186
194
|
from c2cgeoportal_commons.models.main import LayerVectorTiles
|
187
195
|
|
188
196
|
layer = layer_vectortiles_test_data["layers"][3]
|
189
197
|
|
190
|
-
resp = test_app.get("/admin/layers_vectortiles/{}/duplicate"
|
198
|
+
resp = test_app.get(f"/admin/layers_vectortiles/{layer.id}/duplicate", status=200)
|
191
199
|
form = resp.form
|
192
200
|
|
193
201
|
assert "" == self.get_first_field_named(form, "id").value
|
@@ -200,7 +208,7 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
200
208
|
assert str(layer.style or "") == form["style"].value
|
201
209
|
assert str(layer.xyz or "") == form["xyz"].value
|
202
210
|
interfaces = layer_vectortiles_test_data["interfaces"]
|
203
|
-
assert
|
211
|
+
assert {interfaces[3].id, interfaces[1].id} == {i.id for i in layer.interfaces}
|
204
212
|
self._check_interfaces(form, interfaces, layer)
|
205
213
|
|
206
214
|
self.set_first_field_named(form, "name", "clone")
|
@@ -216,12 +224,20 @@ class TestLayerVectortiles(AbstractViewsTests):
|
|
216
224
|
assert layer_vectortiles_test_data["layers"][3].metadatas[1].name == layer.metadatas[1].name
|
217
225
|
|
218
226
|
def test_delete(self, test_app, dbsession):
|
219
|
-
from c2cgeoportal_commons.models.main import LayerVectorTiles,
|
227
|
+
from c2cgeoportal_commons.models.main import Layer, LayerVectorTiles, Log, LogAction, TreeItem
|
228
|
+
|
229
|
+
layer = dbsession.query(LayerVectorTiles).first()
|
220
230
|
|
221
|
-
|
231
|
+
test_app.delete(f"/admin/layers_vectortiles/{layer.id}", status=200)
|
222
232
|
|
223
|
-
|
233
|
+
assert dbsession.query(LayerVectorTiles).get(layer.id) is None
|
234
|
+
assert dbsession.query(Layer).get(layer.id) is None
|
235
|
+
assert dbsession.query(TreeItem).get(layer.id) is None
|
224
236
|
|
225
|
-
|
226
|
-
assert
|
227
|
-
assert
|
237
|
+
log = dbsession.query(Log).one()
|
238
|
+
assert log.date != None
|
239
|
+
assert log.action == LogAction.DELETE
|
240
|
+
assert log.element_type == "layer_vectortiles"
|
241
|
+
assert log.element_id == layer.id
|
242
|
+
assert log.element_name == layer.name
|
243
|
+
assert log.username == "test_user"
|
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,32 +14,31 @@ 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")
|
43
41
|
class TestLayerWMSViews(AbstractViewsTests):
|
44
|
-
|
45
42
|
_prefix = "/admin/layers_wms"
|
46
43
|
|
47
44
|
def test_index_rendering(self, test_app):
|
@@ -57,11 +54,13 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
57
54
|
("public", "Public"),
|
58
55
|
("geo_table", "Geo table"),
|
59
56
|
("exclude_properties", "Exclude properties"),
|
57
|
+
("ogc_server", "OGC server"),
|
60
58
|
("layer", "WMS layer name"),
|
61
59
|
("style", "Style"),
|
60
|
+
("valid", "Valid"),
|
61
|
+
("invalid_reason", "Reason why I am not valid"),
|
62
62
|
("time_mode", "Time mode"),
|
63
63
|
("time_widget", "Time widget"),
|
64
|
-
("ogc_server", "OGC server"),
|
65
64
|
("dimensions", "Dimensions", "false"),
|
66
65
|
("interfaces", "Interfaces"),
|
67
66
|
("restrictionareas", "Restriction areas", "false"),
|
@@ -154,6 +153,8 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
154
153
|
assert form["public"].checked
|
155
154
|
|
156
155
|
def test_edit(self, test_app, layer_wms_test_data, dbsession):
|
156
|
+
from c2cgeoportal_commons.models.main import Log, LogAction
|
157
|
+
|
157
158
|
layer = layer_wms_test_data["layers"][0]
|
158
159
|
|
159
160
|
form = self.get_item(test_app, layer.id).form
|
@@ -173,11 +174,11 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
173
174
|
assert str(layer.time_widget) == form["time_widget"].value
|
174
175
|
|
175
176
|
interfaces = layer_wms_test_data["interfaces"]
|
176
|
-
assert
|
177
|
+
assert {interfaces[0].id, interfaces[2].id} == {i.id for i in layer.interfaces}
|
177
178
|
self._check_interfaces(form, interfaces, layer)
|
178
179
|
|
179
180
|
ras = layer_wms_test_data["restrictionareas"]
|
180
|
-
assert
|
181
|
+
assert {ras[0].id, ras[2].id} == {i.id for i in layer.restrictionareas}
|
181
182
|
self._check_restrictionsareas(form, ras, layer)
|
182
183
|
|
183
184
|
new_values = {
|
@@ -200,7 +201,7 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
200
201
|
|
201
202
|
resp = form.submit("submit")
|
202
203
|
assert str(layer.id) == re.match(
|
203
|
-
|
204
|
+
rf"http://localhost{self._prefix}/(.*)\?msg_col=submit_ok", resp.location
|
204
205
|
).group(1)
|
205
206
|
|
206
207
|
dbsession.expire(layer)
|
@@ -209,13 +210,19 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
209
210
|
assert value == getattr(layer, key)
|
210
211
|
else:
|
211
212
|
assert str(value or "") == str(getattr(layer, key) or "")
|
212
|
-
assert
|
213
|
-
|
214
|
-
|
215
|
-
|
213
|
+
assert {interfaces[1].id, interfaces[3].id} == {interface.id for interface in layer.interfaces}
|
214
|
+
assert {ras[1].id, ras[3].id} == {ra.id for ra in layer.restrictionareas}
|
215
|
+
|
216
|
+
log = dbsession.query(Log).one()
|
217
|
+
assert log.date != None
|
218
|
+
assert log.action == LogAction.UPDATE
|
219
|
+
assert log.element_type == "layer_wms"
|
220
|
+
assert log.element_id == layer.id
|
221
|
+
assert log.element_name == layer.name
|
222
|
+
assert log.username == "test_user"
|
216
223
|
|
217
224
|
def test_submit_new(self, dbsession, test_app, layer_wms_test_data):
|
218
|
-
from c2cgeoportal_commons.models.main import LayerWMS
|
225
|
+
from c2cgeoportal_commons.models.main import LayerWMS, Log, LogAction
|
219
226
|
|
220
227
|
resp = test_app.post(
|
221
228
|
"/admin/layers_wms/new",
|
@@ -239,12 +246,20 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
239
246
|
r"http://localhost/admin/layers_wms/(.*)\?msg_col=submit_ok", resp.location
|
240
247
|
).group(1)
|
241
248
|
|
249
|
+
log = dbsession.query(Log).one()
|
250
|
+
assert log.date != None
|
251
|
+
assert log.action == LogAction.INSERT
|
252
|
+
assert log.element_type == "layer_wms"
|
253
|
+
assert log.element_id == layer.id
|
254
|
+
assert log.element_name == layer.name
|
255
|
+
assert log.username == "test_user"
|
256
|
+
|
242
257
|
def test_duplicate(self, layer_wms_test_data, test_app, dbsession):
|
243
258
|
from c2cgeoportal_commons.models.main import LayerWMS
|
244
259
|
|
245
260
|
layer = layer_wms_test_data["layers"][3]
|
246
261
|
|
247
|
-
resp = test_app.get("/admin/layers_wms/{}/duplicate"
|
262
|
+
resp = test_app.get(f"/admin/layers_wms/{layer.id}/duplicate", status=200)
|
248
263
|
form = resp.form
|
249
264
|
|
250
265
|
assert "" == self.get_first_field_named(form, "id").value
|
@@ -260,11 +275,11 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
260
275
|
assert str(layer.time_mode) == form["time_mode"].value
|
261
276
|
assert str(layer.time_widget) == form["time_widget"].value
|
262
277
|
interfaces = layer_wms_test_data["interfaces"]
|
263
|
-
assert
|
278
|
+
assert {interfaces[3].id, interfaces[1].id} == {i.id for i in layer.interfaces}
|
264
279
|
self._check_interfaces(form, interfaces, layer)
|
265
280
|
|
266
281
|
ras = layer_wms_test_data["restrictionareas"]
|
267
|
-
assert
|
282
|
+
assert {ras[3].id, ras[0].id} == {i.id for i in layer.restrictionareas}
|
268
283
|
self._check_restrictionsareas(form, ras, layer)
|
269
284
|
|
270
285
|
self._check_dimensions(resp.html, layer.dimensions, duplicated=True)
|
@@ -282,19 +297,16 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
282
297
|
assert layer_wms_test_data["layers"][3].metadatas[1].name == layer.metadatas[1].name
|
283
298
|
|
284
299
|
def test_convert_common_fields_copied(self, layer_wms_test_data, test_app, dbsession):
|
285
|
-
from c2cgeoportal_commons.models.main import
|
300
|
+
from c2cgeoportal_commons.models.main import LayerWMS, LayerWMTS
|
286
301
|
|
287
302
|
layer = layer_wms_test_data["layers"][3]
|
288
303
|
|
289
304
|
assert 0 == dbsession.query(LayerWMTS).filter(LayerWMTS.name == layer.name).count()
|
290
305
|
assert 1 == dbsession.query(LayerWMS).filter(LayerWMS.name == layer.name).count()
|
291
306
|
|
292
|
-
resp = test_app.post("/admin/layers_wms/{}/convert_to_wmts"
|
307
|
+
resp = test_app.post(f"/admin/layers_wms/{layer.id}/convert_to_wmts", status=200)
|
293
308
|
assert resp.json["success"]
|
294
|
-
assert
|
295
|
-
"http://localhost/admin/layers_wmts/{}?msg_col=submit_ok".format(layer.id)
|
296
|
-
== resp.json["redirect"]
|
297
|
-
)
|
309
|
+
assert f"http://localhost/admin/layers_wmts/{layer.id}?msg_col=submit_ok" == resp.json["redirect"]
|
298
310
|
|
299
311
|
assert 1 == dbsession.query(LayerWMTS).filter(LayerWMTS.name == layer.name).count()
|
300
312
|
assert 0 == dbsession.query(LayerWMS).filter(LayerWMS.name == layer.name).count()
|
@@ -328,51 +340,53 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
328
340
|
def test_convert_image_type_from_ogcserver(self, layer_wms_test_data, test_app):
|
329
341
|
layer = layer_wms_test_data["layers"][3]
|
330
342
|
|
331
|
-
resp = test_app.post("/admin/layers_wms/{}/convert_to_wmts"
|
343
|
+
resp = test_app.post(f"/admin/layers_wms/{layer.id}/convert_to_wmts", status=200)
|
332
344
|
assert resp.json["success"]
|
333
|
-
assert
|
334
|
-
"http://localhost/admin/layers_wmts/{}?msg_col=submit_ok".format(layer.id)
|
335
|
-
== resp.json["redirect"]
|
336
|
-
)
|
345
|
+
assert f"http://localhost/admin/layers_wmts/{layer.id}?msg_col=submit_ok" == resp.json["redirect"]
|
337
346
|
|
338
347
|
resp = test_app.get(resp.json["redirect"], status=200)
|
339
348
|
assert "image/png" == resp.form["image_type"].value
|
340
349
|
|
341
350
|
layer = layer_wms_test_data["layers"][2]
|
342
|
-
resp = test_app.post("/admin/layers_wms/{}/convert_to_wmts"
|
351
|
+
resp = test_app.post(f"/admin/layers_wms/{layer.id}/convert_to_wmts", status=200)
|
343
352
|
assert resp.json["success"]
|
344
|
-
assert
|
345
|
-
"http://localhost/admin/layers_wmts/{}?msg_col=submit_ok".format(layer.id)
|
346
|
-
== resp.json["redirect"]
|
347
|
-
)
|
353
|
+
assert f"http://localhost/admin/layers_wmts/{layer.id}?msg_col=submit_ok" == resp.json["redirect"]
|
348
354
|
|
349
355
|
resp = test_app.get(resp.json["redirect"], status=200)
|
350
356
|
assert "image/jpeg" == resp.form["image_type"].value
|
351
357
|
|
352
358
|
def test_convert_without_wmts_defaults(self, test_app, layer_wms_test_data, dbsession):
|
353
|
-
from c2cgeoportal_commons.models.main import LayerWMTS
|
359
|
+
from c2cgeoportal_commons.models.main import LayerWMTS, Log, LogAction
|
354
360
|
|
355
361
|
dbsession.delete(LayerWMTS.get_default(dbsession))
|
356
362
|
layer = layer_wms_test_data["layers"][3]
|
357
|
-
test_app.post("/admin/layers_wms/{}/convert_to_wmts"
|
363
|
+
test_app.post(f"/admin/layers_wms/{layer.id}/convert_to_wmts", status=200)
|
364
|
+
|
365
|
+
log = dbsession.query(Log).one()
|
366
|
+
assert log.date != None
|
367
|
+
assert log.action == LogAction.CONVERT_TO_WMTS
|
368
|
+
assert log.element_type == "layer_wms"
|
369
|
+
assert log.element_id == layer.id
|
370
|
+
assert log.element_name == layer.name
|
371
|
+
assert log.username == "test_user"
|
358
372
|
|
359
373
|
def test_unicity_validator(self, layer_wms_test_data, test_app):
|
360
374
|
layer = layer_wms_test_data["layers"][2]
|
361
|
-
resp = test_app.get("/admin/layers_wms/{}/duplicate"
|
375
|
+
resp = test_app.get(f"/admin/layers_wms/{layer.id}/duplicate", status=200)
|
362
376
|
|
363
377
|
resp = resp.form.submit("submit")
|
364
378
|
|
365
|
-
self._check_submission_problem(resp, "{} is already used."
|
379
|
+
self._check_submission_problem(resp, f"{layer.name} is already used.")
|
366
380
|
|
367
381
|
def test_unicity_validator_does_not_matter_amongst_cousin(self, layer_wms_test_data, test_app, dbsession):
|
368
|
-
from c2cgeoportal_commons.models.main import
|
382
|
+
from c2cgeoportal_commons.models.main import LayerGroup, LayerWMS
|
369
383
|
|
370
384
|
assert 1 == dbsession.query(LayerGroup).filter(LayerGroup.name == "layer_group_0").count()
|
371
385
|
|
372
386
|
assert dbsession.query(LayerWMS).filter(LayerWMS.name == "layer_group_0").one_or_none() is None
|
373
387
|
|
374
388
|
layer = layer_wms_test_data["layers"][2]
|
375
|
-
resp = test_app.get("/admin/layers_wms/{}/duplicate"
|
389
|
+
resp = test_app.get(f"/admin/layers_wms/{layer.id}/duplicate", status=200)
|
376
390
|
self.set_first_field_named(resp.form, "name", "layer_group_0")
|
377
391
|
resp = resp.form.submit("submit")
|
378
392
|
|
@@ -382,18 +396,25 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
382
396
|
# assert str(layer.id) == re.match('http://localhost/admin/layers_wms/(.*)', resp.location).group(1)
|
383
397
|
|
384
398
|
def test_delete(self, test_app, dbsession):
|
385
|
-
from c2cgeoportal_commons.models.main import LayerWMS,
|
399
|
+
from c2cgeoportal_commons.models.main import Layer, LayerWMS, Log, LogAction, TreeItem
|
400
|
+
|
401
|
+
layer = dbsession.query(LayerWMS).first()
|
386
402
|
|
387
|
-
|
403
|
+
test_app.delete(f"/admin/layers_wms/{layer.id}", status=200)
|
388
404
|
|
389
|
-
|
405
|
+
assert dbsession.query(LayerWMS).get(layer.id) is None
|
406
|
+
assert dbsession.query(Layer).get(layer.id) is None
|
407
|
+
assert dbsession.query(TreeItem).get(layer.id) is None
|
390
408
|
|
391
|
-
|
392
|
-
assert
|
393
|
-
assert
|
409
|
+
log = dbsession.query(Log).one()
|
410
|
+
assert log.date != None
|
411
|
+
assert log.action == LogAction.DELETE
|
412
|
+
assert log.element_type == "layer_wms"
|
413
|
+
assert log.element_id == layer.id
|
414
|
+
assert log.element_name == layer.name
|
415
|
+
assert log.username == "test_user"
|
394
416
|
|
395
|
-
|
396
|
-
def test_submit_new_no_layer_name(self, test_app):
|
417
|
+
def test_submit_new_no_layer_name(self, test_app, layer_wms_test_data, dbsession):
|
397
418
|
resp = test_app.post(
|
398
419
|
"/admin/layers_wms/new",
|
399
420
|
{
|
@@ -418,31 +439,5 @@ class TestLayerWMSViews(AbstractViewsTests):
|
|
418
439
|
"Errors have been highlighted below" == resp.html.select_one('div[class="error-msg-detail"]').text
|
419
440
|
)
|
420
441
|
assert ["WMS layer name"] == sorted(
|
421
|
-
|
422
|
-
)
|
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
|
442
|
+
(x.select_one("label").text.strip()) for x in resp.html.select("[class~='has-error']")
|
445
443
|
)
|
446
|
-
index_page.dbl_click(el)
|
447
|
-
|
448
|
-
assert selenium.current_url.endswith("/admin/layers_wms/{}".format(layer.id))
|
tests/test_layers_wmts.py
CHANGED
@@ -19,27 +19,26 @@ def layer_wmts_test_data(dbsession, transact):
|
|
19
19
|
server.image_type = "image/png"
|
20
20
|
|
21
21
|
def layer_builder(i):
|
22
|
-
name = "layer_wmts_{}"
|
22
|
+
name = f"layer_wmts_{i}"
|
23
23
|
layer = LayerWMTS(name=name)
|
24
24
|
layer.layer = name
|
25
|
-
layer.url = "https:///wms.geo.admin.ch_{}.org?service=wms&request=GetCapabilities"
|
25
|
+
layer.url = f"https:///wms.geo.admin.ch_{i}.org?service=wms&request=GetCapabilities"
|
26
26
|
layer.public = 1 == i % 2
|
27
|
-
layer.geo_table = "geotable_{}"
|
27
|
+
layer.geo_table = f"geotable_{i}"
|
28
28
|
layer.image_type = "image/jpeg"
|
29
29
|
layer.style = "décontrasté"
|
30
30
|
return layer
|
31
31
|
|
32
|
-
|
33
|
-
|
32
|
+
data = factory_build_layers(layer_builder, dbsession)
|
33
|
+
data["default"] = get_test_default_layers(dbsession, server)
|
34
34
|
|
35
35
|
dbsession.flush()
|
36
36
|
|
37
|
-
yield
|
37
|
+
yield data
|
38
38
|
|
39
39
|
|
40
40
|
@pytest.mark.usefixtures("layer_wmts_test_data", "test_app")
|
41
41
|
class TestLayerWMTS(AbstractViewsTests):
|
42
|
-
|
43
42
|
_prefix = "/admin/layers_wmts"
|
44
43
|
|
45
44
|
def test_index_rendering(self, test_app):
|
@@ -102,6 +101,8 @@ class TestLayerWMTS(AbstractViewsTests):
|
|
102
101
|
assert default_wmts.matrix_set == self.get_first_field_named(form, "matrix_set").value
|
103
102
|
|
104
103
|
def test_edit(self, test_app, layer_wmts_test_data, dbsession):
|
104
|
+
from c2cgeoportal_commons.models.main import Log, LogAction
|
105
|
+
|
105
106
|
layer = layer_wmts_test_data["layers"][0]
|
106
107
|
|
107
108
|
form = self.get_item(test_app, layer.id).form
|
@@ -121,11 +122,11 @@ class TestLayerWMTS(AbstractViewsTests):
|
|
121
122
|
assert str(layer.image_type or "") == form["image_type"].value
|
122
123
|
|
123
124
|
interfaces = layer_wmts_test_data["interfaces"]
|
124
|
-
assert
|
125
|
+
assert {interfaces[0].id, interfaces[2].id} == {i.id for i in layer.interfaces}
|
125
126
|
self._check_interfaces(form, interfaces, layer)
|
126
127
|
|
127
128
|
ras = layer_wmts_test_data["restrictionareas"]
|
128
|
-
assert
|
129
|
+
assert {ras[0].id, ras[2].id} == {i.id for i in layer.restrictionareas}
|
129
130
|
self._check_restrictionsareas(form, ras, layer)
|
130
131
|
|
131
132
|
new_values = {
|
@@ -148,7 +149,7 @@ class TestLayerWMTS(AbstractViewsTests):
|
|
148
149
|
|
149
150
|
resp = form.submit("submit")
|
150
151
|
assert str(layer.id) == re.match(
|
151
|
-
|
152
|
+
rf"http://localhost{self._prefix}/(.*)\?msg_col=submit_ok", resp.location
|
152
153
|
).group(1)
|
153
154
|
|
154
155
|
dbsession.expire(layer)
|
@@ -157,17 +158,23 @@ class TestLayerWMTS(AbstractViewsTests):
|
|
157
158
|
assert value == getattr(layer, key)
|
158
159
|
else:
|
159
160
|
assert str(value or "") == str(getattr(layer, key) or "")
|
160
|
-
assert
|
161
|
-
|
162
|
-
|
163
|
-
|
161
|
+
assert {interfaces[1].id, interfaces[3].id} == {interface.id for interface in layer.interfaces}
|
162
|
+
assert {ras[1].id, ras[3].id} == {ra.id for ra in layer.restrictionareas}
|
163
|
+
|
164
|
+
log = dbsession.query(Log).one()
|
165
|
+
assert log.date != None
|
166
|
+
assert log.action == LogAction.UPDATE
|
167
|
+
assert log.element_type == "layer_wmts"
|
168
|
+
assert log.element_id == layer.id
|
169
|
+
assert log.element_name == layer.name
|
170
|
+
assert log.username == "test_user"
|
164
171
|
|
165
172
|
def test_duplicate(self, layer_wmts_test_data, test_app, dbsession):
|
166
173
|
from c2cgeoportal_commons.models.main import LayerWMTS
|
167
174
|
|
168
175
|
layer = layer_wmts_test_data["layers"][3]
|
169
176
|
|
170
|
-
resp = test_app.get("/admin/layers_wmts/{}/duplicate"
|
177
|
+
resp = test_app.get(f"/admin/layers_wmts/{layer.id}/duplicate", status=200)
|
171
178
|
form = resp.form
|
172
179
|
|
173
180
|
assert "" == self.get_first_field_named(form, "id").value
|
@@ -192,36 +199,42 @@ class TestLayerWMTS(AbstractViewsTests):
|
|
192
199
|
).group(1)
|
193
200
|
|
194
201
|
def test_delete(self, test_app, dbsession):
|
195
|
-
from c2cgeoportal_commons.models.main import LayerWMTS,
|
202
|
+
from c2cgeoportal_commons.models.main import Layer, LayerWMTS, Log, LogAction, TreeItem
|
196
203
|
|
197
|
-
|
204
|
+
layer = dbsession.query(LayerWMTS).first()
|
198
205
|
|
199
|
-
test_app.delete("/admin/layers_wmts/{}"
|
206
|
+
test_app.delete(f"/admin/layers_wmts/{layer.id}", status=200)
|
200
207
|
|
201
|
-
assert dbsession.query(LayerWMTS).get(
|
202
|
-
assert dbsession.query(Layer).get(
|
203
|
-
assert dbsession.query(TreeItem).get(
|
208
|
+
assert dbsession.query(LayerWMTS).get(layer.id) is None
|
209
|
+
assert dbsession.query(Layer).get(layer.id) is None
|
210
|
+
assert dbsession.query(TreeItem).get(layer.id) is None
|
211
|
+
|
212
|
+
log = dbsession.query(Log).one()
|
213
|
+
assert log.date != None
|
214
|
+
assert log.action == LogAction.DELETE
|
215
|
+
assert log.element_type == "layer_wmts"
|
216
|
+
assert log.element_id == layer.id
|
217
|
+
assert log.element_name == layer.name
|
218
|
+
assert log.username == "test_user"
|
204
219
|
|
205
220
|
def test_unicity_validator(self, layer_wmts_test_data, test_app):
|
206
221
|
layer = layer_wmts_test_data["layers"][2]
|
207
|
-
resp = test_app.get("/admin/layers_wmts/{}/duplicate"
|
222
|
+
resp = test_app.get(f"/admin/layers_wmts/{layer.id}/duplicate", status=200)
|
208
223
|
|
209
224
|
resp = resp.form.submit("submit")
|
210
225
|
|
211
|
-
self._check_submission_problem(resp, "{} is already used."
|
226
|
+
self._check_submission_problem(resp, f"{layer.name} is already used.")
|
212
227
|
|
213
228
|
def test_convert_common_fields_copied(self, layer_wmts_test_data, test_app, dbsession):
|
214
|
-
from c2cgeoportal_commons.models.main import
|
229
|
+
from c2cgeoportal_commons.models.main import LayerWMS, LayerWMTS
|
215
230
|
|
216
231
|
layer = layer_wmts_test_data["layers"][3]
|
217
232
|
|
218
233
|
assert 0 == dbsession.query(LayerWMS).filter(LayerWMS.name == layer.name).count()
|
219
234
|
assert 1 == dbsession.query(LayerWMTS).filter(LayerWMTS.name == layer.name).count()
|
220
235
|
|
221
|
-
resp = test_app.post("/admin/layers_wmts/{}/convert_to_wms"
|
222
|
-
assert
|
223
|
-
"http://localhost/admin/layers_wms/{}?msg_col=submit_ok".format(layer.id) == resp.json["redirect"]
|
224
|
-
)
|
236
|
+
resp = test_app.post(f"/admin/layers_wmts/{layer.id}/convert_to_wms", status=200)
|
237
|
+
assert f"http://localhost/admin/layers_wms/{layer.id}?msg_col=submit_ok" == resp.json["redirect"]
|
225
238
|
|
226
239
|
assert 1 == dbsession.query(LayerWMS).filter(LayerWMS.name == layer.name).count()
|
227
240
|
assert 0 == dbsession.query(LayerWMTS).filter(LayerWMTS.name == layer.name).count()
|
@@ -252,8 +265,16 @@ class TestLayerWMTS(AbstractViewsTests):
|
|
252
265
|
)
|
253
266
|
|
254
267
|
def test_convert_without_wms_defaults(self, test_app, layer_wmts_test_data, dbsession):
|
255
|
-
from c2cgeoportal_commons.models.main import LayerWMS
|
268
|
+
from c2cgeoportal_commons.models.main import LayerWMS, Log, LogAction
|
256
269
|
|
257
270
|
dbsession.delete(LayerWMS.get_default(dbsession))
|
258
271
|
layer = layer_wmts_test_data["layers"][3]
|
259
|
-
test_app.post("/admin/layers_wmts/{}/convert_to_wms"
|
272
|
+
test_app.post(f"/admin/layers_wmts/{layer.id}/convert_to_wms", status=200)
|
273
|
+
|
274
|
+
log = dbsession.query(Log).one()
|
275
|
+
assert log.date != None
|
276
|
+
assert log.action == LogAction.CONVERT_TO_WMS
|
277
|
+
assert log.element_type == "layer_wmts"
|
278
|
+
assert log.element_id == layer.id
|
279
|
+
assert log.element_name == layer.name
|
280
|
+
assert log.username == "test_user"
|