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.
- c2cgeoportal_admin/__init__.py +17 -10
- c2cgeoportal_admin/lib/lingua_extractor.py +77 -0
- c2cgeoportal_admin/lib/ogcserver_synchronizer.py +166 -54
- c2cgeoportal_admin/py.typed +0 -0
- c2cgeoportal_admin/routes.py +4 -3
- c2cgeoportal_admin/schemas/dimensions.py +12 -10
- c2cgeoportal_admin/schemas/functionalities.py +62 -21
- c2cgeoportal_admin/schemas/interfaces.py +22 -18
- c2cgeoportal_admin/schemas/metadata.py +99 -46
- c2cgeoportal_admin/schemas/restriction_areas.py +21 -19
- c2cgeoportal_admin/schemas/roles.py +7 -5
- c2cgeoportal_admin/schemas/treegroup.py +37 -16
- c2cgeoportal_admin/schemas/treeitem.py +2 -3
- c2cgeoportal_admin/static/layertree.css +3 -4
- c2cgeoportal_admin/static/navbar.css +36 -35
- c2cgeoportal_admin/static/theme.css +16 -9
- c2cgeoportal_admin/subscribers.py +3 -3
- c2cgeoportal_admin/templates/layertree.jinja2 +31 -9
- c2cgeoportal_admin/templates/navigation_navbar.jinja2 +33 -0
- c2cgeoportal_admin/templates/ogcserver_synchronize.jinja2 +12 -0
- c2cgeoportal_admin/templates/widgets/functionality_fields.pt +51 -0
- c2cgeoportal_admin/templates/widgets/metadata.pt +7 -1
- c2cgeoportal_admin/views/dimension_layers.py +7 -6
- c2cgeoportal_admin/views/functionalities.py +31 -5
- c2cgeoportal_admin/views/home.py +5 -5
- c2cgeoportal_admin/views/interfaces.py +5 -7
- c2cgeoportal_admin/views/layer_groups.py +9 -11
- c2cgeoportal_admin/views/layers.py +8 -7
- c2cgeoportal_admin/views/layers_vectortiles.py +30 -10
- c2cgeoportal_admin/views/layers_wms.py +39 -35
- c2cgeoportal_admin/views/layers_wmts.py +39 -35
- c2cgeoportal_admin/views/layertree.py +35 -27
- c2cgeoportal_admin/views/oauth2_clients.py +26 -21
- c2cgeoportal_admin/views/ogc_servers.py +57 -29
- c2cgeoportal_admin/views/restriction_areas.py +11 -10
- c2cgeoportal_admin/views/roles.py +14 -11
- c2cgeoportal_admin/views/themes.py +15 -14
- c2cgeoportal_admin/views/themes_ordering.py +13 -8
- c2cgeoportal_admin/views/treeitems.py +12 -11
- c2cgeoportal_admin/views/users.py +7 -5
- c2cgeoportal_admin/widgets.py +17 -14
- {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.7.1.156.dist-info}/METADATA +15 -12
- c2cgeoportal_admin-2.7.1.156.dist-info/RECORD +92 -0
- {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.7.1.156.dist-info}/WHEEL +1 -1
- c2cgeoportal_admin-2.7.1.156.dist-info/entry_points.txt +5 -0
- tests/__init__.py +9 -9
- tests/conftest.py +2 -1
- tests/test_edit_url.py +11 -13
- tests/test_functionalities.py +23 -10
- tests/test_interface.py +7 -7
- tests/test_layer_groups.py +13 -17
- tests/test_layers_vectortiles.py +11 -13
- tests/test_layers_wms.py +25 -36
- tests/test_layers_wmts.py +15 -19
- tests/test_layertree.py +99 -15
- tests/test_lingua_extractor_config.py +66 -0
- tests/test_main.py +3 -1
- tests/test_metadatas.py +34 -20
- tests/test_oauth2_clients.py +4 -4
- tests/test_ogc_servers.py +21 -10
- tests/test_restriction_areas.py +10 -12
- tests/test_role.py +37 -35
- tests/test_themes.py +40 -33
- tests/test_themes_ordering.py +1 -1
- tests/test_treegroup.py +2 -2
- tests/test_user.py +15 -13
- tests/themes_ordering.py +1 -1
- c2cgeoportal_admin/templates/navigation_vertical.jinja2 +0 -33
- c2cgeoportal_admin-2.6.0.dist-info/RECORD +0 -89
- c2cgeoportal_admin-2.6.0.dist-info/entry_points.txt +0 -3
- {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_{}"
|
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_{}"
|
38
|
-
for name in ("default_basemap", "
|
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_{}"
|
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 %
|
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
|
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/{
|
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/{
|
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/{
|
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
|
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
|
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": "{}={
|
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(
|
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
|
224
|
-
|
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"
|
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"
|
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"
|
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"
|
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"
|
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
|
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
|
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": "{}={
|
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(
|
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
|
-
|
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/{}"
|
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"
|
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."
|
410
|
+
self._check_submission_problem(resp, f"{theme.name} is already used.")
|
tests/test_themes_ordering.py
CHANGED
@@ -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_{}"
|
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-{}"
|
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="{}"]'
|
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_{}"
|
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_{}"
|
29
|
-
email="mail{}@valid.net"
|
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/{
|
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
|
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/{}"
|
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/{
|
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"
|
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
|
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/{
|
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"
|
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
|
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
|
-
"""
|
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
@@ -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,,
|
File without changes
|