c2cgeoportal-admin 2.6.0__py3-none-any.whl → 2.8.1.180__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 (78) hide show
  1. c2cgeoportal_admin/__init__.py +32 -10
  2. c2cgeoportal_admin/lib/lingua_extractor.py +77 -0
  3. c2cgeoportal_admin/lib/ogcserver_synchronizer.py +168 -56
  4. c2cgeoportal_admin/py.typed +0 -0
  5. c2cgeoportal_admin/routes.py +7 -4
  6. c2cgeoportal_admin/schemas/dimensions.py +12 -10
  7. c2cgeoportal_admin/schemas/functionalities.py +62 -21
  8. c2cgeoportal_admin/schemas/interfaces.py +22 -18
  9. c2cgeoportal_admin/schemas/metadata.py +100 -47
  10. c2cgeoportal_admin/schemas/restriction_areas.py +21 -19
  11. c2cgeoportal_admin/schemas/roles.py +7 -5
  12. c2cgeoportal_admin/schemas/treegroup.py +38 -17
  13. c2cgeoportal_admin/schemas/treeitem.py +2 -3
  14. c2cgeoportal_admin/static/layertree.css +3 -4
  15. c2cgeoportal_admin/static/navbar.css +36 -35
  16. c2cgeoportal_admin/static/theme.css +16 -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 +7 -6
  26. c2cgeoportal_admin/views/functionalities.py +33 -6
  27. c2cgeoportal_admin/views/home.py +5 -5
  28. c2cgeoportal_admin/views/interfaces.py +7 -8
  29. c2cgeoportal_admin/views/layer_groups.py +9 -11
  30. c2cgeoportal_admin/views/layers.py +8 -7
  31. c2cgeoportal_admin/views/layers_vectortiles.py +30 -10
  32. c2cgeoportal_admin/views/layers_wms.py +41 -35
  33. c2cgeoportal_admin/views/layers_wmts.py +41 -35
  34. c2cgeoportal_admin/views/layertree.py +36 -28
  35. c2cgeoportal_admin/views/logged_views.py +80 -0
  36. c2cgeoportal_admin/views/logs.py +90 -0
  37. c2cgeoportal_admin/views/oauth2_clients.py +30 -22
  38. c2cgeoportal_admin/views/ogc_servers.py +119 -37
  39. c2cgeoportal_admin/views/restriction_areas.py +13 -11
  40. c2cgeoportal_admin/views/roles.py +16 -12
  41. c2cgeoportal_admin/views/themes.py +15 -14
  42. c2cgeoportal_admin/views/themes_ordering.py +13 -8
  43. c2cgeoportal_admin/views/treeitems.py +14 -12
  44. c2cgeoportal_admin/views/users.py +12 -7
  45. c2cgeoportal_admin/widgets.py +17 -14
  46. {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.8.1.180.dist-info}/METADATA +17 -8
  47. c2cgeoportal_admin-2.8.1.180.dist-info/RECORD +95 -0
  48. {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.8.1.180.dist-info}/WHEEL +1 -1
  49. c2cgeoportal_admin-2.8.1.180.dist-info/entry_points.txt +6 -0
  50. tests/__init__.py +11 -12
  51. tests/conftest.py +2 -1
  52. tests/test_edit_url.py +11 -14
  53. tests/test_functionalities.py +52 -14
  54. tests/test_home.py +0 -1
  55. tests/test_interface.py +34 -11
  56. tests/test_layer_groups.py +57 -27
  57. tests/test_layers_vectortiles.py +43 -20
  58. tests/test_layers_wms.py +67 -45
  59. tests/test_layers_wmts.py +47 -26
  60. tests/test_layertree.py +99 -16
  61. tests/test_left_menu.py +0 -1
  62. tests/test_lingua_extractor_config.py +64 -0
  63. tests/test_logs.py +103 -0
  64. tests/test_main.py +3 -1
  65. tests/test_metadatas.py +34 -21
  66. tests/test_oauth2_clients.py +37 -9
  67. tests/test_ogc_servers.py +84 -35
  68. tests/test_restriction_areas.py +38 -15
  69. tests/test_role.py +68 -41
  70. tests/test_themes.py +71 -37
  71. tests/test_themes_ordering.py +1 -2
  72. tests/test_treegroup.py +2 -2
  73. tests/test_user.py +48 -17
  74. tests/themes_ordering.py +1 -2
  75. c2cgeoportal_admin/templates/navigation_vertical.jinja2 +0 -33
  76. c2cgeoportal_admin-2.6.0.dist-info/RECORD +0 -89
  77. c2cgeoportal_admin-2.6.0.dist-info/entry_points.txt +0 -3
  78. {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.8.1.180.dist-info}/top_level.txt +0 -0
@@ -9,15 +9,18 @@ from . import AbstractViewsTests
9
9
 
10
10
  @pytest.fixture(scope="function")
11
11
  @pytest.mark.usefixtures("dbsession", "transact")
12
- def functionality_test_data(dbsession, transact):
12
+ def functionality_test_data(dbsession, transact, settings):
13
13
  del transact
14
14
 
15
15
  from c2cgeoportal_commons.models.main import Functionality
16
16
 
17
17
  functionalities = []
18
18
  for i in range(0, 4):
19
- functionality = Functionality(name="functionality_{}".format(i), value="value_{}".format(i))
20
- functionality.description = "description_{}".format(i)
19
+ functionality = Functionality(
20
+ settings["admin_interface"]["available_functionalities"][i]["name"],
21
+ value=f"value_{i}",
22
+ )
23
+ functionality.description = f"description_{i}"
21
24
  dbsession.add(functionality)
22
25
  functionalities.append(functionality)
23
26
 
@@ -28,7 +31,6 @@ def functionality_test_data(dbsession, transact):
28
31
 
29
32
  @pytest.mark.usefixtures("functionality_test_data", "test_app")
30
33
  class TestFunctionality(AbstractViewsTests):
31
-
32
34
  _prefix = "/admin/functionalities"
33
35
 
34
36
  def test_index_rendering(self, test_app):
@@ -47,10 +49,10 @@ class TestFunctionality(AbstractViewsTests):
47
49
 
48
50
  def test_grid_search(self, test_app):
49
51
  # search on functionality name
50
- self.check_search(test_app, "functionality_0", total=1)
52
+ self.check_search(test_app, "default_basemap", total=1)
51
53
 
52
54
  def test_submit_new(self, dbsession, test_app):
53
- from c2cgeoportal_commons.models.main import Functionality
55
+ from c2cgeoportal_commons.models.main import Functionality, Log, LogAction
54
56
 
55
57
  resp = test_app.post(
56
58
  "/admin/functionalities/new",
@@ -63,9 +65,19 @@ class TestFunctionality(AbstractViewsTests):
63
65
  ).group(1)
64
66
  assert functionality.name == "new_name"
65
67
 
66
- def test_edit(self, test_app, functionality_test_data):
68
+ log = dbsession.query(Log).one()
69
+ assert log.date != None
70
+ assert log.action == LogAction.INSERT
71
+ assert log.element_type == "functionality"
72
+ assert log.element_id == functionality.id
73
+ assert log.element_name == functionality.name
74
+ assert log.username == "test_user"
75
+
76
+ def test_edit(self, test_app, functionality_test_data, dbsession):
77
+ from c2cgeoportal_commons.models.main import Log, LogAction
78
+
67
79
  functionality = functionality_test_data["functionalities"][0]
68
- resp = test_app.get("/admin/functionalities/{}".format(functionality.id), status=200)
80
+ resp = test_app.get(f"/admin/functionalities/{functionality.id}", status=200)
69
81
  form = resp.form
70
82
  assert str(functionality.id) == self.get_first_field_named(form, "id").value
71
83
  assert "hidden" == self.get_first_field_named(form, "id").attrs["type"]
@@ -74,25 +86,51 @@ class TestFunctionality(AbstractViewsTests):
74
86
  assert form.submit().status_int == 302
75
87
  assert functionality.description == "new_description"
76
88
 
89
+ log = dbsession.query(Log).one()
90
+ assert log.date != None
91
+ assert log.action == LogAction.UPDATE
92
+ assert log.element_type == "functionality"
93
+ assert log.element_id == functionality.id
94
+ assert log.element_name == functionality.name
95
+ assert log.username == "test_user"
96
+
77
97
  def test_delete(self, test_app, functionality_test_data, dbsession):
78
- from c2cgeoportal_commons.models.main import Functionality
98
+ from c2cgeoportal_commons.models.main import Functionality, Log, LogAction
79
99
 
80
100
  functionality = functionality_test_data["functionalities"][0]
81
101
  deleted_id = functionality.id
82
- test_app.delete("/admin/functionalities/{}".format(deleted_id), status=200)
102
+ test_app.delete(f"/admin/functionalities/{deleted_id}", status=200)
83
103
  assert dbsession.query(Functionality).get(deleted_id) is None
84
104
 
105
+ log = dbsession.query(Log).one()
106
+ assert log.date != None
107
+ assert log.action == LogAction.DELETE
108
+ assert log.element_type == "functionality"
109
+ assert log.element_id == functionality.id
110
+ assert log.element_name == functionality.name
111
+ assert log.username == "test_user"
112
+
85
113
  def test_duplicate(self, functionality_test_data, test_app, dbsession):
86
114
  from c2cgeoportal_commons.models.main import Functionality
87
115
 
88
116
  functionality = functionality_test_data["functionalities"][3]
89
- resp = test_app.get("/admin/functionalities/{}/duplicate".format(functionality.id), status=200)
117
+
118
+ resp = test_app.get(f"/admin/functionalities/{functionality.id}/duplicate", status=200)
119
+
90
120
  form = resp.form
91
- assert "" == self.get_first_field_named(form, "id").value
92
- self.set_first_field_named(form, "name", "clone")
121
+ assert form["name"].value == functionality.name
122
+ assert form["description"].value == functionality.description
123
+ assert form["value"].value == functionality.value
124
+ form["value"].value = "another_value"
93
125
  resp = form.submit("submit")
126
+
94
127
  assert resp.status_int == 302
95
- functionality = dbsession.query(Functionality).filter(Functionality.name == "clone").one()
128
+ functionality = (
129
+ dbsession.query(Functionality)
130
+ .filter(Functionality.name == functionality.name)
131
+ .filter(Functionality.value == "another_value")
132
+ .one()
133
+ )
96
134
  assert str(functionality.id) == re.match(
97
135
  r"http://localhost/admin/functionalities/(.*)\?msg_col=submit_ok", resp.location
98
136
  ).group(1)
tests/test_home.py CHANGED
@@ -5,7 +5,6 @@ from . import AbstractViewsTests
5
5
 
6
6
  @pytest.mark.usefixtures("test_app")
7
7
  class TestHome(AbstractViewsTests):
8
-
9
8
  _prefix = "/admin/"
10
9
 
11
10
  def test_index_rendering(self, test_app):
tests/test_interface.py CHANGED
@@ -16,14 +16,14 @@ def interface_test_data(dbsession, transact):
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
 
@@ -45,7 +45,6 @@ def interface_test_data(dbsession, transact):
45
45
 
46
46
  @pytest.mark.usefixtures("interface_test_data", "test_app")
47
47
  class TestInterface(AbstractViewsTests):
48
-
49
48
  _prefix = "/admin/interfaces"
50
49
 
51
50
  def test_index_rendering(self, test_app):
@@ -82,7 +81,7 @@ class TestInterface(AbstractViewsTests):
82
81
  self.check_search(test_app, "interface_0", total=1)
83
82
 
84
83
  def test_submit_new(self, dbsession, test_app):
85
- from c2cgeoportal_commons.models.main import Interface
84
+ from c2cgeoportal_commons.models.main import Interface, Log, LogAction
86
85
 
87
86
  resp = test_app.post(
88
87
  "/admin/interfaces/new", {"name": "new_name", "description": "new description"}, status=302
@@ -94,14 +93,22 @@ class TestInterface(AbstractViewsTests):
94
93
  ).group(1)
95
94
  assert interface.name == "new_name"
96
95
 
96
+ log = dbsession.query(Log).one()
97
+ assert log.date != None
98
+ assert log.action == LogAction.INSERT
99
+ assert log.element_type == "interface"
100
+ assert log.element_id == interface.id
101
+ assert log.element_name == interface.name
102
+ assert log.username == "test_user"
103
+
97
104
  def test_edit(self, test_app, interface_test_data, dbsession):
98
- from c2cgeoportal_commons.models.main import Interface
105
+ from c2cgeoportal_commons.models.main import Interface, Log, LogAction
99
106
 
100
107
  interface = interface_test_data["interfaces"][0]
101
108
  descriptions = "{}, {}".format(
102
109
  interface_test_data["interfaces"][0].description, interface_test_data["interfaces"][1].description
103
110
  )
104
- resp = test_app.get("/admin/interfaces/{}".format(interface.id), status=200)
111
+ resp = test_app.get(f"/admin/interfaces/{interface.id}", status=200)
105
112
  form = resp.form
106
113
  form["description"] = descriptions
107
114
  assert str(interface.id) == self.get_first_field_named(form, "id").value
@@ -110,16 +117,32 @@ class TestInterface(AbstractViewsTests):
110
117
  assert form.submit().status_int == 302
111
118
  assert len(dbsession.query(Interface).filter(Interface.description == descriptions).all()) == 1
112
119
 
120
+ log = dbsession.query(Log).one()
121
+ assert log.date != None
122
+ assert log.action == LogAction.UPDATE
123
+ assert log.element_type == "interface"
124
+ assert log.element_id == interface.id
125
+ assert log.element_name == interface.name
126
+ assert log.username == "test_user"
127
+
113
128
  def test_delete(self, test_app, interface_test_data, dbsession):
114
- from c2cgeoportal_commons.models.main import Interface
129
+ from c2cgeoportal_commons.models.main import Interface, Log, LogAction
115
130
 
116
131
  interface = interface_test_data["interfaces"][0]
117
- test_app.delete("/admin/interfaces/{}".format(interface.id), status=200)
132
+ test_app.delete(f"/admin/interfaces/{interface.id}", status=200)
118
133
  assert len(dbsession.query(Interface).filter(Interface.id == interface.id).all()) == 0
119
134
 
135
+ log = dbsession.query(Log).one()
136
+ assert log.date != None
137
+ assert log.action == LogAction.DELETE
138
+ assert log.element_type == "interface"
139
+ assert log.element_id == interface.id
140
+ assert log.element_name == interface.name
141
+ assert log.username == "test_user"
142
+
120
143
  def test_duplicate(self, interface_test_data, test_app):
121
144
  interface = interface_test_data["interfaces"][3]
122
- resp = test_app.get("/admin/interfaces/{}/duplicate".format(interface.id), status=200)
145
+ resp = test_app.get(f"/admin/interfaces/{interface.id}/duplicate", status=200)
123
146
  form = resp.form
124
147
  assert "" == self.get_first_field_named(form, "id").value
125
148
  assert str(interface.description or "") == "description_3"
@@ -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]
@@ -60,7 +60,6 @@ def layer_groups_test_data(dbsession, transact):
60
60
 
61
61
  @pytest.mark.usefixtures("layer_groups_test_data", "test_app")
62
62
  class TestLayersGroups(TestTreeGroup):
63
-
64
63
  _prefix = "/admin/layer_groups"
65
64
 
66
65
  def test_index_rendering(self, test_app):
@@ -73,7 +72,6 @@ class TestLayersGroups(TestTreeGroup):
73
72
  ("id", "id", "true"),
74
73
  ("name", "Name"),
75
74
  ("description", "Description"),
76
- ("is_expanded", "Expanded"),
77
75
  ("parents_relation", "Parents", "false"),
78
76
  ("metadatas", "Metadatas", "false"),
79
77
  ]
@@ -95,6 +93,8 @@ class TestLayersGroups(TestTreeGroup):
95
93
  self.check_search(test_app, "copyable", total=8)
96
94
 
97
95
  def test_edit(self, test_app, layer_groups_test_data, dbsession):
96
+ from c2cgeoportal_commons.models.main import Log, LogAction
97
+
98
98
  group = layer_groups_test_data["groups"][1]
99
99
 
100
100
  form = self.get_item(test_app, group.id).form
@@ -103,8 +103,6 @@ class TestLayersGroups(TestTreeGroup):
103
103
  assert "hidden" == self.get_first_field_named(form, "id").attrs["type"]
104
104
  assert group.name == self.get_first_field_named(form, "name").value
105
105
  assert str(group.description or "") == self.get_first_field_named(form, "description").value
106
- assert group.is_expanded is False
107
- assert group.is_expanded == form["is_expanded"].checked
108
106
 
109
107
  self.check_children(
110
108
  form,
@@ -121,7 +119,6 @@ class TestLayersGroups(TestTreeGroup):
121
119
  new_values = {
122
120
  "name": "new_name",
123
121
  "description": "new description",
124
- "is_expanded": True,
125
122
  }
126
123
  for key, value in new_values.items():
127
124
  self.set_first_field_named(form, key, value)
@@ -138,13 +135,21 @@ class TestLayersGroups(TestTreeGroup):
138
135
  else:
139
136
  assert str(value or "") == str(getattr(group, key) or "")
140
137
 
138
+ log = dbsession.query(Log).one()
139
+ assert log.date != None
140
+ assert log.action == LogAction.UPDATE
141
+ assert log.element_type == "layergroup"
142
+ assert log.element_id == group.id
143
+ assert log.element_name == group.name
144
+ assert log.username == "test_user"
145
+
141
146
  def test_post_new_with_children_invalid(self, test_app, layer_groups_test_data):
142
147
  """
143
148
  Check there is no rendering error when validation fails.
144
149
  """
145
150
  groups = layer_groups_test_data["groups"]
146
151
  resp = test_app.post(
147
- "{}/new".format(self._prefix),
152
+ f"{self._prefix}/new",
148
153
  (
149
154
  ("_charset_", "UTF-8"),
150
155
  ("__formid__", "deform"),
@@ -163,9 +168,11 @@ class TestLayersGroups(TestTreeGroup):
163
168
  assert "Required" == resp.html.select_one(".item-name .help-block").getText().strip()
164
169
 
165
170
  def test_post_new_with_children_success(self, test_app, dbsession, layer_groups_test_data):
171
+ from c2cgeoportal_commons.models.main import Log, LogAction
172
+
166
173
  groups = layer_groups_test_data["groups"]
167
174
  resp = test_app.post(
168
- "{}/new".format(self._prefix),
175
+ f"{self._prefix}/new",
169
176
  (
170
177
  ("_charset_", "UTF-8"),
171
178
  ("__formid__", "deform"),
@@ -206,11 +213,21 @@ class TestLayersGroups(TestTreeGroup):
206
213
  rel.treeitem_id for rel in group.children_relation
207
214
  ]
208
215
 
216
+ log = dbsession.query(Log).one()
217
+ assert log.date != None
218
+ assert log.action == LogAction.INSERT
219
+ assert log.element_type == "layergroup"
220
+ assert log.element_id == group.id
221
+ assert log.element_name == group.name
222
+ assert log.username == "test_user"
223
+
209
224
  def test_post_with_ancestor(self, layer_groups_test_data, test_app):
210
- """Check that ancestors are refused to avoid cycles"""
225
+ """
226
+ Check that ancestors are refused to avoid cycles.
227
+ """
211
228
  groups = layer_groups_test_data["groups"]
212
229
  resp = test_app.post(
213
- "{}/{}".format(self._prefix, groups[3].id),
230
+ f"{self._prefix}/{groups[3].id}",
214
231
  (
215
232
  ("_charset_", "UTF-8"),
216
233
  ("__formid__", "deform"),
@@ -228,7 +245,7 @@ class TestLayersGroups(TestTreeGroup):
228
245
  status=200,
229
246
  )
230
247
  assert (
231
- "Value {} does not exist in table treeitem or is not allowed to avoid cycles".format(groups[1].id)
248
+ f"Value {groups[1].id} does not exist in table treeitem or is not allowed to avoid cycles"
232
249
  == resp.html.select_one(".item-children_relation + .help-block").getText().strip()
233
250
  )
234
251
 
@@ -237,7 +254,7 @@ class TestLayersGroups(TestTreeGroup):
237
254
 
238
255
  group = layer_groups_test_data["groups"][1]
239
256
 
240
- resp = test_app.get("{}/{}/duplicate".format(self._prefix, group.id), status=200)
257
+ resp = test_app.get(f"{self._prefix}/{group.id}/duplicate", status=200)
241
258
  form = resp.form
242
259
 
243
260
  group = dbsession.query(LayerGroup).filter(LayerGroup.id == group.id).one()
@@ -245,8 +262,6 @@ class TestLayersGroups(TestTreeGroup):
245
262
  assert "" == self.get_first_field_named(form, "id").value
246
263
  assert group.name == self.get_first_field_named(form, "name").value
247
264
  assert str(group.description or "") == self.get_first_field_named(form, "description").value
248
- assert group.is_expanded is False
249
- assert group.is_expanded == form["is_expanded"].checked
250
265
 
251
266
  self.check_children(
252
267
  form,
@@ -263,7 +278,7 @@ class TestLayersGroups(TestTreeGroup):
263
278
  duplicated = dbsession.query(LayerGroup).filter(LayerGroup.name == "duplicated").one()
264
279
 
265
280
  assert str(duplicated.id) == re.match(
266
- r"http://localhost{}/(.*)\?msg_col=submit_ok".format(self._prefix), resp.location
281
+ rf"http://localhost{self._prefix}/(.*)\?msg_col=submit_ok", resp.location
267
282
  ).group(1)
268
283
  assert duplicated.id != group.id
269
284
  assert duplicated.children_relation[0].id != group.children_relation[0].id
@@ -271,41 +286,56 @@ class TestLayersGroups(TestTreeGroup):
271
286
 
272
287
  def test_unicity_validator(self, layer_groups_test_data, test_app):
273
288
  group = layer_groups_test_data["groups"][1]
274
- resp = test_app.get("{}/{}/duplicate".format(self._prefix, group.id), status=200)
289
+ resp = test_app.get(f"{self._prefix}/{group.id}/duplicate", status=200)
275
290
 
276
291
  resp = resp.form.submit("submit")
277
292
 
278
- self._check_submission_problem(resp, "{} is already used.".format(group.name))
293
+ self._check_submission_problem(resp, f"{group.name} is already used.")
279
294
 
280
295
  def test_delete(self, test_app, dbsession, layer_groups_test_data):
281
- from c2cgeoportal_commons.models.main import LayerGroup, LayergroupTreeitem, TreeGroup, TreeItem
296
+ from c2cgeoportal_commons.models.main import (
297
+ LayerGroup,
298
+ LayergroupTreeitem,
299
+ Log,
300
+ LogAction,
301
+ TreeGroup,
302
+ TreeItem,
303
+ )
282
304
 
283
- group_id = layer_groups_test_data["groups"][9].id
305
+ group = layer_groups_test_data["groups"][9]
284
306
 
285
307
  assert (
286
308
  3
287
- == dbsession.query(LayergroupTreeitem).filter(LayergroupTreeitem.treegroup_id == group_id).count()
309
+ == dbsession.query(LayergroupTreeitem).filter(LayergroupTreeitem.treegroup_id == group.id).count()
288
310
  )
289
311
 
290
312
  assert (
291
313
  1
292
- == dbsession.query(LayergroupTreeitem).filter(LayergroupTreeitem.treeitem_id == group_id).count()
314
+ == dbsession.query(LayergroupTreeitem).filter(LayergroupTreeitem.treeitem_id == group.id).count()
293
315
  )
294
316
 
295
- test_app.delete("/admin/layer_groups/{}".format(group_id), status=200)
317
+ test_app.delete(f"/admin/layer_groups/{group.id}", status=200)
296
318
 
297
319
  dbsession.expire_all()
298
320
 
299
- assert dbsession.query(LayerGroup).get(group_id) is None
300
- assert dbsession.query(TreeGroup).get(group_id) is None
301
- assert dbsession.query(TreeItem).get(group_id) is None
321
+ assert dbsession.query(LayerGroup).get(group.id) is None
322
+ assert dbsession.query(TreeGroup).get(group.id) is None
323
+ assert dbsession.query(TreeItem).get(group.id) is None
302
324
 
303
325
  assert (
304
326
  0
305
- == dbsession.query(LayergroupTreeitem).filter(LayergroupTreeitem.treegroup_id == group_id).count()
327
+ == dbsession.query(LayergroupTreeitem).filter(LayergroupTreeitem.treegroup_id == group.id).count()
306
328
  )
307
329
 
308
330
  assert (
309
331
  0
310
- == dbsession.query(LayergroupTreeitem).filter(LayergroupTreeitem.treeitem_id == group_id).count()
332
+ == dbsession.query(LayergroupTreeitem).filter(LayergroupTreeitem.treeitem_id == group.id).count()
311
333
  )
334
+
335
+ log = dbsession.query(Log).one()
336
+ assert log.date != None
337
+ assert log.action == LogAction.DELETE
338
+ assert log.element_type == "layergroup"
339
+ assert log.element_id == group.id
340
+ assert log.element_name == group.name
341
+ assert log.username == "test_user"
@@ -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
@@ -38,7 +38,6 @@ def layer_vectortiles_test_data(dbsession, transact):
38
38
 
39
39
  @pytest.mark.usefixtures("layer_vectortiles_test_data", "test_app")
40
40
  class TestLayerVectortiles(AbstractViewsTests):
41
-
42
41
  _prefix = "/admin/layers_vectortiles"
43
42
 
44
43
  def test_index_rendering(self, test_app):
@@ -106,6 +105,8 @@ class TestLayerVectortiles(AbstractViewsTests):
106
105
  assert form["public"].checked
107
106
 
108
107
  def test_edit(self, test_app, layer_vectortiles_test_data, dbsession):
108
+ from c2cgeoportal_commons.models.main import Log, LogAction
109
+
109
110
  layer = layer_vectortiles_test_data["layers"][0]
110
111
 
111
112
  form = self.get_item(test_app, layer.id).form
@@ -122,11 +123,11 @@ class TestLayerVectortiles(AbstractViewsTests):
122
123
  assert str(layer.xyz or "") == form["xyz"].value
123
124
 
124
125
  interfaces = layer_vectortiles_test_data["interfaces"]
125
- assert set((interfaces[0].id, interfaces[2].id)) == set(i.id for i in layer.interfaces)
126
+ assert {interfaces[0].id, interfaces[2].id} == {i.id for i in layer.interfaces}
126
127
  self._check_interfaces(form, interfaces, layer)
127
128
 
128
129
  ras = layer_vectortiles_test_data["restrictionareas"]
129
- assert set((ras[0].id, ras[2].id)) == set(i.id for i in layer.restrictionareas)
130
+ assert {ras[0].id, ras[2].id} == {i.id for i in layer.restrictionareas}
130
131
  self._check_restrictionsareas(form, ras, layer)
131
132
 
132
133
  new_values = {
@@ -146,7 +147,7 @@ class TestLayerVectortiles(AbstractViewsTests):
146
147
 
147
148
  resp = form.submit("submit")
148
149
  assert str(layer.id) == re.match(
149
- r"http://localhost{}/(.*)\?msg_col=submit_ok".format(self._prefix), resp.location
150
+ rf"http://localhost{self._prefix}/(.*)\?msg_col=submit_ok", resp.location
150
151
  ).group(1)
151
152
 
152
153
  dbsession.expire(layer)
@@ -155,13 +156,19 @@ class TestLayerVectortiles(AbstractViewsTests):
155
156
  assert value == getattr(layer, key)
156
157
  else:
157
158
  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])
159
+ assert {interfaces[1].id, interfaces[3].id} == {interface.id for interface in layer.interfaces}
160
+ assert {ras[1].id, ras[3].id} == {ra.id for ra in layer.restrictionareas}
161
+
162
+ log = dbsession.query(Log).one()
163
+ assert log.date != None
164
+ assert log.action == LogAction.UPDATE
165
+ assert log.element_type == "layer_vectortiles"
166
+ assert log.element_id == layer.id
167
+ assert log.element_name == layer.name
168
+ assert log.username == "test_user"
162
169
 
163
170
  def test_submit_new(self, dbsession, test_app, layer_vectortiles_test_data):
164
- from c2cgeoportal_commons.models.main import LayerVectorTiles
171
+ from c2cgeoportal_commons.models.main import LayerVectorTiles, Log, LogAction
165
172
 
166
173
  resp = test_app.post(
167
174
  "/admin/layers_vectortiles/new",
@@ -180,12 +187,20 @@ class TestLayerVectortiles(AbstractViewsTests):
180
187
  r"http://localhost/admin/layers_vectortiles/(.*)\?msg_col=submit_ok", resp.location
181
188
  ).group(1)
182
189
 
190
+ log = dbsession.query(Log).one()
191
+ assert log.date != None
192
+ assert log.action == LogAction.INSERT
193
+ assert log.element_type == "layer_vectortiles"
194
+ assert log.element_id == layer.id
195
+ assert log.element_name == layer.name
196
+ assert log.username == "test_user"
197
+
183
198
  def test_duplicate(self, layer_vectortiles_test_data, test_app, dbsession):
184
199
  from c2cgeoportal_commons.models.main import LayerVectorTiles
185
200
 
186
201
  layer = layer_vectortiles_test_data["layers"][3]
187
202
 
188
- resp = test_app.get("/admin/layers_vectortiles/{}/duplicate".format(layer.id), status=200)
203
+ resp = test_app.get(f"/admin/layers_vectortiles/{layer.id}/duplicate", status=200)
189
204
  form = resp.form
190
205
 
191
206
  assert "" == self.get_first_field_named(form, "id").value
@@ -198,7 +213,7 @@ class TestLayerVectortiles(AbstractViewsTests):
198
213
  assert str(layer.style or "") == form["style"].value
199
214
  assert str(layer.xyz or "") == form["xyz"].value
200
215
  interfaces = layer_vectortiles_test_data["interfaces"]
201
- assert set((interfaces[3].id, interfaces[1].id)) == set(i.id for i in layer.interfaces)
216
+ assert {interfaces[3].id, interfaces[1].id} == {i.id for i in layer.interfaces}
202
217
  self._check_interfaces(form, interfaces, layer)
203
218
 
204
219
  self.set_first_field_named(form, "name", "clone")
@@ -214,12 +229,20 @@ class TestLayerVectortiles(AbstractViewsTests):
214
229
  assert layer_vectortiles_test_data["layers"][3].metadatas[1].name == layer.metadatas[1].name
215
230
 
216
231
  def test_delete(self, test_app, dbsession):
217
- from c2cgeoportal_commons.models.main import Layer, LayerVectorTiles, TreeItem
232
+ from c2cgeoportal_commons.models.main import Layer, LayerVectorTiles, Log, LogAction, TreeItem
233
+
234
+ layer = dbsession.query(LayerVectorTiles).first()
218
235
 
219
- layer_id = dbsession.query(LayerVectorTiles.id).first().id
236
+ test_app.delete(f"/admin/layers_vectortiles/{layer.id}", status=200)
220
237
 
221
- test_app.delete("/admin/layers_vectortiles/{}".format(layer_id), status=200)
238
+ assert dbsession.query(LayerVectorTiles).get(layer.id) is None
239
+ assert dbsession.query(Layer).get(layer.id) is None
240
+ assert dbsession.query(TreeItem).get(layer.id) is None
222
241
 
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
242
+ log = dbsession.query(Log).one()
243
+ assert log.date != None
244
+ assert log.action == LogAction.DELETE
245
+ assert log.element_type == "layer_vectortiles"
246
+ assert log.element_id == layer.id
247
+ assert log.element_name == layer.name
248
+ assert log.username == "test_user"