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.
- c2cgeoportal_admin/__init__.py +32 -10
- c2cgeoportal_admin/lib/lingua_extractor.py +77 -0
- c2cgeoportal_admin/lib/ogcserver_synchronizer.py +168 -56
- c2cgeoportal_admin/py.typed +0 -0
- c2cgeoportal_admin/routes.py +7 -4
- 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 +100 -47
- c2cgeoportal_admin/schemas/restriction_areas.py +21 -19
- c2cgeoportal_admin/schemas/roles.py +7 -5
- c2cgeoportal_admin/schemas/treegroup.py +38 -17
- 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/404.jinja2 +18 -2
- 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/__init__.py +29 -0
- c2cgeoportal_admin/views/dimension_layers.py +7 -6
- c2cgeoportal_admin/views/functionalities.py +33 -6
- c2cgeoportal_admin/views/home.py +5 -5
- c2cgeoportal_admin/views/interfaces.py +7 -8
- 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 +41 -35
- c2cgeoportal_admin/views/layers_wmts.py +41 -35
- c2cgeoportal_admin/views/layertree.py +36 -28
- c2cgeoportal_admin/views/logged_views.py +80 -0
- c2cgeoportal_admin/views/logs.py +90 -0
- c2cgeoportal_admin/views/oauth2_clients.py +30 -22
- c2cgeoportal_admin/views/ogc_servers.py +119 -37
- c2cgeoportal_admin/views/restriction_areas.py +13 -11
- c2cgeoportal_admin/views/roles.py +16 -12
- c2cgeoportal_admin/views/themes.py +15 -14
- c2cgeoportal_admin/views/themes_ordering.py +13 -8
- c2cgeoportal_admin/views/treeitems.py +14 -12
- c2cgeoportal_admin/views/users.py +12 -7
- c2cgeoportal_admin/widgets.py +17 -14
- {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.8.1.180.dist-info}/METADATA +17 -8
- c2cgeoportal_admin-2.8.1.180.dist-info/RECORD +95 -0
- {c2cgeoportal_admin-2.6.0.dist-info → c2cgeoportal_admin-2.8.1.180.dist-info}/WHEEL +1 -1
- c2cgeoportal_admin-2.8.1.180.dist-info/entry_points.txt +6 -0
- tests/__init__.py +11 -12
- tests/conftest.py +2 -1
- tests/test_edit_url.py +11 -14
- tests/test_functionalities.py +52 -14
- tests/test_home.py +0 -1
- tests/test_interface.py +34 -11
- tests/test_layer_groups.py +57 -27
- tests/test_layers_vectortiles.py +43 -20
- tests/test_layers_wms.py +67 -45
- tests/test_layers_wmts.py +47 -26
- tests/test_layertree.py +99 -16
- tests/test_left_menu.py +0 -1
- tests/test_lingua_extractor_config.py +64 -0
- tests/test_logs.py +103 -0
- tests/test_main.py +3 -1
- tests/test_metadatas.py +34 -21
- tests/test_oauth2_clients.py +37 -9
- tests/test_ogc_servers.py +84 -35
- tests/test_restriction_areas.py +38 -15
- tests/test_role.py +68 -41
- tests/test_themes.py +71 -37
- tests/test_themes_ordering.py +1 -2
- tests/test_treegroup.py +2 -2
- tests/test_user.py +48 -17
- tests/themes_ordering.py +1 -2
- 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.8.1.180.dist-info}/top_level.txt +0 -0
tests/test_functionalities.py
CHANGED
@@ -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(
|
20
|
-
|
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, "
|
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
|
-
|
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/{
|
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/{}"
|
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
|
-
|
117
|
+
|
118
|
+
resp = test_app.get(f"/admin/functionalities/{functionality.id}/duplicate", status=200)
|
119
|
+
|
90
120
|
form = resp.form
|
91
|
-
assert "" ==
|
92
|
-
|
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 =
|
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
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_{}"
|
19
|
+
theme = Theme(name=f"theme_{i}", ordering=1)
|
20
20
|
themes.append(theme)
|
21
21
|
|
22
|
-
servers = [OGCServer(name="server_{}"
|
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_{}"
|
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_{}"
|
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/{
|
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/{
|
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"
|
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"
|
tests/test_layer_groups.py
CHANGED
@@ -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_{
|
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"
|
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"
|
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
|
-
"""
|
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
|
-
"{}/{
|
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"
|
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"
|
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
|
-
|
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"
|
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."
|
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
|
296
|
+
from c2cgeoportal_commons.models.main import (
|
297
|
+
LayerGroup,
|
298
|
+
LayergroupTreeitem,
|
299
|
+
Log,
|
300
|
+
LogAction,
|
301
|
+
TreeGroup,
|
302
|
+
TreeItem,
|
303
|
+
)
|
282
304
|
|
283
|
-
|
305
|
+
group = layer_groups_test_data["groups"][9]
|
284
306
|
|
285
307
|
assert (
|
286
308
|
3
|
287
|
-
== dbsession.query(LayergroupTreeitem).filter(LayergroupTreeitem.treegroup_id ==
|
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 ==
|
314
|
+
== dbsession.query(LayergroupTreeitem).filter(LayergroupTreeitem.treeitem_id == group.id).count()
|
293
315
|
)
|
294
316
|
|
295
|
-
test_app.delete("/admin/layer_groups/{}"
|
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(
|
300
|
-
assert dbsession.query(TreeGroup).get(
|
301
|
-
assert dbsession.query(TreeItem).get(
|
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 ==
|
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 ==
|
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"
|
tests/test_layers_vectortiles.py
CHANGED
@@ -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_{}"
|
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_{}"
|
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_{}"
|
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
|
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
|
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
|
-
|
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
|
159
|
-
|
160
|
-
|
161
|
-
|
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"
|
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
|
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
|
-
|
236
|
+
test_app.delete(f"/admin/layers_vectortiles/{layer.id}", status=200)
|
220
237
|
|
221
|
-
|
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
|
-
|
224
|
-
assert
|
225
|
-
assert
|
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"
|