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.
Files changed (99) hide show
  1. c2cgeoportal_admin/__init__.py +44 -14
  2. c2cgeoportal_admin/lib/__init__.py +0 -0
  3. c2cgeoportal_admin/lib/lingva_extractor.py +77 -0
  4. c2cgeoportal_admin/lib/ogcserver_synchronizer.py +410 -0
  5. c2cgeoportal_admin/py.typed +0 -0
  6. c2cgeoportal_admin/routes.py +30 -11
  7. c2cgeoportal_admin/schemas/dimensions.py +17 -11
  8. c2cgeoportal_admin/schemas/functionalities.py +60 -22
  9. c2cgeoportal_admin/schemas/interfaces.py +27 -19
  10. c2cgeoportal_admin/schemas/metadata.py +122 -48
  11. c2cgeoportal_admin/schemas/restriction_areas.py +26 -20
  12. c2cgeoportal_admin/schemas/roles.py +13 -7
  13. c2cgeoportal_admin/schemas/treegroup.py +90 -20
  14. c2cgeoportal_admin/schemas/treeitem.py +3 -4
  15. c2cgeoportal_admin/static/layertree.css +26 -4
  16. c2cgeoportal_admin/static/navbar.css +59 -36
  17. c2cgeoportal_admin/static/theme.css +51 -11
  18. c2cgeoportal_admin/subscribers.py +3 -3
  19. c2cgeoportal_admin/templates/404.jinja2 +41 -2
  20. c2cgeoportal_admin/templates/edit.jinja2 +23 -0
  21. c2cgeoportal_admin/templates/home.jinja2 +23 -0
  22. c2cgeoportal_admin/templates/index.jinja2 +23 -0
  23. c2cgeoportal_admin/templates/layertree.jinja2 +55 -11
  24. c2cgeoportal_admin/templates/layout.jinja2 +23 -0
  25. c2cgeoportal_admin/templates/navigation_navbar.jinja2 +56 -0
  26. c2cgeoportal_admin/templates/ogcserver_synchronize.jinja2 +90 -0
  27. c2cgeoportal_admin/templates/widgets/child.pt +35 -3
  28. c2cgeoportal_admin/templates/widgets/children.pt +121 -92
  29. c2cgeoportal_admin/templates/widgets/dimension.pt +23 -0
  30. c2cgeoportal_admin/templates/widgets/dimensions.pt +23 -0
  31. c2cgeoportal_admin/templates/widgets/functionality_fields.pt +51 -0
  32. c2cgeoportal_admin/templates/widgets/layer_fields.pt +23 -0
  33. c2cgeoportal_admin/templates/widgets/layer_group_fields.pt +23 -0
  34. c2cgeoportal_admin/templates/widgets/layer_v1_fields.pt +23 -0
  35. c2cgeoportal_admin/templates/widgets/metadata.pt +30 -1
  36. c2cgeoportal_admin/templates/widgets/metadatas.pt +23 -0
  37. c2cgeoportal_admin/templates/widgets/ogcserver_fields.pt +23 -0
  38. c2cgeoportal_admin/templates/widgets/restriction_area_fields.pt +25 -9
  39. c2cgeoportal_admin/templates/widgets/role_fields.pt +52 -25
  40. c2cgeoportal_admin/templates/widgets/theme_fields.pt +23 -0
  41. c2cgeoportal_admin/templates/widgets/user_fields.pt +23 -0
  42. c2cgeoportal_admin/views/__init__.py +29 -0
  43. c2cgeoportal_admin/views/dimension_layers.py +14 -9
  44. c2cgeoportal_admin/views/functionalities.py +52 -18
  45. c2cgeoportal_admin/views/home.py +5 -5
  46. c2cgeoportal_admin/views/interfaces.py +29 -21
  47. c2cgeoportal_admin/views/layer_groups.py +36 -25
  48. c2cgeoportal_admin/views/layers.py +17 -13
  49. c2cgeoportal_admin/views/layers_cog.py +135 -0
  50. c2cgeoportal_admin/views/layers_vectortiles.py +62 -27
  51. c2cgeoportal_admin/views/layers_wms.py +61 -36
  52. c2cgeoportal_admin/views/layers_wmts.py +54 -32
  53. c2cgeoportal_admin/views/layertree.py +37 -28
  54. c2cgeoportal_admin/views/logged_views.py +83 -0
  55. c2cgeoportal_admin/views/logs.py +91 -0
  56. c2cgeoportal_admin/views/oauth2_clients.py +96 -0
  57. c2cgeoportal_admin/views/ogc_servers.py +192 -21
  58. c2cgeoportal_admin/views/restriction_areas.py +78 -25
  59. c2cgeoportal_admin/views/roles.py +88 -25
  60. c2cgeoportal_admin/views/themes.py +47 -35
  61. c2cgeoportal_admin/views/themes_ordering.py +44 -24
  62. c2cgeoportal_admin/views/treeitems.py +21 -17
  63. c2cgeoportal_admin/views/users.py +46 -26
  64. c2cgeoportal_admin/widgets.py +79 -28
  65. {c2cgeoportal_admin-2.5.0.100.dist-info → c2cgeoportal_admin-2.9rc44.dist-info}/METADATA +15 -13
  66. c2cgeoportal_admin-2.9rc44.dist-info/RECORD +97 -0
  67. {c2cgeoportal_admin-2.5.0.100.dist-info → c2cgeoportal_admin-2.9rc44.dist-info}/WHEEL +1 -1
  68. c2cgeoportal_admin-2.9rc44.dist-info/entry_points.txt +5 -0
  69. tests/__init__.py +36 -27
  70. tests/conftest.py +23 -24
  71. tests/test_edit_url.py +16 -19
  72. tests/test_functionalities.py +52 -14
  73. tests/test_home.py +0 -1
  74. tests/test_interface.py +35 -12
  75. tests/test_layer_groups.py +58 -32
  76. tests/test_layers_cog.py +243 -0
  77. tests/test_layers_vectortiles.py +46 -30
  78. tests/test_layers_wms.py +77 -82
  79. tests/test_layers_wmts.py +51 -30
  80. tests/test_layertree.py +107 -101
  81. tests/test_learn.py +1 -1
  82. tests/test_left_menu.py +0 -1
  83. tests/test_lingva_extractor_config.py +64 -0
  84. tests/test_logs.py +102 -0
  85. tests/test_main.py +4 -2
  86. tests/test_metadatas.py +79 -71
  87. tests/test_oauth2_clients.py +186 -0
  88. tests/test_ogc_servers.py +110 -28
  89. tests/test_restriction_areas.py +109 -20
  90. tests/test_role.py +142 -82
  91. tests/test_themes.py +75 -41
  92. tests/test_themes_ordering.py +1 -2
  93. tests/test_treegroup.py +2 -2
  94. tests/test_user.py +72 -70
  95. tests/themes_ordering.py +1 -2
  96. c2cgeoportal_admin/templates/navigation_vertical.jinja2 +0 -10
  97. c2cgeoportal_admin-2.5.0.100.dist-info/RECORD +0 -84
  98. c2cgeoportal_admin-2.5.0.100.dist-info/entry_points.txt +0 -3
  99. {c2cgeoportal_admin-2.5.0.100.dist-info → c2cgeoportal_admin-2.9rc44.dist-info}/top_level.txt +0 -0
@@ -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, OGCServer
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_{}".format(i)
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
- datas = factory_build_layers(layer_builder, dbsession)
32
- datas["default"] = get_test_default_layers(dbsession, server)
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 datas
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
- # check search on name
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 set((interfaces[0].id, interfaces[2].id)) == set(i.id for i in layer.interfaces)
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 set((ras[0].id, ras[2].id)) == set(i.id for i in layer.restrictionareas)
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
- r"http://localhost{}/(.*)\?msg_col=submit_ok".format(self._prefix), resp.location
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 set([interfaces[1].id, interfaces[3].id]) == set(
161
- [interface.id for interface in layer.interfaces]
162
- )
163
- assert set([ras[1].id, ras[3].id]) == set([ra.id for ra in layer.restrictionareas])
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".format(layer.id), status=200)
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 set((interfaces[3].id, interfaces[1].id)) == set(i.id for i in layer.interfaces)
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, Layer, TreeItem
227
+ from c2cgeoportal_commons.models.main import Layer, LayerVectorTiles, Log, LogAction, TreeItem
228
+
229
+ layer = dbsession.query(LayerVectorTiles).first()
220
230
 
221
- layer_id = dbsession.query(LayerVectorTiles.id).first().id
231
+ test_app.delete(f"/admin/layers_vectortiles/{layer.id}", status=200)
222
232
 
223
- test_app.delete("/admin/layers_vectortiles/{}".format(layer_id), status=200)
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
- assert dbsession.query(LayerVectorTiles).get(layer_id) is None
226
- assert dbsession.query(Layer).get(layer_id) is None
227
- assert dbsession.query(TreeItem).get(layer_id) is None
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, skip_if_ci
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_{}".format(i)) for i in range(0, 4)]
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_{}".format(i)
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_{}".format(i))
26
- layer.layer = "layer_{}".format(i)
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_{}".format(i)
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
- datas = factory_build_layers(layer_builder, dbsession)
34
- datas["servers"] = servers
35
- datas["default"] = get_test_default_layers(dbsession, servers[1])
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 datas
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 set((interfaces[0].id, interfaces[2].id)) == set(i.id for i in layer.interfaces)
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 set((ras[0].id, ras[2].id)) == set(i.id for i in layer.restrictionareas)
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
- r"http://localhost{}/(.*)\?msg_col=submit_ok".format(self._prefix), resp.location
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 set([interfaces[1].id, interfaces[3].id]) == set(
213
- [interface.id for interface in layer.interfaces]
214
- )
215
- assert set([ras[1].id, ras[3].id]) == set([ra.id for ra in layer.restrictionareas])
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".format(layer.id), status=200)
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 set((interfaces[3].id, interfaces[1].id)) == set(i.id for i in layer.interfaces)
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 set((ras[3].id, ras[0].id)) == set(i.id for i in layer.restrictionareas)
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 LayerWMTS, LayerWMS
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".format(layer.id), status=200)
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".format(layer.id), status=200)
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".format(layer.id), status=200)
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".format(layer.id), status=200)
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".format(layer.id), status=200)
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.".format(layer.name))
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 LayerWMS, LayerGroup
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".format(layer.id), status=200)
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, Layer, TreeItem
399
+ from c2cgeoportal_commons.models.main import Layer, LayerWMS, Log, LogAction, TreeItem
400
+
401
+ layer = dbsession.query(LayerWMS).first()
386
402
 
387
- layer_id = dbsession.query(LayerWMS.id).first().id
403
+ test_app.delete(f"/admin/layers_wms/{layer.id}", status=200)
388
404
 
389
- test_app.delete("/admin/layers_wms/{}".format(layer_id), status=200)
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
- assert dbsession.query(LayerWMS).get(layer_id) is None
392
- assert dbsession.query(Layer).get(layer_id) is None
393
- assert dbsession.query(TreeItem).get(layer_id) is None
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
- @pytest.mark.skip(reason="Contraint has to be added at model side, alambiced")
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
- [(x.select_one("label").text.strip()) for x in resp.html.select("[class~='has-error']")]
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_{}".format(i)
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".format(i)
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_{}".format(i)
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
- datas = factory_build_layers(layer_builder, dbsession)
33
- datas["default"] = get_test_default_layers(dbsession, server)
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 datas
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 set((interfaces[0].id, interfaces[2].id)) == set(i.id for i in layer.interfaces)
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 set((ras[0].id, ras[2].id)) == set(i.id for i in layer.restrictionareas)
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
- r"http://localhost{}/(.*)\?msg_col=submit_ok".format(self._prefix), resp.location
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 set([interfaces[1].id, interfaces[3].id]) == set(
161
- [interface.id for interface in layer.interfaces]
162
- )
163
- assert set([ras[1].id, ras[3].id]) == set([ra.id for ra in layer.restrictionareas])
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".format(layer.id), status=200)
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, Layer, TreeItem
202
+ from c2cgeoportal_commons.models.main import Layer, LayerWMTS, Log, LogAction, TreeItem
196
203
 
197
- layer_id = dbsession.query(LayerWMTS.id).first().id
204
+ layer = dbsession.query(LayerWMTS).first()
198
205
 
199
- test_app.delete("/admin/layers_wmts/{}".format(layer_id), status=200)
206
+ test_app.delete(f"/admin/layers_wmts/{layer.id}", status=200)
200
207
 
201
- assert dbsession.query(LayerWMTS).get(layer_id) is None
202
- assert dbsession.query(Layer).get(layer_id) is None
203
- assert dbsession.query(TreeItem).get(layer_id) is None
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".format(layer.id), status=200)
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.".format(layer.name))
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 LayerWMTS, LayerWMS
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".format(layer.id), status=200)
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".format(layer.id), status=200)
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"