c2cgeoportal-admin 2.6.0__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 (80) hide show
  1. c2cgeoportal_admin/__init__.py +42 -12
  2. c2cgeoportal_admin/lib/lingva_extractor.py +77 -0
  3. c2cgeoportal_admin/lib/ogcserver_synchronizer.py +170 -57
  4. c2cgeoportal_admin/py.typed +0 -0
  5. c2cgeoportal_admin/routes.py +18 -6
  6. c2cgeoportal_admin/schemas/dimensions.py +16 -10
  7. c2cgeoportal_admin/schemas/functionalities.py +59 -21
  8. c2cgeoportal_admin/schemas/interfaces.py +26 -18
  9. c2cgeoportal_admin/schemas/metadata.py +101 -48
  10. c2cgeoportal_admin/schemas/restriction_areas.py +25 -19
  11. c2cgeoportal_admin/schemas/roles.py +12 -6
  12. c2cgeoportal_admin/schemas/treegroup.py +46 -21
  13. c2cgeoportal_admin/schemas/treeitem.py +3 -4
  14. c2cgeoportal_admin/static/layertree.css +3 -4
  15. c2cgeoportal_admin/static/navbar.css +36 -35
  16. c2cgeoportal_admin/static/theme.css +19 -9
  17. c2cgeoportal_admin/subscribers.py +3 -3
  18. c2cgeoportal_admin/templates/404.jinja2 +18 -2
  19. c2cgeoportal_admin/templates/layertree.jinja2 +31 -9
  20. c2cgeoportal_admin/templates/navigation_navbar.jinja2 +33 -0
  21. c2cgeoportal_admin/templates/ogcserver_synchronize.jinja2 +12 -0
  22. c2cgeoportal_admin/templates/widgets/functionality_fields.pt +51 -0
  23. c2cgeoportal_admin/templates/widgets/metadata.pt +7 -1
  24. c2cgeoportal_admin/views/__init__.py +29 -0
  25. c2cgeoportal_admin/views/dimension_layers.py +14 -9
  26. c2cgeoportal_admin/views/functionalities.py +52 -18
  27. c2cgeoportal_admin/views/home.py +5 -5
  28. c2cgeoportal_admin/views/interfaces.py +26 -20
  29. c2cgeoportal_admin/views/layer_groups.py +36 -25
  30. c2cgeoportal_admin/views/layers.py +17 -13
  31. c2cgeoportal_admin/views/layers_cog.py +135 -0
  32. c2cgeoportal_admin/views/layers_vectortiles.py +62 -27
  33. c2cgeoportal_admin/views/layers_wms.py +55 -34
  34. c2cgeoportal_admin/views/layers_wmts.py +54 -34
  35. c2cgeoportal_admin/views/layertree.py +38 -29
  36. c2cgeoportal_admin/views/logged_views.py +83 -0
  37. c2cgeoportal_admin/views/logs.py +91 -0
  38. c2cgeoportal_admin/views/oauth2_clients.py +30 -18
  39. c2cgeoportal_admin/views/ogc_servers.py +132 -36
  40. c2cgeoportal_admin/views/restriction_areas.py +39 -27
  41. c2cgeoportal_admin/views/roles.py +42 -28
  42. c2cgeoportal_admin/views/themes.py +47 -35
  43. c2cgeoportal_admin/views/themes_ordering.py +19 -14
  44. c2cgeoportal_admin/views/treeitems.py +21 -17
  45. c2cgeoportal_admin/views/users.py +46 -26
  46. c2cgeoportal_admin/widgets.py +17 -14
  47. {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.9rc44.dist-info}/METADATA +12 -12
  48. c2cgeoportal_admin-2.9rc44.dist-info/RECORD +97 -0
  49. {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.9rc44.dist-info}/WHEEL +1 -1
  50. c2cgeoportal_admin-2.9rc44.dist-info/entry_points.txt +5 -0
  51. tests/__init__.py +24 -20
  52. tests/conftest.py +22 -11
  53. tests/test_edit_url.py +11 -14
  54. tests/test_functionalities.py +52 -14
  55. tests/test_home.py +0 -1
  56. tests/test_interface.py +34 -11
  57. tests/test_layer_groups.py +57 -27
  58. tests/test_layers_cog.py +243 -0
  59. tests/test_layers_vectortiles.py +43 -25
  60. tests/test_layers_wms.py +67 -45
  61. tests/test_layers_wmts.py +47 -26
  62. tests/test_layertree.py +99 -16
  63. tests/test_left_menu.py +0 -1
  64. tests/test_lingva_extractor_config.py +64 -0
  65. tests/test_logs.py +102 -0
  66. tests/test_main.py +3 -1
  67. tests/test_metadatas.py +34 -21
  68. tests/test_oauth2_clients.py +40 -11
  69. tests/test_ogc_servers.py +84 -35
  70. tests/test_restriction_areas.py +38 -15
  71. tests/test_role.py +71 -43
  72. tests/test_themes.py +71 -37
  73. tests/test_themes_ordering.py +1 -2
  74. tests/test_treegroup.py +2 -2
  75. tests/test_user.py +56 -19
  76. tests/themes_ordering.py +1 -2
  77. c2cgeoportal_admin/templates/navigation_vertical.jinja2 +0 -33
  78. c2cgeoportal_admin-2.6.0.dist-info/RECORD +0 -89
  79. c2cgeoportal_admin-2.6.0.dist-info/entry_points.txt +0 -3
  80. {c2cgeoportal_admin-2.6.0.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
@@ -29,7 +24,7 @@ def layer_vectortiles_test_data(dbsession, transact):
29
24
  return layer
30
25
 
31
26
  data = factory_build_layers(layer_builder, dbsession)
32
- data["default"] = get_test_default_layers(dbsession, server)
27
+ data["default"] = get_test_default_layers(dbsession, None)
33
28
 
34
29
  dbsession.flush()
35
30
 
@@ -38,7 +33,6 @@ def layer_vectortiles_test_data(dbsession, transact):
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):
@@ -106,6 +100,8 @@ class TestLayerVectortiles(AbstractViewsTests):
106
100
  assert form["public"].checked
107
101
 
108
102
  def test_edit(self, test_app, layer_vectortiles_test_data, dbsession):
103
+ from c2cgeoportal_commons.models.main import Log, LogAction
104
+
109
105
  layer = layer_vectortiles_test_data["layers"][0]
110
106
 
111
107
  form = self.get_item(test_app, layer.id).form
@@ -122,11 +118,11 @@ class TestLayerVectortiles(AbstractViewsTests):
122
118
  assert str(layer.xyz or "") == form["xyz"].value
123
119
 
124
120
  interfaces = layer_vectortiles_test_data["interfaces"]
125
- 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}
126
122
  self._check_interfaces(form, interfaces, layer)
127
123
 
128
124
  ras = layer_vectortiles_test_data["restrictionareas"]
129
- 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}
130
126
  self._check_restrictionsareas(form, ras, layer)
131
127
 
132
128
  new_values = {
@@ -146,7 +142,7 @@ class TestLayerVectortiles(AbstractViewsTests):
146
142
 
147
143
  resp = form.submit("submit")
148
144
  assert str(layer.id) == re.match(
149
- r"http://localhost{}/(.*)\?msg_col=submit_ok".format(self._prefix), resp.location
145
+ rf"http://localhost{self._prefix}/(.*)\?msg_col=submit_ok", resp.location
150
146
  ).group(1)
151
147
 
152
148
  dbsession.expire(layer)
@@ -155,13 +151,19 @@ class TestLayerVectortiles(AbstractViewsTests):
155
151
  assert value == getattr(layer, key)
156
152
  else:
157
153
  assert str(value or "") == str(getattr(layer, key) or "")
158
- assert set([interfaces[1].id, interfaces[3].id]) == set(
159
- [interface.id for interface in layer.interfaces]
160
- )
161
- 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"
162
164
 
163
165
  def test_submit_new(self, dbsession, test_app, layer_vectortiles_test_data):
164
- from c2cgeoportal_commons.models.main import LayerVectorTiles
166
+ from c2cgeoportal_commons.models.main import LayerVectorTiles, Log, LogAction
165
167
 
166
168
  resp = test_app.post(
167
169
  "/admin/layers_vectortiles/new",
@@ -180,12 +182,20 @@ class TestLayerVectortiles(AbstractViewsTests):
180
182
  r"http://localhost/admin/layers_vectortiles/(.*)\?msg_col=submit_ok", resp.location
181
183
  ).group(1)
182
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
+
183
193
  def test_duplicate(self, layer_vectortiles_test_data, test_app, dbsession):
184
194
  from c2cgeoportal_commons.models.main import LayerVectorTiles
185
195
 
186
196
  layer = layer_vectortiles_test_data["layers"][3]
187
197
 
188
- 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)
189
199
  form = resp.form
190
200
 
191
201
  assert "" == self.get_first_field_named(form, "id").value
@@ -198,7 +208,7 @@ class TestLayerVectortiles(AbstractViewsTests):
198
208
  assert str(layer.style or "") == form["style"].value
199
209
  assert str(layer.xyz or "") == form["xyz"].value
200
210
  interfaces = layer_vectortiles_test_data["interfaces"]
201
- 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}
202
212
  self._check_interfaces(form, interfaces, layer)
203
213
 
204
214
  self.set_first_field_named(form, "name", "clone")
@@ -214,12 +224,20 @@ class TestLayerVectortiles(AbstractViewsTests):
214
224
  assert layer_vectortiles_test_data["layers"][3].metadatas[1].name == layer.metadatas[1].name
215
225
 
216
226
  def test_delete(self, test_app, dbsession):
217
- from c2cgeoportal_commons.models.main import Layer, LayerVectorTiles, TreeItem
227
+ from c2cgeoportal_commons.models.main import Layer, LayerVectorTiles, Log, LogAction, TreeItem
228
+
229
+ layer = dbsession.query(LayerVectorTiles).first()
218
230
 
219
- layer_id = dbsession.query(LayerVectorTiles.id).first().id
231
+ test_app.delete(f"/admin/layers_vectortiles/{layer.id}", status=200)
220
232
 
221
- 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
222
236
 
223
- assert dbsession.query(LayerVectorTiles).get(layer_id) is None
224
- assert dbsession.query(Layer).get(layer_id) is None
225
- 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
@@ -14,16 +14,16 @@ def layer_wms_test_data(dbsession, transact):
14
14
 
15
15
  from c2cgeoportal_commons.models.main import LayerWMS, OGCServer
16
16
 
17
- 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)]
18
18
  for i, server in enumerate(servers):
19
- server.url = "http://wms.geo.admin.ch_{}".format(i)
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
- layer = LayerWMS(name="layer_wms_{}".format(i))
24
- layer.layer = "layer_{}".format(i)
23
+ layer = LayerWMS(name=f"layer_wms_{i}")
24
+ layer.layer = f"layer_{i}"
25
25
  layer.public = 1 == i % 2
26
- layer.geo_table = "geotable_{}".format(i)
26
+ layer.geo_table = f"geotable_{i}"
27
27
  layer.ogc_server = servers[i % 4]
28
28
  layer.style = "décontrasté"
29
29
  return layer
@@ -39,7 +39,6 @@ def layer_wms_test_data(dbsession, transact):
39
39
 
40
40
  @pytest.mark.usefixtures("layer_wms_test_data", "test_app")
41
41
  class TestLayerWMSViews(AbstractViewsTests):
42
-
43
42
  _prefix = "/admin/layers_wms"
44
43
 
45
44
  def test_index_rendering(self, test_app):
@@ -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)
@@ -289,12 +304,9 @@ class TestLayerWMSViews(AbstractViewsTests):
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,41 +340,43 @@ 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
382
  from c2cgeoportal_commons.models.main import LayerGroup, LayerWMS
@@ -372,7 +386,7 @@ class TestLayerWMSViews(AbstractViewsTests):
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,17 +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 Layer, LayerWMS, 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
- def test_submit_new_no_layer_name(self, test_app, layer_wms_test_data):
417
+ def test_submit_new_no_layer_name(self, test_app, layer_wms_test_data, dbsession):
396
418
  resp = test_app.post(
397
419
  "/admin/layers_wms/new",
398
420
  {
@@ -417,5 +439,5 @@ class TestLayerWMSViews(AbstractViewsTests):
417
439
  "Errors have been highlighted below" == resp.html.select_one('div[class="error-msg-detail"]').text
418
440
  )
419
441
  assert ["WMS layer name"] == sorted(
420
- [(x.select_one("label").text.strip()) for x in resp.html.select("[class~='has-error']")]
442
+ (x.select_one("label").text.strip()) for x in resp.html.select("[class~='has-error']")
421
443
  )
tests/test_layers_wmts.py CHANGED
@@ -19,12 +19,12 @@ 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
@@ -39,7 +39,6 @@ def layer_wmts_test_data(dbsession, transact):
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,23 +199,31 @@ 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 Layer, LayerWMTS, 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
229
  from c2cgeoportal_commons.models.main import LayerWMS, LayerWMTS
@@ -218,10 +233,8 @@ class TestLayerWMTS(AbstractViewsTests):
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"