c2cgeoportal-admin 2.5.0.100__py3-none-any.whl → 2.7.1.156__py3-none-any.whl

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