c2cgeoportal-admin 2.6.0__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 (71) hide show
  1. c2cgeoportal_admin/__init__.py +17 -10
  2. c2cgeoportal_admin/lib/lingua_extractor.py +77 -0
  3. c2cgeoportal_admin/lib/ogcserver_synchronizer.py +166 -54
  4. c2cgeoportal_admin/py.typed +0 -0
  5. c2cgeoportal_admin/routes.py +4 -3
  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 +99 -46
  10. c2cgeoportal_admin/schemas/restriction_areas.py +21 -19
  11. c2cgeoportal_admin/schemas/roles.py +7 -5
  12. c2cgeoportal_admin/schemas/treegroup.py +37 -16
  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/layertree.jinja2 +31 -9
  19. c2cgeoportal_admin/templates/navigation_navbar.jinja2 +33 -0
  20. c2cgeoportal_admin/templates/ogcserver_synchronize.jinja2 +12 -0
  21. c2cgeoportal_admin/templates/widgets/functionality_fields.pt +51 -0
  22. c2cgeoportal_admin/templates/widgets/metadata.pt +7 -1
  23. c2cgeoportal_admin/views/dimension_layers.py +7 -6
  24. c2cgeoportal_admin/views/functionalities.py +31 -5
  25. c2cgeoportal_admin/views/home.py +5 -5
  26. c2cgeoportal_admin/views/interfaces.py +5 -7
  27. c2cgeoportal_admin/views/layer_groups.py +9 -11
  28. c2cgeoportal_admin/views/layers.py +8 -7
  29. c2cgeoportal_admin/views/layers_vectortiles.py +30 -10
  30. c2cgeoportal_admin/views/layers_wms.py +39 -35
  31. c2cgeoportal_admin/views/layers_wmts.py +39 -35
  32. c2cgeoportal_admin/views/layertree.py +35 -27
  33. c2cgeoportal_admin/views/oauth2_clients.py +26 -21
  34. c2cgeoportal_admin/views/ogc_servers.py +57 -29
  35. c2cgeoportal_admin/views/restriction_areas.py +11 -10
  36. c2cgeoportal_admin/views/roles.py +14 -11
  37. c2cgeoportal_admin/views/themes.py +15 -14
  38. c2cgeoportal_admin/views/themes_ordering.py +13 -8
  39. c2cgeoportal_admin/views/treeitems.py +12 -11
  40. c2cgeoportal_admin/views/users.py +7 -5
  41. c2cgeoportal_admin/widgets.py +17 -14
  42. {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.7.1.156.dist-info}/METADATA +15 -12
  43. c2cgeoportal_admin-2.7.1.156.dist-info/RECORD +92 -0
  44. {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.7.1.156.dist-info}/WHEEL +1 -1
  45. c2cgeoportal_admin-2.7.1.156.dist-info/entry_points.txt +5 -0
  46. tests/__init__.py +9 -9
  47. tests/conftest.py +2 -1
  48. tests/test_edit_url.py +11 -13
  49. tests/test_functionalities.py +23 -10
  50. tests/test_interface.py +7 -7
  51. tests/test_layer_groups.py +13 -17
  52. tests/test_layers_vectortiles.py +11 -13
  53. tests/test_layers_wms.py +25 -36
  54. tests/test_layers_wmts.py +15 -19
  55. tests/test_layertree.py +99 -15
  56. tests/test_lingua_extractor_config.py +66 -0
  57. tests/test_main.py +3 -1
  58. tests/test_metadatas.py +34 -20
  59. tests/test_oauth2_clients.py +4 -4
  60. tests/test_ogc_servers.py +21 -10
  61. tests/test_restriction_areas.py +10 -12
  62. tests/test_role.py +37 -35
  63. tests/test_themes.py +40 -33
  64. tests/test_themes_ordering.py +1 -1
  65. tests/test_treegroup.py +2 -2
  66. tests/test_user.py +15 -13
  67. tests/themes_ordering.py +1 -1
  68. c2cgeoportal_admin/templates/navigation_vertical.jinja2 +0 -33
  69. c2cgeoportal_admin-2.6.0.dist-info/RECORD +0 -89
  70. c2cgeoportal_admin-2.6.0.dist-info/entry_points.txt +0 -3
  71. {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.7.1.156.dist-info}/top_level.txt +0 -0
tests/test_metadatas.py CHANGED
@@ -85,7 +85,9 @@ class TestMetadatasView(AbstractViewsTests):
85
85
  return None
86
86
  return metadata.value
87
87
 
88
- def _check_metadatas(self, test_app, item, metadatas):
88
+ def _check_metadatas(self, test_app, item, metadatas, model):
89
+ from c2cgeoportal_admin.schemas.metadata import metadata_definitions
90
+
89
91
  settings = test_app.app.registry.settings
90
92
  self._check_sequence(
91
93
  item,
@@ -96,9 +98,7 @@ class TestMetadatasView(AbstractViewsTests):
96
98
  "name": "name",
97
99
  "value": [
98
100
  {"text": s_m["name"], "value": s_m["name"], "selected": s_m["name"] == m.name}
99
- for s_m in sorted(
100
- settings["admin_interface"]["available_metadata"], key=lambda m: m["name"]
101
- )
101
+ for s_m in sorted(metadata_definitions(settings, model), key=lambda m: m["name"])
102
102
  ],
103
103
  "label": "Name",
104
104
  },
@@ -131,7 +131,7 @@ class TestMetadatasView(AbstractViewsTests):
131
131
  resp = self._post_metadata(test_app, url, base_mapping, name, value, 200)
132
132
  assert (
133
133
  error_msg
134
- == resp.html.select_one(".item-{} .help-block".format(self.__metadata_ui_type(test_app, name)))
134
+ == resp.html.select_one(f".item-{self.__metadata_ui_type(test_app, name)} .help-block")
135
135
  .getText()
136
136
  .strip()
137
137
  )
@@ -156,12 +156,16 @@ class TestMetadatasView(AbstractViewsTests):
156
156
  )
157
157
 
158
158
  def test_get_true_boolean_metadata(self, metadatas_test_data, test_app):
159
- metadatas_test_data["layer_wms"].get_metadatas("_boolean")[0].value = "true"
160
- self._test_edit_treeitem("layers_wms", metadatas_test_data["layer_wms"], test_app)
159
+ from c2cgeoportal_commons.models.main import LayerWMS
160
+
161
+ metadatas_test_data["layer_wms"].get_metadata("_boolean")[0].value = "true"
162
+ self._test_edit_treeitem("layers_wms", metadatas_test_data["layer_wms"], test_app, LayerWMS)
161
163
 
162
164
  def test_get_false_boolean_metadata(self, metadatas_test_data, test_app):
163
- metadatas_test_data["layer_wms"].get_metadatas("_boolean")[0].value = "false"
164
- self._test_edit_treeitem("layers_wms", metadatas_test_data["layer_wms"], test_app)
165
+ from c2cgeoportal_commons.models.main import LayerWMS
166
+
167
+ metadatas_test_data["layer_wms"].get_metadata("_boolean")[0].value = "false"
168
+ self._test_edit_treeitem("layers_wms", metadatas_test_data["layer_wms"], test_app, LayerWMS)
165
169
 
166
170
  def test_post_true_boolean_metadata(self, test_app, metadatas_test_data, dbsession):
167
171
  from c2cgeoportal_commons.models.main import LayerWMS
@@ -175,7 +179,7 @@ class TestMetadatasView(AbstractViewsTests):
175
179
  302,
176
180
  )
177
181
  layer = dbsession.query(LayerWMS).filter(LayerWMS.name == "new_name").one()
178
- assert layer.get_metadatas("_boolean")[0].value == "true"
182
+ assert layer.get_metadata("_boolean")[0].value == "true"
179
183
 
180
184
  def test_post_false_boolean_metadata(self, test_app, metadatas_test_data, dbsession):
181
185
  from c2cgeoportal_commons.models.main import LayerWMS
@@ -189,7 +193,7 @@ class TestMetadatasView(AbstractViewsTests):
189
193
  302,
190
194
  )
191
195
  layer = dbsession.query(LayerWMS).filter(LayerWMS.name == "new_name").one()
192
- assert layer.get_metadatas("_boolean")[0].value == "false"
196
+ assert layer.get_metadata("_boolean")[0].value == "false"
193
197
 
194
198
  def test_valid_float_metadata(self, test_app, metadatas_test_data):
195
199
  self._post_metadata(
@@ -304,31 +308,41 @@ class TestMetadatasView(AbstractViewsTests):
304
308
  302,
305
309
  )
306
310
 
307
- def _test_edit_treeitem(self, prefix, item, test_app):
308
- resp = self.get(test_app, "{}/{}".format(prefix, item.id))
309
- self._check_metadatas(test_app, resp.html.select_one(".item-metadatas"), item.metadatas)
311
+ def _test_edit_treeitem(self, prefix, item, test_app, model):
312
+ resp = self.get(test_app, f"{prefix}/{item.id}")
313
+ self._check_metadatas(test_app, resp.html.select_one(".item-metadatas"), item.metadatas, model)
310
314
  resp.form.submit("submit", status=302)
311
315
 
312
316
  def test_layer_wms_metadatas(self, metadatas_test_data, test_app):
313
- self._test_edit_treeitem("layers_wms", metadatas_test_data["layer_wms"], test_app)
317
+ from c2cgeoportal_commons.models.main import LayerWMS
318
+
319
+ self._test_edit_treeitem("layers_wms", metadatas_test_data["layer_wms"], test_app, LayerWMS)
314
320
 
315
321
  def test_layer_wmts_metadatas(self, metadatas_test_data, test_app):
316
- self._test_edit_treeitem("layers_wmts", metadatas_test_data["layer_wmts"], test_app)
322
+ from c2cgeoportal_commons.models.main import LayerWMTS
323
+
324
+ self._test_edit_treeitem("layers_wmts", metadatas_test_data["layer_wmts"], test_app, LayerWMTS)
317
325
 
318
326
  def test_theme_metadatas(self, metadatas_test_data, test_app):
319
- self._test_edit_treeitem("themes", metadatas_test_data["theme"], test_app)
327
+ from c2cgeoportal_commons.models.main import Theme
328
+
329
+ self._test_edit_treeitem("themes", metadatas_test_data["theme"], test_app, Theme)
320
330
 
321
331
  def test_group_metadatas(self, metadatas_test_data, test_app):
322
- self._test_edit_treeitem("layer_groups", metadatas_test_data["group"], test_app)
332
+ from c2cgeoportal_commons.models.main import LayerGroup
333
+
334
+ self._test_edit_treeitem("layer_groups", metadatas_test_data["group"], test_app, LayerGroup)
323
335
 
324
336
  def test_undefined_metadata(self, metadatas_test_data, test_app):
325
- """Undefined metadata must be kept intact across submissions"""
337
+ """
338
+ Undefined metadata must be kept intact across submissions.
339
+ """
326
340
  from c2cgeoportal_commons.models.main import Metadata
327
341
 
328
342
  layer = metadatas_test_data["layer_wms"]
329
343
  layer.metadatas = [Metadata("_undefined", "This is an undefined metadata")]
330
344
 
331
- resp = self.get(test_app, "layers_wms/{}".format(layer.id))
345
+ resp = self.get(test_app, f"layers_wms/{layer.id}")
332
346
  resp.form.submit("submit", status=302)
333
347
 
334
348
  metadata = layer.metadatas[0]
@@ -117,7 +117,7 @@ class TestOAuth2Client(TestTreeGroup):
117
117
 
118
118
  oauth2_client_proto = oauth2_clients_test_data["oauth2_clients"][7]
119
119
 
120
- resp = test_app.get("/admin/oauth2_clients/{}/duplicate".format(oauth2_client_proto.id), status=200)
120
+ resp = test_app.get(f"/admin/oauth2_clients/{oauth2_client_proto.id}/duplicate", status=200)
121
121
  form = resp.form
122
122
 
123
123
  assert "" == self.get_first_field_named(form, "id").value
@@ -137,16 +137,16 @@ class TestOAuth2Client(TestTreeGroup):
137
137
  from c2cgeoportal_commons.models.static import OAuth2Client
138
138
 
139
139
  oauth2_client_id = dbsession.query(OAuth2Client.id).first().id
140
- test_app.delete("/admin/oauth2_clients/{}".format(oauth2_client_id), status=200)
140
+ test_app.delete(f"/admin/oauth2_clients/{oauth2_client_id}", status=200)
141
141
  assert dbsession.query(OAuth2Client).get(oauth2_client_id) is None
142
142
 
143
143
  def test_unicity_validator(self, oauth2_clients_test_data, test_app):
144
144
  oauth2_client_proto = oauth2_clients_test_data["oauth2_clients"][7]
145
- resp = test_app.get("/admin/oauth2_clients/{}/duplicate".format(oauth2_client_proto.id), status=200)
145
+ resp = test_app.get(f"/admin/oauth2_clients/{oauth2_client_proto.id}/duplicate", status=200)
146
146
 
147
147
  resp = resp.form.submit("submit")
148
148
 
149
- self._check_submission_problem(resp, "{} is already used.".format(oauth2_client_proto.client_id))
149
+ self._check_submission_problem(resp, f"{oauth2_client_proto.client_id} is already used.")
150
150
 
151
151
  @pytest.mark.usefixtures("raise_db_error_on_query")
152
152
  def test_grid_dberror(self, dbsession):
tests/test_ogc_servers.py CHANGED
@@ -17,8 +17,8 @@ def ogc_server_test_data(dbsession, transact):
17
17
  auth = ["No auth", "Standard auth", "Geoserver auth", "Proxy"]
18
18
  servers = []
19
19
  for i in range(0, 8):
20
- server = OGCServer(name="server_{}".format(i), description="description_{}".format(i))
21
- server.url = "https://somebasicurl_{}.com".format(i)
20
+ server = OGCServer(name=f"server_{i}", description=f"description_{i}")
21
+ server.url = f"https://somebasicurl_{i}.com"
22
22
  server.image_type = "image/jpeg" if i % 2 == 0 else "image/png"
23
23
  server.auth = auth[i % 4]
24
24
  dbsession.add(server)
@@ -81,7 +81,7 @@ class TestOGCServer(AbstractViewsTests):
81
81
 
82
82
  def test_edit(self, test_app, ogc_server_test_data):
83
83
  ogc_server = ogc_server_test_data["ogc_servers"][0]
84
- resp = test_app.get("/admin/ogc_servers/{}".format(ogc_server.id), status=200)
84
+ resp = test_app.get(f"/admin/ogc_servers/{ogc_server.id}", status=200)
85
85
  form = resp.form
86
86
  assert str(ogc_server.id) == self.get_first_field_named(form, "id").value
87
87
  assert "hidden" == self.get_first_field_named(form, "id").attrs["type"]
@@ -95,14 +95,14 @@ class TestOGCServer(AbstractViewsTests):
95
95
 
96
96
  ogc_server = ogc_server_test_data["ogc_servers"][0]
97
97
  deleted_id = ogc_server.id
98
- test_app.delete("/admin/ogc_servers/{}".format(deleted_id), status=200)
98
+ test_app.delete(f"/admin/ogc_servers/{deleted_id}", status=200)
99
99
  assert dbsession.query(OGCServer).get(deleted_id) is None
100
100
 
101
101
  def test_duplicate(self, ogc_server_test_data, test_app, dbsession):
102
102
  from c2cgeoportal_commons.models.main import OGCServer
103
103
 
104
104
  ogc_server = ogc_server_test_data["ogc_servers"][3]
105
- resp = test_app.get("/admin/ogc_servers/{}/duplicate".format(ogc_server.id), status=200)
105
+ resp = test_app.get(f"/admin/ogc_servers/{ogc_server.id}/duplicate", status=200)
106
106
  form = resp.form
107
107
  assert "" == self.get_first_field_named(form, "id").value
108
108
  self.set_first_field_named(form, "name", "clone")
@@ -115,16 +115,16 @@ class TestOGCServer(AbstractViewsTests):
115
115
 
116
116
  def test_unicity_validator(self, ogc_server_test_data, test_app):
117
117
  ogc_server = ogc_server_test_data["ogc_servers"][3]
118
- resp = test_app.get("/admin/ogc_servers/{}/duplicate".format(ogc_server.id), status=200)
118
+ resp = test_app.get(f"/admin/ogc_servers/{ogc_server.id}/duplicate", status=200)
119
119
 
120
120
  resp = resp.form.submit("submit")
121
121
 
122
- self._check_submission_problem(resp, "{} is already used.".format(ogc_server.name))
122
+ self._check_submission_problem(resp, f"{ogc_server.name} is already used.")
123
123
 
124
124
  def test_check_success(self, ogc_server_test_data, test_app):
125
125
  ogc_server = ogc_server_test_data["ogc_servers"][3]
126
126
  ogc_server.url = "config://mapserver"
127
- resp = test_app.get("/admin/ogc_servers/{}/synchronize".format(ogc_server.id), status=200)
127
+ resp = test_app.get(f"/admin/ogc_servers/{ogc_server.id}/synchronize", status=200)
128
128
 
129
129
  resp = resp.forms["form-check"].submit("submit")
130
130
 
@@ -135,7 +135,7 @@ class TestOGCServer(AbstractViewsTests):
135
135
  def test_dry_run_success(self, ogc_server_test_data, test_app):
136
136
  ogc_server = ogc_server_test_data["ogc_servers"][3]
137
137
  ogc_server.url = "config://mapserver"
138
- resp = test_app.get("/admin/ogc_servers/{}/synchronize".format(ogc_server.id), status=200)
138
+ resp = test_app.get(f"/admin/ogc_servers/{ogc_server.id}/synchronize", status=200)
139
139
 
140
140
  resp = resp.forms["form-dry-run"].submit("submit")
141
141
 
@@ -146,10 +146,21 @@ class TestOGCServer(AbstractViewsTests):
146
146
  def test_synchronize_success(self, ogc_server_test_data, test_app):
147
147
  ogc_server = ogc_server_test_data["ogc_servers"][3]
148
148
  ogc_server.url = "config://mapserver"
149
- resp = test_app.get("/admin/ogc_servers/{}/synchronize".format(ogc_server.id), status=200)
149
+ resp = test_app.get(f"/admin/ogc_servers/{ogc_server.id}/synchronize", status=200)
150
150
 
151
151
  resp = resp.forms["form-synchronize"].submit("submit")
152
152
 
153
153
  assert list(resp.html.find("div", class_="alert-success").stripped_strings) == [
154
154
  "OGC Server has been successfully synchronized."
155
155
  ]
156
+
157
+ form = resp.forms["form-synchronize"]
158
+ form["force-parents"].checked = True
159
+ form["force-ordering"].checked = True
160
+ form["clean"].checked = True
161
+
162
+ resp = form.submit("submit")
163
+
164
+ assert list(resp.html.find("div", class_="alert-success").stripped_strings) == [
165
+ "OGC Server has been successfully synchronized."
166
+ ]
@@ -25,16 +25,16 @@ def restriction_area_test_data(dbsession, transact):
25
25
  ogc_server = OGCServer(name="test_server")
26
26
  layers = []
27
27
  for i in range(0, 4):
28
- layer = LayerWMS(name="layer_{}".format(i), layer="layer_{}".format(i), public=False)
28
+ layer = LayerWMS(name=f"layer_{i}", layer=f"layer_{i}", public=False)
29
29
  layer.ogc_server = ogc_server
30
30
  layers.append(layer)
31
31
  dbsession.add_all(layers)
32
32
 
33
33
  restrictionareas = []
34
34
  for i in range(0, 4):
35
- restrictionarea = RestrictionArea(name="restrictionarea_{}".format(i))
35
+ restrictionarea = RestrictionArea(name=f"restrictionarea_{i}")
36
36
  restrictionarea.area = from_shape(box(485869.5728, 76443.1884, 837076.5648, 299941.7864), srid=21781)
37
- restrictionarea.description = "description_{}".format(i)
37
+ restrictionarea.description = f"description_{i}"
38
38
  restrictionarea.roles = [roles[i % 4], roles[(i + 2) % 4]]
39
39
  restrictionarea.layers = [layers[i % 4], layers[(i + 2) % 4]]
40
40
  dbsession.add(restrictionarea)
@@ -113,16 +113,16 @@ class TestRestrictionAreaViews(TestTreeGroup):
113
113
  assert restriction_area.name == "new_name"
114
114
  assert restriction_area.description == "new_description"
115
115
  assert restriction_area.readwrite
116
- assert set(restriction_area.roles) == set([roles[0], roles[1]])
117
- assert set(restriction_area.layers) == set([layers[0], layers[1]])
116
+ assert set(restriction_area.roles) == {roles[0], roles[1]}
117
+ assert set(restriction_area.layers) == {layers[0], layers[1]}
118
118
 
119
119
  def test_unicity_validator(self, restriction_area_test_data, test_app):
120
120
  restriction_area = restriction_area_test_data["restriction_areas"][2]
121
121
 
122
- resp = test_app.get("/admin/restriction_areas/{}/duplicate".format(restriction_area.id), status=200)
122
+ resp = test_app.get(f"/admin/restriction_areas/{restriction_area.id}/duplicate", status=200)
123
123
  resp = resp.form.submit("submit")
124
124
 
125
- self._check_submission_problem(resp, "{} is already used.".format(restriction_area.name))
125
+ self._check_submission_problem(resp, f"{restriction_area.name} is already used.")
126
126
 
127
127
  def test_edit(self, test_app, restriction_area_test_data, dbsession):
128
128
  restriction_area = restriction_area_test_data["restriction_areas"][0]
@@ -162,14 +162,14 @@ class TestRestrictionAreaViews(TestTreeGroup):
162
162
 
163
163
  dbsession.expire(restriction_area)
164
164
  assert restriction_area.description == "new_description"
165
- assert set(restriction_area.roles) == set([roles[i] for i in range(0, 3)])
165
+ assert set(restriction_area.roles) == {roles[i] for i in range(0, 3)}
166
166
 
167
167
  def test_delete(self, test_app, restriction_area_test_data, dbsession):
168
168
  from c2cgeoportal_commons.models.main import RestrictionArea
169
169
 
170
170
  restriction_area = restriction_area_test_data["restriction_areas"][0]
171
171
  deleted_id = restriction_area.id
172
- test_app.delete("/admin/restriction_areas/{}".format(deleted_id), status=200)
172
+ test_app.delete(f"/admin/restriction_areas/{deleted_id}", status=200)
173
173
  assert dbsession.query(RestrictionArea).get(deleted_id) is None
174
174
 
175
175
  def test_duplicate(self, restriction_area_test_data, test_app, dbsession):
@@ -181,9 +181,7 @@ class TestRestrictionAreaViews(TestTreeGroup):
181
181
  # Ensure restriction_area.layers is loaded with relationship "order_by"
182
182
  dbsession.expire(restriction_area)
183
183
 
184
- form = test_app.get(
185
- "/admin/restriction_areas/{}/duplicate".format(restriction_area.id), status=200
186
- ).form
184
+ form = test_app.get(f"/admin/restriction_areas/{restriction_area.id}/duplicate", status=200).form
187
185
 
188
186
  assert "" == self.get_first_field_named(form, "id").value
189
187
  self._check_roles(form, roles, restriction_area)
tests/test_role.py CHANGED
@@ -19,17 +19,18 @@ def roles_test_data(dbsession, transact):
19
19
  from c2cgeoportal_commons.models.main import Functionality, RestrictionArea, Role
20
20
  from c2cgeoportal_commons.models.static import User
21
21
 
22
+ # Note that "default_basemap" is not relevant for roles
22
23
  functionalities = {}
23
- for name in ("default_basemap", "location"):
24
+ for name in ("default_basemap", "default_theme", "print_template"):
24
25
  functionalities[name] = []
25
26
  for v in range(0, 4):
26
- functionality = Functionality(name=name, value="value_{}".format(v))
27
+ functionality = Functionality(name=name, value=f"value_{v}")
27
28
  dbsession.add(functionality)
28
29
  functionalities[name].append(functionality)
29
30
 
30
31
  restrictionareas = []
31
32
  for i in range(0, 5):
32
- restrictionarea = RestrictionArea(name="restrictionarea_{}".format(i))
33
+ restrictionarea = RestrictionArea(name=f"restrictionarea_{i}")
33
34
  dbsession.add(restrictionarea)
34
35
  restrictionareas.append(restrictionarea)
35
36
 
@@ -37,9 +38,9 @@ def roles_test_data(dbsession, transact):
37
38
  for i in range(0, 23):
38
39
  role = Role("secretary_" + str(i))
39
40
  role.functionalities = [
40
- functionalities["default_basemap"][0],
41
- functionalities["location"][0],
42
- functionalities["location"][1],
41
+ functionalities["default_theme"][0],
42
+ functionalities["print_template"][0],
43
+ functionalities["print_template"][1],
43
44
  ]
44
45
  role.restrictionareas = [restrictionareas[0], restrictionareas[1]]
45
46
  role.extent = from_shape(box(485869.5728, 76443.1884, 837076.5648, 299941.7864), srid=21781)
@@ -120,7 +121,7 @@ class TestRole(TestTreeGroup):
120
121
  ("extent", ""),
121
122
  ("__start__", "functionalities:sequence"),
122
123
  ("functionalities", str(functionalities["default_basemap"][0].id)),
123
- ("functionalities", str(functionalities["location"][1].id)),
124
+ ("functionalities", str(functionalities["print_template"][1].id)),
124
125
  ("__end__", "functionalities:sequence"),
125
126
  ("__start__", "restrictionareas:sequence"),
126
127
  ("restrictionareas", str(restrictionareas[0].id)),
@@ -146,11 +147,12 @@ class TestRole(TestTreeGroup):
146
147
 
147
148
  assert role.name == "new_name"
148
149
  assert role.description == "new_description"
149
- assert set(role.functionalities) == set(
150
- [functionalities["default_basemap"][0], functionalities["location"][1]]
151
- )
152
- assert set(role.restrictionareas) == set([restrictionareas[0], restrictionareas[1]])
153
- assert set(role.users) == set([users[0], users[1]])
150
+ assert set(role.functionalities) == {
151
+ functionalities["default_basemap"][0],
152
+ functionalities["print_template"][1],
153
+ }
154
+ assert set(role.restrictionareas) == {restrictionareas[0], restrictionareas[1]}
155
+ assert set(role.users) == {users[0], users[1]}
154
156
 
155
157
  def test_edit(self, dbsession, test_app, roles_test_data):
156
158
  role = roles_test_data["roles"][10]
@@ -174,33 +176,33 @@ class TestRole(TestTreeGroup):
174
176
  assert expected.almost_equals(shape(json.loads(form["extent"].value)), decimal=0)
175
177
 
176
178
  functionalities = roles_test_data["functionalities"]
177
- assert (
178
- set(
179
- (
180
- functionalities["default_basemap"][0].id,
181
- functionalities["location"][0].id,
182
- functionalities["location"][1].id,
183
- )
184
- )
185
- == set(f.id for f in role.functionalities)
186
- )
179
+ assert {
180
+ functionalities["default_theme"][0].id,
181
+ functionalities["print_template"][0].id,
182
+ functionalities["print_template"][1].id,
183
+ } == {f.id for f in role.functionalities}
187
184
  self.check_checkboxes(
188
185
  form,
189
186
  "functionalities",
190
187
  [
191
188
  {
192
- "label": "{}={}".format(f.name, f.value),
189
+ "label": f"{f.name}={f.value}",
193
190
  "value": str(f.id),
194
191
  "checked": f in role.functionalities,
195
192
  }
196
- for f in sum(
197
- [roles_test_data["functionalities"][name] for name in ("default_basemap", "location")], []
193
+ for f in sorted(
194
+ [
195
+ f
196
+ for f in sum(functionalities.values(), [])
197
+ if f.name in ("default_theme", "print_template")
198
+ ],
199
+ key=lambda f: (f.name, f.value),
198
200
  )
199
201
  ],
200
202
  )
201
203
 
202
204
  ras = roles_test_data["restrictionareas"]
203
- assert set((ras[0].id, ras[1].id)) == set(ra.id for ra in role.restrictionareas)
205
+ assert {ras[0].id, ras[1].id} == {ra.id for ra in role.restrictionareas}
204
206
  self.check_checkboxes(
205
207
  form,
206
208
  "restrictionareas",
@@ -237,9 +239,9 @@ class TestRole(TestTreeGroup):
237
239
  )
238
240
 
239
241
  functionality_ids = [
240
- roles_test_data["functionalities"]["default_basemap"][1].id,
241
- roles_test_data["functionalities"]["location"][1].id,
242
- roles_test_data["functionalities"]["default_basemap"][2].id,
242
+ roles_test_data["functionalities"]["default_theme"][1].id,
243
+ roles_test_data["functionalities"]["print_template"][1].id,
244
+ roles_test_data["functionalities"]["print_template"][2].id,
243
245
  ]
244
246
  form["functionalities"] = [str(id) for id in functionality_ids]
245
247
 
@@ -268,15 +270,15 @@ class TestRole(TestTreeGroup):
268
270
  )
269
271
  assert expected.almost_equals(to_shape(role.extent), decimal=0)
270
272
 
271
- assert set(functionality_ids) == set([f.id for f in role.functionalities])
272
- assert set(ra_ids) == set([f.id for f in role.restrictionareas])
273
+ assert set(functionality_ids) == {f.id for f in role.functionalities}
274
+ assert set(ra_ids) == {f.id for f in role.restrictionareas}
273
275
 
274
276
  def test_duplicate(self, roles_test_data, test_app, dbsession):
275
277
  from c2cgeoportal_commons.models.main import Role
276
278
 
277
279
  role_proto = roles_test_data["roles"][7]
278
280
 
279
- resp = test_app.get("/admin/roles/{}/duplicate".format(role_proto.id), status=200)
281
+ resp = test_app.get(f"/admin/roles/{role_proto.id}/duplicate", status=200)
280
282
  form = resp.form
281
283
 
282
284
  assert "" == self.get_first_field_named(form, "id").value
@@ -298,16 +300,16 @@ class TestRole(TestTreeGroup):
298
300
  from c2cgeoportal_commons.models.main import Role
299
301
 
300
302
  role_id = dbsession.query(Role.id).first().id
301
- test_app.delete("/admin/roles/{}".format(role_id), status=200)
303
+ test_app.delete(f"/admin/roles/{role_id}", status=200)
302
304
  assert dbsession.query(Role).get(role_id) is None
303
305
 
304
306
  def test_unicity_validator(self, roles_test_data, test_app):
305
307
  role_proto = roles_test_data["roles"][7]
306
- resp = test_app.get("/admin/roles/{}/duplicate".format(role_proto.id), status=200)
308
+ resp = test_app.get(f"/admin/roles/{role_proto.id}/duplicate", status=200)
307
309
 
308
310
  resp = resp.form.submit("submit")
309
311
 
310
- self._check_submission_problem(resp, "{} is already used.".format(role_proto.name))
312
+ self._check_submission_problem(resp, f"{role_proto.name} is already used.")
311
313
 
312
314
  @pytest.mark.usefixtures("raise_db_error_on_query")
313
315
  def test_grid_dberror(self, dbsession):