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_themes.py CHANGED
@@ -25,21 +25,26 @@ def theme_test_data(dbsession, transact):
25
25
  )
26
26
 
27
27
  interfaces = [Interface(name) for name in ["desktop", "mobile", "edit", "routing"]]
28
+ dbsession.add_all(interfaces)
28
29
 
29
- groups = [LayerGroup(name="layer_group_{}".format(i)) for i in range(0, 5)]
30
+ groups = [LayerGroup(name=f"layer_group_{i}") for i in range(0, 5)]
31
+ dbsession.add_all(groups)
30
32
 
31
33
  layer = LayerWMS(name="layer_wms")
32
34
  layer.ogc_server = OGCServer(name="server")
33
- dbsession.add(layer)
34
35
  layers = [layer]
36
+ dbsession.add_all(layers)
35
37
 
38
+ # Note that "default_theme" is not relevant for themes
36
39
  functionalities = [
37
- Functionality(name=name, value="value_{}".format(v))
38
- for name in ("default_basemap", "location")
40
+ Functionality(name=name, value=f"value_{v}")
41
+ for name in ("default_basemap", "default_theme")
39
42
  for v in range(0, 4)
40
43
  ]
44
+ dbsession.add_all(functionalities)
41
45
 
42
46
  roles = [Role("secretary_" + str(i)) for i in range(0, 4)]
47
+ dbsession.add_all(roles)
43
48
 
44
49
  metadatas_protos = [
45
50
  ("copyable", "true"),
@@ -48,7 +53,7 @@ def theme_test_data(dbsession, transact):
48
53
  ]
49
54
  themes = []
50
55
  for i in range(0, 25):
51
- theme = Theme(name="theme_{}".format(i), ordering=1, icon="icon_{}".format(i))
56
+ theme = Theme(name=f"theme_{i}", ordering=1, icon=f"icon_{i}")
52
57
  theme.public = 1 == i % 2
53
58
  theme.interfaces = [interfaces[i % 4], interfaces[(i + 2) % 4]]
54
59
  theme.metadatas = [
@@ -57,7 +62,7 @@ def theme_test_data(dbsession, transact):
57
62
  ]
58
63
  for metadata in theme.metadatas:
59
64
  metadata.item = theme
60
- theme.functionalities = [functionalities[i % 8], functionalities[(i + 3) % 8]]
65
+ theme.functionalities = [functionalities[i % 4]]
61
66
  theme.restricted_roles = [roles[i % 4], roles[(i + 2) % 4]]
62
67
 
63
68
  dbsession.add(
@@ -117,7 +122,7 @@ class TestTheme(TestTreeGroup):
117
122
 
118
123
  assert first_theme.id == int(first_row["_id_"])
119
124
  assert first_theme.name == first_row["name"]
120
- assert "default_basemap=value_0, default_basemap=value_3" == first_row["functionalities"]
125
+ assert "default_basemap=value_0" == first_row["functionalities"]
121
126
  assert "secretary_0, secretary_2" == first_row["restricted_roles"]
122
127
  assert "desktop, edit" == first_row["interfaces"]
123
128
  assert 'copyable: true, snappingConfig: {"tolerance": 50}' == first_row["metadatas"]
@@ -146,16 +151,16 @@ class TestTheme(TestTreeGroup):
146
151
 
147
152
  def test_public_checkbox_edit(self, test_app, theme_test_data):
148
153
  theme = theme_test_data["themes"][10]
149
- form10 = test_app.get("/admin/themes/{}".format(theme.id), status=200).form
154
+ form10 = test_app.get(f"/admin/themes/{theme.id}", status=200).form
150
155
  assert not form10["public"].checked
151
156
  theme = theme_test_data["themes"][11]
152
- form11 = test_app.get("/admin/themes/{}".format(theme.id), status=200).form
157
+ form11 = test_app.get(f"/admin/themes/{theme.id}", status=200).form
153
158
  assert form11["public"].checked
154
159
 
155
160
  def test_edit(self, test_app, theme_test_data, dbsession):
156
161
  theme = theme_test_data["themes"][0]
157
162
 
158
- resp = test_app.get("/admin/themes/{}".format(theme.id), status=200)
163
+ resp = test_app.get(f"/admin/themes/{theme.id}", status=200)
159
164
  form = resp.form
160
165
 
161
166
  assert str(theme.id) == self.get_first_field_named(form, "id").value
@@ -166,21 +171,24 @@ class TestTheme(TestTreeGroup):
166
171
  assert theme.public == form["public"].checked
167
172
 
168
173
  interfaces = theme_test_data["interfaces"]
169
- assert set((interfaces[0].id, interfaces[2].id)) == set(i.id for i in theme.interfaces)
174
+ assert {interfaces[0].id, interfaces[2].id} == {i.id for i in theme.interfaces}
170
175
  self._check_interfaces(form, interfaces, theme)
171
176
 
172
177
  functionalities = theme_test_data["functionalities"]
173
- assert set((functionalities[0].id, functionalities[3].id)) == set(f.id for f in theme.functionalities)
178
+ assert {functionalities[0].id} == {f.id for f in theme.functionalities}
174
179
  self.check_checkboxes(
175
180
  form,
176
181
  "functionalities",
177
182
  [
178
183
  {
179
- "label": "{}={}".format(f.name, f.value),
184
+ "label": f"{f.name}={f.value}",
180
185
  "value": str(f.id),
181
186
  "checked": f in theme.functionalities,
182
187
  }
183
- for f in sorted(functionalities, key=lambda f: (f.name, f.value))
188
+ for f in sorted(
189
+ [f for f in functionalities if f.name in ("default_basemap")],
190
+ key=lambda f: (f.name, f.value),
191
+ )
184
192
  ],
185
193
  )
186
194
 
@@ -220,12 +228,8 @@ class TestTheme(TestTreeGroup):
220
228
  assert value == getattr(theme, key)
221
229
  else:
222
230
  assert str(value or "") == str(getattr(theme, key) or "")
223
- assert set([interfaces[1].id, interfaces[3].id]) == set(
224
- [interface.id for interface in theme.interfaces]
225
- )
226
- assert set([functionalities[2].id]) == set(
227
- [functionality.id for functionality in theme.functionalities]
228
- )
231
+ assert {interfaces[1].id, interfaces[3].id} == {interface.id for interface in theme.interfaces}
232
+ assert {functionalities[2].id} == {functionality.id for functionality in theme.functionalities}
229
233
  assert 0 == len(theme.restricted_roles)
230
234
 
231
235
  def test_post_new_with_children_invalid(self, test_app, theme_test_data):
@@ -234,7 +238,7 @@ class TestTheme(TestTreeGroup):
234
238
  """
235
239
  groups = theme_test_data["groups"]
236
240
  resp = test_app.post(
237
- "{}/new".format(self._prefix),
241
+ f"{self._prefix}/new",
238
242
  (
239
243
  ("_charset_", "UTF-8"),
240
244
  ("__formid__", "deform"),
@@ -256,7 +260,7 @@ class TestTheme(TestTreeGroup):
256
260
  def test_post_new_with_children_success(self, test_app, dbsession, theme_test_data):
257
261
  groups = theme_test_data["groups"]
258
262
  resp = test_app.post(
259
- "{}/new".format(self._prefix),
263
+ f"{self._prefix}/new",
260
264
  (
261
265
  ("_charset_", "UTF-8"),
262
266
  ("__formid__", "deform"),
@@ -304,7 +308,7 @@ class TestTheme(TestTreeGroup):
304
308
  """
305
309
  layers = theme_test_data["layers"]
306
310
  resp = test_app.post(
307
- "{}/new".format(self._prefix),
311
+ f"{self._prefix}/new",
308
312
  (
309
313
  ("_charset_", "UTF-8"),
310
314
  ("__formid__", "deform"),
@@ -324,7 +328,7 @@ class TestTheme(TestTreeGroup):
324
328
  status=200,
325
329
  )
326
330
  assert (
327
- "Value {} does not exist in table treeitem or is not allowed to avoid cycles".format(layers[0].id)
331
+ f"Value {layers[0].id} does not exist in table treeitem or is not allowed to avoid cycles"
328
332
  == resp.html.select_one(".item-children_relation + .help-block").getText().strip()
329
333
  )
330
334
 
@@ -333,7 +337,7 @@ class TestTheme(TestTreeGroup):
333
337
 
334
338
  theme = theme_test_data["themes"][1]
335
339
 
336
- resp = test_app.get("{}/{}/duplicate".format(self._prefix, theme.id), status=200)
340
+ resp = test_app.get(f"{self._prefix}/{theme.id}/duplicate", status=200)
337
341
  form = resp.form
338
342
 
339
343
  assert "" == self.get_first_field_named(form, "id").value
@@ -345,22 +349,25 @@ class TestTheme(TestTreeGroup):
345
349
  assert theme.public == form["public"].checked
346
350
 
347
351
  interfaces = theme_test_data["interfaces"]
348
- assert set((interfaces[1].id, interfaces[3].id)) == set(i.id for i in theme.interfaces)
352
+ assert {interfaces[1].id, interfaces[3].id} == {i.id for i in theme.interfaces}
349
353
 
350
354
  self._check_interfaces(form, interfaces, theme)
351
355
 
352
356
  functionalities = theme_test_data["functionalities"]
353
- assert set((functionalities[1].id, functionalities[4].id)) == set(f.id for f in theme.functionalities)
357
+ assert {functionalities[1].id} == {f.id for f in theme.functionalities}
354
358
  self.check_checkboxes(
355
359
  form,
356
360
  "functionalities",
357
361
  [
358
362
  {
359
- "label": "{}={}".format(f.name, f.value),
363
+ "label": f"{f.name}={f.value}",
360
364
  "value": str(f.id),
361
365
  "checked": f in theme.functionalities,
362
366
  }
363
- for f in sorted(functionalities, key=lambda f: (f.name, f.value))
367
+ for f in sorted(
368
+ [f for f in functionalities if f.name in ("default_basemap")],
369
+ key=lambda f: (f.name, f.value),
370
+ )
364
371
  ],
365
372
  )
366
373
 
@@ -381,7 +388,7 @@ class TestTheme(TestTreeGroup):
381
388
  duplicated = dbsession.query(Theme).filter(Theme.name == "duplicated").one()
382
389
 
383
390
  assert str(duplicated.id) == re.match(
384
- r"http://localhost{}/(.*)\?msg_col=submit_ok".format(self._prefix), resp.location
391
+ rf"http://localhost{self._prefix}/(.*)\?msg_col=submit_ok", resp.location
385
392
  ).group(1)
386
393
  assert duplicated.id != theme.id
387
394
  assert duplicated.children_relation[0].id != theme.children_relation[0].id
@@ -391,13 +398,13 @@ class TestTheme(TestTreeGroup):
391
398
  from c2cgeoportal_commons.models.main import Theme
392
399
 
393
400
  theme_id = dbsession.query(Theme.id).first().id
394
- test_app.delete("/admin/themes/{}".format(theme_id), status=200)
401
+ test_app.delete(f"/admin/themes/{theme_id}", status=200)
395
402
  assert dbsession.query(Theme).get(theme_id) is None
396
403
 
397
404
  def test_unicity_validator(self, theme_test_data, test_app):
398
405
  theme = theme_test_data["themes"][1]
399
- resp = test_app.get("{}/{}/duplicate".format(self._prefix, theme.id), status=200)
406
+ resp = test_app.get(f"{self._prefix}/{theme.id}/duplicate", status=200)
400
407
 
401
408
  resp = resp.form.submit("submit")
402
409
 
403
- self._check_submission_problem(resp, "{} is already used.".format(theme.name))
410
+ self._check_submission_problem(resp, f"{theme.name} is already used.")
@@ -14,7 +14,7 @@ def theme_test_data(dbsession, transact):
14
14
 
15
15
  themes = []
16
16
  for i in range(0, 3):
17
- theme = Theme(name="theme_{}".format(i), ordering=i, icon="icon_{}".format(i))
17
+ theme = Theme(name=f"theme_{i}", ordering=i, icon=f"icon_{i}")
18
18
 
19
19
  dbsession.add(theme)
20
20
  themes.append(theme)
tests/test_treegroup.py CHANGED
@@ -5,10 +5,10 @@ from . import AbstractViewsTests
5
5
 
6
6
  class TestTreeGroup(AbstractViewsTests):
7
7
  def check_children(self, form, group, expected):
8
- form_group = form.html.select_one(".item-{}".format(group))
8
+ form_group = form.html.select_one(f".item-{group}")
9
9
  items = form_group.select(".deform-seq-item")
10
10
  assert len(expected) == len(items)
11
11
  for item, exp in zip(items, expected):
12
12
  assert exp["label"] == item.select_one(".well").getText().strip()
13
13
  for key, value in exp["values"].items():
14
- assert value == item.select_one('input[name="{}"]'.format(key))["value"]
14
+ assert value == item.select_one(f'input[name="{key}"]')["value"]
tests/test_user.py CHANGED
@@ -20,13 +20,13 @@ def users_test_data(dbsession, transact):
20
20
 
21
21
  roles = []
22
22
  for i in range(0, 4):
23
- roles.append(Role("secretary_{}".format(i)))
23
+ roles.append(Role(f"secretary_{i}"))
24
24
  dbsession.add(roles[i])
25
25
  users = []
26
26
  for i in range(0, 23):
27
27
  user = User(
28
- "babar_{}".format(i),
29
- email="mail{}@valid.net".format(i),
28
+ f"babar_{i}",
29
+ email=f"mail{i}@valid.net",
30
30
  settings_role=roles[i % 4],
31
31
  roles=[roles[i % 4]],
32
32
  )
@@ -93,7 +93,7 @@ class TestUser(AbstractViewsTests):
93
93
  user = users_test_data["users"][9]
94
94
  roles = users_test_data["roles"]
95
95
 
96
- resp = test_app.get("/admin/users/{}".format(user.id), status=200)
96
+ resp = test_app.get(f"/admin/users/{user.id}", status=200)
97
97
 
98
98
  assert resp.form["username"].value == user.username
99
99
  assert resp.form["email"].value == user.email
@@ -120,14 +120,14 @@ class TestUser(AbstractViewsTests):
120
120
  assert value == getattr(user, key)
121
121
  else:
122
122
  assert str(value or "") == str(getattr(user, key) or "")
123
- assert set([roles[2].id, roles[3].id]) == set([role.id for role in user.roles])
123
+ assert {roles[2].id, roles[3].id} == {role.id for role in user.roles}
124
124
 
125
125
  def test_delete(self, test_app, users_test_data, dbsession):
126
126
  from c2cgeoportal_commons.models.static import User, user_role
127
127
 
128
128
  user = users_test_data["users"][9]
129
129
  deleted_id = user.id
130
- test_app.delete("/admin/users/{}".format(deleted_id), status=200)
130
+ test_app.delete(f"/admin/users/{deleted_id}", status=200)
131
131
  assert dbsession.query(User).get(deleted_id) is None
132
132
  assert dbsession.query(user_role).filter(user_role.c.user_id == user.id).count() == 0
133
133
 
@@ -138,7 +138,7 @@ class TestUser(AbstractViewsTests):
138
138
  roles = users_test_data["roles"]
139
139
 
140
140
  resp = test_app.post(
141
- "/admin/users/{}".format(user.id),
141
+ f"/admin/users/{user.id}",
142
142
  (
143
143
  ("__formid__", "deform"),
144
144
  ("_charset_", "UTF-8"),
@@ -155,13 +155,13 @@ class TestUser(AbstractViewsTests):
155
155
  ),
156
156
  status=302,
157
157
  )
158
- assert resp.location == "http://localhost/admin/users/{}?msg_col=submit_ok".format(user.id)
158
+ assert resp.location == f"http://localhost/admin/users/{user.id}?msg_col=submit_ok"
159
159
 
160
160
  dbsession.expire(user)
161
161
  assert user.username == "new_name_withéàô"
162
162
  assert user.email == "new_mail@valid.net"
163
163
  assert user.settings_role.name == "secretary_2"
164
- assert set(r.id for r in user.roles) == set(roles[i].id for i in [0, 3])
164
+ assert {r.id for r in user.roles} == {roles[i].id for i in [0, 3]}
165
165
  assert user.validate_password("pré$ident")
166
166
 
167
167
  assert not pw_gen_mock.called, "method should not have been called"
@@ -172,7 +172,7 @@ class TestUser(AbstractViewsTests):
172
172
  roles = users_test_data["roles"]
173
173
 
174
174
  resp = test_app.post(
175
- "/admin/users/{}".format(user.id),
175
+ f"/admin/users/{user.id}",
176
176
  {
177
177
  "__formid__": "deform",
178
178
  "_charset_": "UTF-8",
@@ -199,7 +199,7 @@ class TestUser(AbstractViewsTests):
199
199
  user = users_test_data["users"][7]
200
200
  roles = users_test_data["roles"]
201
201
 
202
- resp = test_app.get("/admin/users/{}/duplicate".format(user.id), status=200)
202
+ resp = test_app.get(f"/admin/users/{user.id}/duplicate", status=200)
203
203
  form = resp.form
204
204
 
205
205
  assert "" == form["id"].value
@@ -219,7 +219,7 @@ class TestUser(AbstractViewsTests):
219
219
  ).group(1)
220
220
  assert user.id != new_user.id
221
221
  assert user.settings_role_id == new_user.settings_role_id
222
- assert set([role.id for role in user.roles]) == set([role.id for role in new_user.roles])
222
+ assert {role.id for role in user.roles} == {role.id for role in new_user.roles}
223
223
  assert not new_user.is_password_changed
224
224
  assert not new_user.validate_password("pré$ident")
225
225
 
@@ -304,7 +304,9 @@ class TestUser(AbstractViewsTests):
304
304
  assert info.status_int == 500, "Expected 500 status when db error"
305
305
 
306
306
  def test_grid_settings_role_none(self, dbsession, test_app):
307
- """Grid view must work even if a user's settings_role is None"""
307
+ """
308
+ Grid view must work even if a user's settings_role is None.
309
+ """
308
310
  from c2cgeoportal_commons.models.static import User
309
311
 
310
312
  dbsession.add(User("test", email="test@valid.net"))
tests/themes_ordering.py CHANGED
@@ -14,7 +14,7 @@ def themes_ordering_test_data(dbsession, transact):
14
14
 
15
15
  themes = []
16
16
  for i in range(0, 25):
17
- theme = Theme(name="theme_{}".format(i), ordering=100)
17
+ theme = Theme(name=f"theme_{i}", ordering=100)
18
18
  dbsession.add(theme)
19
19
  themes.append(theme)
20
20
 
@@ -1,33 +0,0 @@
1
- {#
2
- # The MIT License (MIT)
3
- #
4
- # Copyright (c) Camptocamp SA
5
- #
6
- # Permission is hereby granted, free of charge, to any person obtaining a copy of
7
- # this software and associated documentation files (the "Software"), to deal in
8
- # the Software without restriction, including without limitation the rights to
9
- # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
10
- # the Software, and to permit persons to whom the Software is furnished to do so,
11
- # subject to the following conditions:
12
- #
13
- # The above copyright notice and this permission notice shall be included in all
14
- # copies or substantial portions of the Software.
15
- #
16
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
18
- # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
19
- # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
20
- # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
- # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
- #}
23
-
24
- <ul id="main-menu" class="nav nav-pills nav-stacked">
25
- <li role="presentation" class="{{'active' if request.matched_route.name == 'layertree' else ''}}">
26
- <a href="{{request.route_url('layertree')}}">{{_("Layer tree")}}</a>
27
- </li>
28
- {% for table in tables %}
29
- <li role="presentation" class="{{'active' if request.matchdict and request.matchdict.get('table') == table['key'] else ''}}">
30
- <a href="{{request.route_url('c2cgeoform_index', table=table['key'])}}">{{table['plural']}}</a>
31
- </li>
32
- {% endfor %}
33
- </ul>
@@ -1,89 +0,0 @@
1
- c2cgeoportal_admin/__init__.py,sha256=8rMRUDG1AT8jV6PgIE8T1AZF0-3yt0ffd7SuKRl8_FM,4677
2
- c2cgeoportal_admin/routes.py,sha256=wCZstX9oqUQDN9ztnitCgaM5Q38q9CYpOnSgVE_5nHI,4592
3
- c2cgeoportal_admin/subscribers.py,sha256=NKvpObGpgVqmTTU7q-A_EsPMEaA6eyKfa6kezlR11H4,2362
4
- c2cgeoportal_admin/widgets.py,sha256=oi88Ot2swpnlLOFpdQ014KBrkaynq_nRbqtm7r7xJWA,6043
5
- c2cgeoportal_admin/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- c2cgeoportal_admin/lib/ogcserver_synchronizer.py,sha256=KBJPQCSt8b67_u2rhRGr8AsbfcxaCTaRaCkWKPW5ufg,10962
7
- c2cgeoportal_admin/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- c2cgeoportal_admin/schemas/dimensions.py,sha256=U9-JvFZhCbrQp7Y0WaghJF6tBvXPoSbPBbHIRjCd6hM,2070
9
- c2cgeoportal_admin/schemas/functionalities.py,sha256=K8O5Fkave5XiT2tGwi8emLzOPRUdZhSvachiZ93c3Js,2476
10
- c2cgeoportal_admin/schemas/interfaces.py,sha256=r-EaDPMrrGoJopzqqLqZbYU1uVU4ezwMvoyt-FnBAm0,2277
11
- c2cgeoportal_admin/schemas/metadata.py,sha256=ihKGWiaT5ZT98sqTKySitlDWXYEUEkfwpFt_Xcwf8lE,6537
12
- c2cgeoportal_admin/schemas/restriction_areas.py,sha256=SX5KBXTg8w-JFscGZrfiiJRJmJ6eIzONnhInBF6yHcc,2343
13
- c2cgeoportal_admin/schemas/roles.py,sha256=Ye_b5pyB5-xtPMO1IYO64JuLmr5EKHb2BjhFbS6fJaE,2253
14
- c2cgeoportal_admin/schemas/treegroup.py,sha256=x9zB3JW86tt2tXNRlqk4Ac811uTkMdhbGvA82vHVxww,6274
15
- c2cgeoportal_admin/schemas/treeitem.py,sha256=P0qZZrxbAPo878p36-yyQ0k_slxuml2ij8Ev9GeWUJE,2094
16
- c2cgeoportal_admin/static/layertree.css,sha256=QwAOIswiqDx0u6Nnu1SD2L9Mcdj58hM6uQy-KxnLXCk,3178
17
- c2cgeoportal_admin/static/navbar.css,sha256=ibw_qIqf2KtBy1u48t4v1qFJcBsTBlUX1582nEjo3Sw,2383
18
- c2cgeoportal_admin/static/theme.css,sha256=GSAn136wI5FslMJf3N9D3OA2e-85GmlHmWjlxQ_UiKo,1888
19
- c2cgeoportal_admin/templates/404.jinja2,sha256=F05OZUzJljcieoCFMP7Oz1F6Jb-VZ06hTOSc9mrb87g,1420
20
- c2cgeoportal_admin/templates/edit.jinja2,sha256=rkBQiz0JZdL7VDq8XrhRLTv6JaiFt_QB8CwP3NMHWQY,1302
21
- c2cgeoportal_admin/templates/home.jinja2,sha256=WDQwmBGMZxsiOLw9YeYPLuca_mjjntjrTh529euzd1o,1516
22
- c2cgeoportal_admin/templates/index.jinja2,sha256=HPgilbqh5dv-yc_T_bc1hV2DEtV2wD617_aAERC2VSk,2005
23
- c2cgeoportal_admin/templates/layertree.jinja2,sha256=WE1Omy_zL29JsoOzWMk-Q-1JTkNatBtaFtDIAY_R-3E,9027
24
- c2cgeoportal_admin/templates/layout.jinja2,sha256=KCDwATUYBu-ZXv7ijo0S0PlTmKtU-JxW8gMhvPA_kAE,4105
25
- c2cgeoportal_admin/templates/navigation_navbar.jinja2,sha256=7H2QbvQqyUB76dicBR9wCQKdoYV8-J0cr4Yg8WXg9M4,3101
26
- c2cgeoportal_admin/templates/navigation_vertical.jinja2,sha256=-sktZjkK3MbtVYNihx2UNmjOAYS1V1ur1NlJcfoZsDk,1660
27
- c2cgeoportal_admin/templates/ogcserver_synchronize.jinja2,sha256=XA28459fEr_REXoWlxa9aUaRbsVSbdr05LuknoeZm08,3567
28
- c2cgeoportal_admin/templates/widgets/child.pt,sha256=JjxI0oVADhS3SoFgg0iN8P4ca1I_UGr7fWRp3wpZXsE,2159
29
- c2cgeoportal_admin/templates/widgets/children.pt,sha256=0TPpatvmZcU2TxbcZMjDz8VQcLGtoHkuDJ-eAGvjXho,6625
30
- c2cgeoportal_admin/templates/widgets/dimension.pt,sha256=1BXmE7s9JpzaJSHAQEtZk0DHB11pQ4FNQPaG_4c8CYo,2627
31
- c2cgeoportal_admin/templates/widgets/dimensions.pt,sha256=LjWjsgdcFYZxpB_30-3NOfvq5KYkKTu49F-P-r9d5Jg,1211
32
- c2cgeoportal_admin/templates/widgets/layer_fields.pt,sha256=RJBYt8ji6YQp9ZaNZJD-caLgy856a6rzlKSMnuZWphw,3223
33
- c2cgeoportal_admin/templates/widgets/layer_group_fields.pt,sha256=xnqIqFjPPan81OqLwKeDnvNtlhEvYss6h2J9txH5neE,2459
34
- c2cgeoportal_admin/templates/widgets/layer_v1_fields.pt,sha256=w-MujUevHWmnOkOTbbvES6alDoL_UO1eiMj8SCxcQEY,3956
35
- c2cgeoportal_admin/templates/widgets/metadata.pt,sha256=YKgOJSnGidbwug5umzhBQ4eHPDbdzNR3DH7M15m3IKg,3538
36
- c2cgeoportal_admin/templates/widgets/metadatas.pt,sha256=ErgAH0DA94MO7gqEJ2iZdQ9LRptP2YKH78yze-jdl2Q,1476
37
- c2cgeoportal_admin/templates/widgets/ogcserver_fields.pt,sha256=x0bDmgrnj9SA6RCVpg3k2lTkkXPkuBFPKMScDgDeyGU,1724
38
- c2cgeoportal_admin/templates/widgets/restriction_area_fields.pt,sha256=pZVE0KcitAF7HXc3ZlniLr0QwSD05TOhlgieLUR1i7Q,1731
39
- c2cgeoportal_admin/templates/widgets/role_fields.pt,sha256=gVd9eRYaqw8fGmZauqEUS_Igmyxaa71qcmdC1KUx5nY,2623
40
- c2cgeoportal_admin/templates/widgets/theme_fields.pt,sha256=68G1Ya8-Dc6pCeP-taQ0ofCIpnY_v0rouazkFhfQflU,3083
41
- c2cgeoportal_admin/templates/widgets/user_fields.pt,sha256=twmajhUYL1xa47Eu-iATKifNPA5lu3SGpqdKajH6gL8,1753
42
- c2cgeoportal_admin/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- c2cgeoportal_admin/views/dimension_layers.py,sha256=brEA1L7RXABKQLoScK5S2tjWn7jm9xRHgzAj3BjmgHw,2465
44
- c2cgeoportal_admin/views/functionalities.py,sha256=SfMoEShBTOFj_20V3JHVDToOMrmHoLWd4K87Yf_TDgM,3144
45
- c2cgeoportal_admin/views/home.py,sha256=_WJgyna095opx_b9PuchjeVEztj3tFWCx5Low3RVK-s,1804
46
- c2cgeoportal_admin/views/interfaces.py,sha256=EEcwNqzk9ZNJ5o7Fcbdf62iMkyjBQSv04y7SQT-XvtA,3468
47
- c2cgeoportal_admin/views/layer_groups.py,sha256=OBM48lbCDfeI772k3ypukGEbhIwzt5hW4REr-Bs78Zw,3826
48
- c2cgeoportal_admin/views/layers.py,sha256=OhEITd5AWEYCztGmrK_PP59CeTOcgRp2AE3g_ghdG6U,2897
49
- c2cgeoportal_admin/views/layers_vectortiles.py,sha256=gOAwB7j2esEKuDvZtNQEVy8SCAfICNvXWMcx61x4qiE,4103
50
- c2cgeoportal_admin/views/layers_wms.py,sha256=V7PHrimLs_l5iS7zhxDFRfhWSRFBsohtWpE_OM7gkPs,7314
51
- c2cgeoportal_admin/views/layers_wmts.py,sha256=xvhxifKtyixmswwSUj8mSWBnWMdFc1Rpmexh0apzEXs,7084
52
- c2cgeoportal_admin/views/layertree.py,sha256=0sxWBWljqCWKM1rEZek1a6K7gRWVIXXfWn-sr5UVqBA,7954
53
- c2cgeoportal_admin/views/oauth2_clients.py,sha256=j6kPtxU7vpeJ8Hx58twCLBV-jkVl3_gsxEx6tOLEkms,3342
54
- c2cgeoportal_admin/views/ogc_servers.py,sha256=zy7dE8DLl811d4hdOFopknD8xhkEKGJwIeOhlUBSlTM,6178
55
- c2cgeoportal_admin/views/restriction_areas.py,sha256=ozR86-lo3DXBSr_CPn9-AxpDhZWscXUvqKsqIHovSKk,5369
56
- c2cgeoportal_admin/views/roles.py,sha256=wSBtpX8CuPhI5L9UHS1rxck8-r3mlFz5oGUiIaPU1EA,5578
57
- c2cgeoportal_admin/views/themes.py,sha256=q7dnR-SzsvnXbH5pHrvpYeF2FuazBLZsmvWTnjxPx88,5502
58
- c2cgeoportal_admin/views/themes_ordering.py,sha256=eRR81U6ocvmnUtwtdBR20ir525g2FSIEDNaC5DAY-NY,5405
59
- c2cgeoportal_admin/views/treeitems.py,sha256=GRGHu1ixeALE2PoLw1xOAHkJbICtS6xozKqn8pSXg6U,3787
60
- c2cgeoportal_admin/views/users.py,sha256=bA4Ym5xmNIBgqNBk2H5bWHhdR4saYN2Ee_k1unzgrlQ,5193
61
- tests/__init__.py,sha256=ro7p4MDwv2b8wIQ3jDKErfrDahzvQBYKlKXhixxzvfI,9599
62
- tests/conftest.py,sha256=ahIRbwn9t6Nmb-4ZE-slO2dOQDQbPX9RYrLOn2qGzGw,2065
63
- tests/test_edit_url.py,sha256=u-0HNUgMu0CVtYbdgixSyqy961Ii2Yh2At07LSObgPI,4654
64
- tests/test_functionalities.py,sha256=ZgGeRP0eNLAxhgfT6Wj3zxtnClKuNqEGGl8oMVs9tZ4,3857
65
- tests/test_home.py,sha256=oA4i-V9jJQQgHD9Gz79mgIEMUCRw3tmIQVqdhM9Q2Fo,426
66
- tests/test_interface.py,sha256=VzMlV6k73V0mKIP8RFcrDe7TS8OOonUXhey_Z5hQC3Q,4768
67
- tests/test_layer_groups.py,sha256=7PWhPegITgdsy7c8blyw3QRAUOXfecKgA2IaVXaxPpg,11441
68
- tests/test_layers_vectortiles.py,sha256=lYd27gKbQBewYmdK128M8c9SbruBupfx0-OpBlMYF3Q,9509
69
- tests/test_layers_wms.py,sha256=5x5i1EUTyCu_LRt9uTkYHPrnQuBozS8xk6_e02qmDjA,18503
70
- tests/test_layers_wmts.py,sha256=UF1xVSjF-ETN8JMRtwvGZwWAfqUk66hZOcJvKlXNvik,11355
71
- tests/test_layertree.py,sha256=5HWTY_R_eSfN3C2JOVv0zA9r6PxlK05MnhPFobLkz_U,8336
72
- tests/test_learn.py,sha256=gQwe-Bim0eihZH0rbBWDn6_rIBxvQD_lyu9MlOljupM,2307
73
- tests/test_left_menu.py,sha256=-K_429ZcW5Hsz317StIRVz8VtU7GDMH7UCTzZDfckUo,920
74
- tests/test_main.py,sha256=r2CibHqXh4MoX7bjwRr1pXPAfhCGK7Jbmfu7XmMm_gQ,354
75
- tests/test_metadatas.py,sha256=fFbOx8wd_e4fZ0XTbt8uDD9Rkrialrj4pWXnCc61Jl8,11637
76
- tests/test_oauth2_clients.py,sha256=-Ib4npWgWzbc8PcufPEEklwsb9DdNMqsV02eEfva2nc,5814
77
- tests/test_ogc_servers.py,sha256=grjAruIQG7PMvsJdu_OQZlk4hrBEWHFJ-R960PL08Go,6150
78
- tests/test_restriction_areas.py,sha256=iVWz_dhQ-jjIoW4ZhZlP9mNVy5vW--wUqMuJ4efuEWA,8026
79
- tests/test_role.py,sha256=absegjdV2cK6l9urH15iOf-dj_KLqglJvyyyfHVpD5U,11730
80
- tests/test_themes.py,sha256=cHbAKuDATv5cR3Y0kqaSfGCzcH9114mv3lwI_9uDmKg,15119
81
- tests/test_themes_ordering.py,sha256=AqJ8HOfL6__QnZIjl7RqsQLbH352iR8pokNshctQOeQ,2260
82
- tests/test_treegroup.py,sha256=CBM77NxjWygcikjgci20R4MEnnwQLpFI9AExM83s118,592
83
- tests/test_user.py,sha256=-m1t50cazeTWDRQtLogFDP2iwJ14cko6bWkovFOpol4,11738
84
- tests/themes_ordering.py,sha256=b6PpQQbbB9RqKKiBl5iF7T3tQGgvJ18LGTJCbP31FVQ,1351
85
- c2cgeoportal_admin-2.6.0.dist-info/METADATA,sha256=iNHLMRs8cbvEDbPmQw9M7LOMaZOmB_OWchUNNQ95kkw,1276
86
- c2cgeoportal_admin-2.6.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
87
- c2cgeoportal_admin-2.6.0.dist-info/entry_points.txt,sha256=CroEMatntjAOxN-0qHPOOjVrtmBg_WxpUcUmvRtUJZA,52
88
- c2cgeoportal_admin-2.6.0.dist-info/top_level.txt,sha256=DgcTJgTvpJUB8HqwYB14PdLBPAOAFk0B8oqnSTFoAU4,25
89
- c2cgeoportal_admin-2.6.0.dist-info/RECORD,,
@@ -1,3 +0,0 @@
1
- [paste.app_factory]
2
- main = c2cgeoportal_admin:main
3
-