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
@@ -1,6 +1,4 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
# Copyright (c) 2017-2020, Camptocamp SA
|
1
|
+
# Copyright (c) 2017-2021, Camptocamp SA
|
4
2
|
# All rights reserved.
|
5
3
|
|
6
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -29,32 +27,39 @@
|
|
29
27
|
|
30
28
|
|
31
29
|
from functools import partial
|
30
|
+
from typing import Optional
|
32
31
|
|
32
|
+
import sqlalchemy
|
33
33
|
from c2cgeoform.schema import GeoFormSchemaNode
|
34
34
|
from c2cgeoform.views.abstract_views import ListField
|
35
35
|
from deform.widget import FormWidget
|
36
|
+
from pyramid.httpexceptions import HTTPNotFound
|
36
37
|
from pyramid.view import view_config, view_defaults
|
37
38
|
|
39
|
+
from c2cgeoportal_admin import _
|
38
40
|
from c2cgeoportal_admin.schemas.interfaces import interfaces_schema_node
|
39
|
-
from c2cgeoportal_admin.schemas.metadata import
|
41
|
+
from c2cgeoportal_admin.schemas.metadata import metadata_schema_node
|
40
42
|
from c2cgeoportal_admin.schemas.restriction_areas import restrictionareas_schema_node
|
41
43
|
from c2cgeoportal_admin.schemas.treeitem import parent_id_node
|
42
44
|
from c2cgeoportal_admin.views.dimension_layers import DimensionLayerViews
|
45
|
+
from c2cgeoportal_commons.lib.literal import Literal
|
43
46
|
from c2cgeoportal_commons.models.main import LayerGroup, LayerVectorTiles
|
44
47
|
|
45
48
|
_list_field = partial(ListField, LayerVectorTiles)
|
46
49
|
|
47
50
|
|
48
51
|
base_schema = GeoFormSchemaNode(LayerVectorTiles, widget=FormWidget(fields_template="layer_fields"))
|
49
|
-
base_schema.add(
|
50
|
-
base_schema.add(interfaces_schema_node.
|
51
|
-
base_schema.add(restrictionareas_schema_node.
|
52
|
+
base_schema.add(metadata_schema_node(LayerVectorTiles.metadatas, LayerVectorTiles))
|
53
|
+
base_schema.add(interfaces_schema_node(LayerVectorTiles.interfaces))
|
54
|
+
base_schema.add(restrictionareas_schema_node(LayerVectorTiles.restrictionareas))
|
52
55
|
base_schema.add_unique_validator(LayerVectorTiles.name, LayerVectorTiles.id)
|
53
|
-
base_schema.add(parent_id_node(LayerGroup))
|
56
|
+
base_schema.add(parent_id_node(LayerGroup)) # type: ignore
|
54
57
|
|
55
58
|
|
56
59
|
@view_defaults(match_param="table=layers_vectortiles")
|
57
60
|
class LayerVectorTilesViews(DimensionLayerViews):
|
61
|
+
"""The vector tiles administration view."""
|
62
|
+
|
58
63
|
_list_fields = (
|
59
64
|
DimensionLayerViews._list_fields
|
60
65
|
+ [_list_field("style"), _list_field("xyz")]
|
@@ -64,7 +69,7 @@ class LayerVectorTilesViews(DimensionLayerViews):
|
|
64
69
|
_model = LayerVectorTiles
|
65
70
|
_base_schema = base_schema
|
66
71
|
|
67
|
-
def _base_query(self, query=None):
|
72
|
+
def _base_query(self, query: Optional[sqlalchemy.orm.query.Query] = None) -> sqlalchemy.orm.query.Query:
|
68
73
|
del query
|
69
74
|
return super()._base_query(self._request.dbsession.query(LayerVectorTiles).distinct())
|
70
75
|
|
@@ -76,9 +81,24 @@ class LayerVectorTilesViews(DimensionLayerViews):
|
|
76
81
|
def grid(self):
|
77
82
|
return super().grid()
|
78
83
|
|
84
|
+
def schema(self) -> GeoFormSchemaNode:
|
85
|
+
try:
|
86
|
+
obj = self._get_object()
|
87
|
+
except HTTPNotFound:
|
88
|
+
obj = None
|
89
|
+
|
90
|
+
schema = self._base_schema.clone()
|
91
|
+
schema["style"].description = Literal(
|
92
|
+
_("{}<br>Current runtime value is: {}").format(
|
93
|
+
schema["style"].description,
|
94
|
+
obj.style_description(self._request),
|
95
|
+
)
|
96
|
+
)
|
97
|
+
return schema
|
98
|
+
|
79
99
|
@view_config(route_name="c2cgeoform_item", request_method="GET", renderer="../templates/edit.jinja2")
|
80
100
|
def view(self):
|
81
|
-
return super().edit()
|
101
|
+
return super().edit(self.schema())
|
82
102
|
|
83
103
|
@view_config(route_name="c2cgeoform_item", request_method="POST", renderer="../templates/edit.jinja2")
|
84
104
|
def save(self):
|
@@ -1,6 +1,4 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
# Copyright (c) 2017-2020, Camptocamp SA
|
1
|
+
# Copyright (c) 2017-2021, Camptocamp SA
|
4
2
|
# All rights reserved.
|
5
3
|
|
6
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -27,11 +25,11 @@
|
|
27
25
|
# of the authors and should not be interpreted as representing official policies,
|
28
26
|
# either expressed or implied, of the FreeBSD Project.
|
29
27
|
|
30
|
-
# pylint: disable=no-member
|
31
|
-
|
32
28
|
|
33
29
|
from functools import partial
|
30
|
+
from typing import Any, Dict, List, Optional
|
34
31
|
|
32
|
+
import sqlalchemy
|
35
33
|
from c2cgeoform.schema import GeoFormSchemaNode
|
36
34
|
from c2cgeoform.views.abstract_views import ItemAction, ListField
|
37
35
|
from deform.widget import FormWidget
|
@@ -42,7 +40,7 @@ from zope.sqlalchemy import mark_changed
|
|
42
40
|
from c2cgeoportal_admin import _
|
43
41
|
from c2cgeoportal_admin.schemas.dimensions import dimensions_schema_node
|
44
42
|
from c2cgeoportal_admin.schemas.interfaces import interfaces_schema_node
|
45
|
-
from c2cgeoportal_admin.schemas.metadata import
|
43
|
+
from c2cgeoportal_admin.schemas.metadata import metadata_schema_node
|
46
44
|
from c2cgeoportal_admin.schemas.restriction_areas import restrictionareas_schema_node
|
47
45
|
from c2cgeoportal_admin.schemas.treeitem import parent_id_node
|
48
46
|
from c2cgeoportal_admin.views.dimension_layers import DimensionLayerViews
|
@@ -51,16 +49,18 @@ from c2cgeoportal_commons.models.main import LayerGroup, LayerWMS, LayerWMTS, OG
|
|
51
49
|
_list_field = partial(ListField, LayerWMS)
|
52
50
|
|
53
51
|
base_schema = GeoFormSchemaNode(LayerWMS, widget=FormWidget(fields_template="layer_fields"))
|
54
|
-
base_schema.add(dimensions_schema_node.
|
55
|
-
base_schema.add(
|
56
|
-
base_schema.add(interfaces_schema_node.
|
57
|
-
base_schema.add(restrictionareas_schema_node.
|
52
|
+
base_schema.add(dimensions_schema_node(LayerWMS.dimensions))
|
53
|
+
base_schema.add(metadata_schema_node(LayerWMS.metadatas, LayerWMS))
|
54
|
+
base_schema.add(interfaces_schema_node(LayerWMS.interfaces))
|
55
|
+
base_schema.add(restrictionareas_schema_node(LayerWMS.restrictionareas))
|
58
56
|
base_schema.add_unique_validator(LayerWMS.name, LayerWMS.id)
|
59
|
-
base_schema.add(parent_id_node(LayerGroup))
|
57
|
+
base_schema.add(parent_id_node(LayerGroup)) # type: ignore
|
60
58
|
|
61
59
|
|
62
60
|
@view_defaults(match_param="table=layers_wms")
|
63
61
|
class LayerWmsViews(DimensionLayerViews):
|
62
|
+
"""The WMS layer administration view."""
|
63
|
+
|
64
64
|
_list_fields = (
|
65
65
|
DimensionLayerViews._list_fields
|
66
66
|
+ [
|
@@ -83,20 +83,20 @@ class LayerWmsViews(DimensionLayerViews):
|
|
83
83
|
_model = LayerWMS
|
84
84
|
_base_schema = base_schema
|
85
85
|
|
86
|
-
def _base_query(self, query=None):
|
86
|
+
def _base_query(self, query: Optional[sqlalchemy.orm.query.Query] = None) -> sqlalchemy.orm.query.Query:
|
87
87
|
del query
|
88
88
|
return super()._base_query(self._request.dbsession.query(LayerWMS).distinct().outerjoin("ogc_server"))
|
89
89
|
|
90
|
-
@view_config(route_name="c2cgeoform_index", renderer="../templates/index.jinja2")
|
91
|
-
def index(self):
|
92
|
-
return super().index()
|
90
|
+
@view_config(route_name="c2cgeoform_index", renderer="../templates/index.jinja2") # type: ignore
|
91
|
+
def index(self) -> Dict[str, Any]:
|
92
|
+
return super().index() # type: ignore
|
93
93
|
|
94
|
-
@view_config(route_name="c2cgeoform_grid", renderer="fast_json")
|
95
|
-
def grid(self):
|
96
|
-
return super().grid()
|
94
|
+
@view_config(route_name="c2cgeoform_grid", renderer="fast_json") # type: ignore
|
95
|
+
def grid(self) -> Dict[str, Any]:
|
96
|
+
return super().grid() # type: ignore
|
97
97
|
|
98
|
-
def _item_actions(self, item, readonly=False):
|
99
|
-
actions = super()._item_actions(item, readonly)
|
98
|
+
def _item_actions(self, item: LayerWMS, readonly: bool = False) -> List[ItemAction]:
|
99
|
+
actions: List[ItemAction] = super()._item_actions(item, readonly)
|
100
100
|
if inspect(item).persistent:
|
101
101
|
actions.insert(
|
102
102
|
next((i for i, v in enumerate(actions) if v.name() == "delete")),
|
@@ -111,31 +111,35 @@ class LayerWmsViews(DimensionLayerViews):
|
|
111
111
|
)
|
112
112
|
return actions
|
113
113
|
|
114
|
-
@view_config(
|
115
|
-
|
114
|
+
@view_config( # type: ignore
|
115
|
+
route_name="c2cgeoform_item", request_method="GET", renderer="../templates/edit.jinja2"
|
116
|
+
)
|
117
|
+
def view(self) -> Dict[str, Any]:
|
116
118
|
if self._is_new():
|
117
119
|
dbsession = self._request.dbsession
|
118
120
|
default_wms = LayerWMS.get_default(dbsession)
|
119
121
|
if default_wms:
|
120
|
-
return self.copy(default_wms, excludes=["name", "layer"])
|
121
|
-
return super().edit()
|
122
|
+
return self.copy(default_wms, excludes=["name", "layer"]) # type: ignore
|
123
|
+
return super().edit() # type: ignore
|
122
124
|
|
123
|
-
@view_config(
|
124
|
-
|
125
|
-
|
125
|
+
@view_config( # type: ignore
|
126
|
+
route_name="c2cgeoform_item", request_method="POST", renderer="../templates/edit.jinja2"
|
127
|
+
)
|
128
|
+
def save(self) -> Dict[str, Any]:
|
129
|
+
return super().save() # type: ignore
|
126
130
|
|
127
|
-
@view_config(route_name="c2cgeoform_item", request_method="DELETE", renderer="fast_json")
|
128
|
-
def delete(self):
|
129
|
-
return super().delete()
|
131
|
+
@view_config(route_name="c2cgeoform_item", request_method="DELETE", renderer="fast_json") # type: ignore
|
132
|
+
def delete(self) -> Dict[str, Any]:
|
133
|
+
return super().delete() # type: ignore
|
130
134
|
|
131
|
-
@view_config(
|
135
|
+
@view_config( # type: ignore
|
132
136
|
route_name="c2cgeoform_item_duplicate", request_method="GET", renderer="../templates/edit.jinja2"
|
133
137
|
)
|
134
|
-
def duplicate(self):
|
135
|
-
return super().duplicate()
|
138
|
+
def duplicate(self) -> Dict[str, Any]:
|
139
|
+
return super().duplicate() # type: ignore
|
136
140
|
|
137
|
-
@view_config(route_name="convert_to_wmts", request_method="POST", renderer="fast_json")
|
138
|
-
def convert_to_wmts(self):
|
141
|
+
@view_config(route_name="convert_to_wmts", request_method="POST", renderer="fast_json") # type: ignore
|
142
|
+
def convert_to_wmts(self) -> Dict[str, Any]:
|
139
143
|
src = self._get_object()
|
140
144
|
dbsession = self._request.dbsession
|
141
145
|
default_wmts = LayerWMTS.get_default(dbsession)
|
@@ -1,6 +1,4 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
# Copyright (c) 2017-2020, Camptocamp SA
|
1
|
+
# Copyright (c) 2017-2021, Camptocamp SA
|
4
2
|
# All rights reserved.
|
5
3
|
|
6
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -27,11 +25,11 @@
|
|
27
25
|
# of the authors and should not be interpreted as representing official policies,
|
28
26
|
# either expressed or implied, of the FreeBSD Project.
|
29
27
|
|
30
|
-
# pylint: disable=no-member
|
31
|
-
|
32
28
|
|
33
29
|
from functools import partial
|
30
|
+
from typing import Any, Dict, List, Optional
|
34
31
|
|
32
|
+
import sqlalchemy
|
35
33
|
from c2cgeoform.schema import GeoFormSchemaNode
|
36
34
|
from c2cgeoform.views.abstract_views import ItemAction, ListField
|
37
35
|
from deform.widget import FormWidget
|
@@ -42,7 +40,7 @@ from zope.sqlalchemy import mark_changed
|
|
42
40
|
from c2cgeoportal_admin import _
|
43
41
|
from c2cgeoportal_admin.schemas.dimensions import dimensions_schema_node
|
44
42
|
from c2cgeoportal_admin.schemas.interfaces import interfaces_schema_node
|
45
|
-
from c2cgeoportal_admin.schemas.metadata import
|
43
|
+
from c2cgeoportal_admin.schemas.metadata import metadata_schema_node
|
46
44
|
from c2cgeoportal_admin.schemas.restriction_areas import restrictionareas_schema_node
|
47
45
|
from c2cgeoportal_admin.schemas.treeitem import parent_id_node
|
48
46
|
from c2cgeoportal_admin.views.dimension_layers import DimensionLayerViews
|
@@ -51,16 +49,18 @@ from c2cgeoportal_commons.models.main import LayerGroup, LayerWMS, LayerWMTS, OG
|
|
51
49
|
_list_field = partial(ListField, LayerWMTS)
|
52
50
|
|
53
51
|
base_schema = GeoFormSchemaNode(LayerWMTS, widget=FormWidget(fields_template="layer_fields"))
|
54
|
-
base_schema.add(dimensions_schema_node.
|
55
|
-
base_schema.add(
|
56
|
-
base_schema.add(interfaces_schema_node.
|
57
|
-
base_schema.add(restrictionareas_schema_node.
|
52
|
+
base_schema.add(dimensions_schema_node(LayerWMTS.dimensions))
|
53
|
+
base_schema.add(metadata_schema_node(LayerWMTS.metadatas, LayerWMTS))
|
54
|
+
base_schema.add(interfaces_schema_node(LayerWMTS.interfaces))
|
55
|
+
base_schema.add(restrictionareas_schema_node(LayerWMTS.restrictionareas))
|
58
56
|
base_schema.add_unique_validator(LayerWMTS.name, LayerWMTS.id)
|
59
|
-
base_schema.add(parent_id_node(LayerGroup))
|
57
|
+
base_schema.add(parent_id_node(LayerGroup)) # type: ignore
|
60
58
|
|
61
59
|
|
62
60
|
@view_defaults(match_param="table=layers_wmts")
|
63
61
|
class LayerWmtsViews(DimensionLayerViews):
|
62
|
+
"""The WMTS layer administration view."""
|
63
|
+
|
64
64
|
_list_fields = (
|
65
65
|
DimensionLayerViews._list_fields
|
66
66
|
+ [
|
@@ -76,19 +76,19 @@ class LayerWmtsViews(DimensionLayerViews):
|
|
76
76
|
_model = LayerWMTS
|
77
77
|
_base_schema = base_schema
|
78
78
|
|
79
|
-
def _base_query(self, query=None):
|
79
|
+
def _base_query(self, query: Optional[sqlalchemy.orm.query.Query] = None) -> sqlalchemy.orm.query.Query:
|
80
80
|
return super()._base_query(self._request.dbsession.query(LayerWMTS).distinct())
|
81
81
|
|
82
|
-
@view_config(route_name="c2cgeoform_index", renderer="../templates/index.jinja2")
|
83
|
-
def index(self):
|
84
|
-
return super().index()
|
82
|
+
@view_config(route_name="c2cgeoform_index", renderer="../templates/index.jinja2") # type: ignore
|
83
|
+
def index(self) -> Dict[str, Any]:
|
84
|
+
return super().index() # type: ignore
|
85
85
|
|
86
|
-
@view_config(route_name="c2cgeoform_grid", renderer="fast_json")
|
87
|
-
def grid(self):
|
88
|
-
return super().grid()
|
86
|
+
@view_config(route_name="c2cgeoform_grid", renderer="fast_json") # type: ignore
|
87
|
+
def grid(self) -> Dict[str, Any]:
|
88
|
+
return super().grid() # type: ignore
|
89
89
|
|
90
|
-
def _item_actions(self, item, readonly=False):
|
91
|
-
actions = super()._item_actions(item, readonly)
|
90
|
+
def _item_actions(self, item: LayerWMTS, readonly: bool = False) -> List[ItemAction]:
|
91
|
+
actions: List[ItemAction] = super()._item_actions(item, readonly)
|
92
92
|
if inspect(item).persistent:
|
93
93
|
actions.insert(
|
94
94
|
next((i for i, v in enumerate(actions) if v.name() == "delete")),
|
@@ -103,31 +103,35 @@ class LayerWmtsViews(DimensionLayerViews):
|
|
103
103
|
)
|
104
104
|
return actions
|
105
105
|
|
106
|
-
@view_config(
|
107
|
-
|
106
|
+
@view_config( # type: ignore
|
107
|
+
route_name="c2cgeoform_item", request_method="GET", renderer="../templates/edit.jinja2"
|
108
|
+
)
|
109
|
+
def view(self) -> Dict[str, Any]:
|
108
110
|
if self._is_new():
|
109
111
|
dbsession = self._request.dbsession
|
110
112
|
default_wmts = LayerWMTS.get_default(dbsession)
|
111
113
|
if default_wmts:
|
112
|
-
return self.copy(default_wmts, excludes=["name", "layer"])
|
113
|
-
return super().edit()
|
114
|
+
return self.copy(default_wmts, excludes=["name", "layer"]) # type: ignore
|
115
|
+
return super().edit() # type: ignore
|
114
116
|
|
115
|
-
@view_config(
|
116
|
-
|
117
|
-
|
117
|
+
@view_config( # type: ignore
|
118
|
+
route_name="c2cgeoform_item", request_method="POST", renderer="../templates/edit.jinja2"
|
119
|
+
)
|
120
|
+
def save(self) -> Dict[str, Any]:
|
121
|
+
return super().save() # type: ignore
|
118
122
|
|
119
|
-
@view_config(route_name="c2cgeoform_item", request_method="DELETE", renderer="fast_json")
|
120
|
-
def delete(self):
|
121
|
-
return super().delete()
|
123
|
+
@view_config(route_name="c2cgeoform_item", request_method="DELETE", renderer="fast_json") # type: ignore
|
124
|
+
def delete(self) -> Dict[str, Any]:
|
125
|
+
return super().delete() # type: ignore
|
122
126
|
|
123
|
-
@view_config(
|
127
|
+
@view_config( # type: ignore
|
124
128
|
route_name="c2cgeoform_item_duplicate", request_method="GET", renderer="../templates/edit.jinja2"
|
125
129
|
)
|
126
|
-
def duplicate(self):
|
127
|
-
return super().duplicate()
|
130
|
+
def duplicate(self) -> Dict[str, Any]:
|
131
|
+
return super().duplicate() # type: ignore
|
128
132
|
|
129
|
-
@view_config(route_name="convert_to_wms", request_method="POST", renderer="fast_json")
|
130
|
-
def convert_to_wms(self):
|
133
|
+
@view_config(route_name="convert_to_wms", request_method="POST", renderer="fast_json") # type: ignore
|
134
|
+
def convert_to_wms(self) -> Dict[str, Any]:
|
131
135
|
src = self._get_object()
|
132
136
|
dbsession = self._request.dbsession
|
133
137
|
default_wms = LayerWMS.get_default(dbsession)
|
@@ -1,6 +1,4 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
# Copyright (c) 2017-2020, Camptocamp SA
|
1
|
+
# Copyright (c) 2017-2021, Camptocamp SA
|
4
2
|
# All rights reserved.
|
5
3
|
|
6
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -28,13 +26,16 @@
|
|
28
26
|
# either expressed or implied, of the FreeBSD Project.
|
29
27
|
|
30
28
|
|
29
|
+
from typing import Any, Dict, List, Optional
|
30
|
+
|
31
|
+
import pyramid.request
|
31
32
|
from c2cgeoform.views.abstract_views import ItemAction
|
32
33
|
from pyramid.httpexceptions import HTTPNotFound
|
33
34
|
from pyramid.view import view_config, view_defaults
|
34
35
|
from translationstring import TranslationStringFactory
|
35
36
|
|
36
37
|
from c2cgeoportal_admin import _
|
37
|
-
from c2cgeoportal_commons.models.main import LayergroupTreeitem, Theme, TreeItem
|
38
|
+
from c2cgeoportal_commons.models.main import Interface, Layer, LayergroupTreeitem, Theme, TreeItem
|
38
39
|
|
39
40
|
itemtypes_tables = {
|
40
41
|
"theme": "themes",
|
@@ -46,30 +47,37 @@ itemtypes_tables = {
|
|
46
47
|
|
47
48
|
@view_defaults(match_param=("application=admin"))
|
48
49
|
class LayerTreeViews:
|
49
|
-
|
50
|
+
"""The layer tree administration view."""
|
51
|
+
|
52
|
+
def __init__(self, request: pyramid.request.Request):
|
50
53
|
self._request = request
|
51
54
|
self._dbsession = request.dbsession
|
52
55
|
|
53
|
-
@view_config(route_name="layertree", renderer="../templates/layertree.jinja2")
|
54
|
-
def index(self):
|
56
|
+
@view_config(route_name="layertree", renderer="../templates/layertree.jinja2") # type: ignore
|
57
|
+
def index(self) -> Dict[str, int]:
|
55
58
|
node_limit = self._request.registry.settings["admin_interface"].get("layer_tree_max_nodes")
|
56
59
|
limit_exceeded = self._dbsession.query(LayergroupTreeitem).count() < node_limit
|
57
|
-
return {"limit_exceeded": limit_exceeded}
|
60
|
+
return {"limit_exceeded": limit_exceeded, "interfaces": self._dbsession.query(Interface).all()}
|
58
61
|
|
59
|
-
@view_config(route_name="layertree_children", renderer="fast_json")
|
60
|
-
def children(self):
|
62
|
+
@view_config(route_name="layertree_children", renderer="fast_json") # type: ignore
|
63
|
+
def children(self) -> List[Dict[str, Any]]:
|
64
|
+
interface = self._request.params.get("interface", None)
|
61
65
|
group_id = self._request.params.get("group_id", None)
|
62
66
|
path = self._request.params.get("path", "")
|
63
67
|
|
64
|
-
client_tsf = TranslationStringFactory("{
|
68
|
+
client_tsf = TranslationStringFactory(f"{self._request.registry.package_name}-client")
|
65
69
|
|
66
70
|
if group_id is None:
|
67
71
|
items = self._dbsession.query(Theme).order_by(Theme.ordering)
|
72
|
+
if interface is not None:
|
73
|
+
items = items.join(Theme.interfaces).filter(Interface.name == interface)
|
74
|
+
|
68
75
|
else:
|
69
76
|
items = (
|
70
77
|
self._dbsession.query(TreeItem)
|
71
|
-
.join(TreeItem.parents_relation)
|
78
|
+
.join(TreeItem.parents_relation)
|
72
79
|
.filter(LayergroupTreeitem.treegroup_id == group_id)
|
80
|
+
.order_by(LayergroupTreeitem.ordering)
|
73
81
|
)
|
74
82
|
|
75
83
|
return [
|
@@ -79,14 +87,17 @@ class LayerTreeViews:
|
|
79
87
|
"name": item.name,
|
80
88
|
"translated_name": self._request.localizer.translate(client_tsf(item.name)),
|
81
89
|
"description": item.description,
|
82
|
-
"path": "{}_{
|
90
|
+
"path": f"{path}_{item.id}",
|
83
91
|
"parent_path": path,
|
84
92
|
"actions": [action.to_dict(self._request) for action in self._item_actions(item, group_id)],
|
85
93
|
}
|
86
94
|
for item in items
|
95
|
+
if interface is None
|
96
|
+
or not isinstance(item, Layer)
|
97
|
+
or interface in [interface.name for interface in item.interfaces]
|
87
98
|
]
|
88
99
|
|
89
|
-
def _item_actions(self, item, parent_id=None):
|
100
|
+
def _item_actions(self, item: TreeItem, parent_id: Optional[int] = None) -> List[ItemAction]:
|
90
101
|
actions = []
|
91
102
|
actions.append(
|
92
103
|
ItemAction(
|
@@ -105,9 +116,8 @@ class LayerTreeViews:
|
|
105
116
|
name="new_layer_group",
|
106
117
|
label=_("New layer group"),
|
107
118
|
icon="glyphicon glyphicon-plus",
|
108
|
-
url="{}?
|
109
|
-
|
110
|
-
),
|
119
|
+
url=f"{self._request.route_url('c2cgeoform_item', table='layer_groups', id='new')}?"
|
120
|
+
f"parent_id={item.id}",
|
111
121
|
)
|
112
122
|
)
|
113
123
|
|
@@ -117,9 +127,8 @@ class LayerTreeViews:
|
|
117
127
|
name="new_layer_wms",
|
118
128
|
label=_("New WMS layer"),
|
119
129
|
icon="glyphicon glyphicon-plus",
|
120
|
-
url="{}?
|
121
|
-
|
122
|
-
),
|
130
|
+
url=f"{self._request.route_url('c2cgeoform_item', table='layers_wms', id='new')}?"
|
131
|
+
f"parent_id={item.id}",
|
123
132
|
)
|
124
133
|
)
|
125
134
|
|
@@ -128,9 +137,8 @@ class LayerTreeViews:
|
|
128
137
|
name="new_layer_wmts",
|
129
138
|
label=_("New WMTS layer"),
|
130
139
|
icon="glyphicon glyphicon-plus",
|
131
|
-
url="{}?
|
132
|
-
|
133
|
-
),
|
140
|
+
url=f"{self._request.route_url('c2cgeoform_item', table='layers_wmts', id='new')}?"
|
141
|
+
f"parent_id={item.id}",
|
134
142
|
)
|
135
143
|
)
|
136
144
|
|
@@ -170,8 +178,8 @@ class LayerTreeViews:
|
|
170
178
|
|
171
179
|
return actions
|
172
180
|
|
173
|
-
@view_config(route_name="layertree_unlink", request_method="DELETE", renderer="fast_json")
|
174
|
-
def unlink(self):
|
181
|
+
@view_config(route_name="layertree_unlink", request_method="DELETE", renderer="fast_json") # type: ignore
|
182
|
+
def unlink(self) -> Dict[str, Any]:
|
175
183
|
group_id = self._request.matchdict.get("group_id")
|
176
184
|
item_id = self._request.matchdict.get("item_id")
|
177
185
|
link = (
|
@@ -186,8 +194,8 @@ class LayerTreeViews:
|
|
186
194
|
self._request.dbsession.flush()
|
187
195
|
return {"success": True, "redirect": self._request.route_url("layertree")}
|
188
196
|
|
189
|
-
@view_config(route_name="layertree_delete", request_method="DELETE", renderer="fast_json")
|
190
|
-
def delete(self):
|
197
|
+
@view_config(route_name="layertree_delete", request_method="DELETE", renderer="fast_json") # type: ignore
|
198
|
+
def delete(self) -> Dict[str, Any]:
|
191
199
|
item_id = self._request.matchdict.get("item_id")
|
192
200
|
item = self._request.dbsession.query(TreeItem).get(item_id)
|
193
201
|
if item is None:
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
1
|
# Copyright (c) 2021, Camptocamp SA
|
4
2
|
# All rights reserved.
|
5
3
|
|
@@ -29,6 +27,7 @@
|
|
29
27
|
|
30
28
|
|
31
29
|
from functools import partial
|
30
|
+
from typing import Any, Dict
|
32
31
|
|
33
32
|
from c2cgeoform.schema import GeoFormSchemaNode
|
34
33
|
from c2cgeoform.views.abstract_views import AbstractViews, ListField
|
@@ -43,7 +42,9 @@ base_schema.add_unique_validator(OAuth2Client.client_id, OAuth2Client.id)
|
|
43
42
|
|
44
43
|
|
45
44
|
@view_defaults(match_param="table=oauth2_clients")
|
46
|
-
class OAuth2ClientViews(AbstractViews):
|
45
|
+
class OAuth2ClientViews(AbstractViews): # type: ignore
|
46
|
+
"""The oAuth2 client administration view."""
|
47
|
+
|
47
48
|
_list_fields = [
|
48
49
|
_list_field("id"),
|
49
50
|
_list_field("client_id"),
|
@@ -57,28 +58,32 @@ class OAuth2ClientViews(AbstractViews):
|
|
57
58
|
def _base_query(self):
|
58
59
|
return self._request.dbsession.query(OAuth2Client)
|
59
60
|
|
60
|
-
@view_config(route_name="c2cgeoform_index", renderer="../templates/index.jinja2")
|
61
|
-
def index(self):
|
62
|
-
return super().index()
|
61
|
+
@view_config(route_name="c2cgeoform_index", renderer="../templates/index.jinja2") # type: ignore
|
62
|
+
def index(self) -> Dict[str, Any]:
|
63
|
+
return super().index() # type: ignore
|
63
64
|
|
64
|
-
@view_config(route_name="c2cgeoform_grid", renderer="fast_json")
|
65
|
-
def grid(self):
|
66
|
-
return super().grid()
|
65
|
+
@view_config(route_name="c2cgeoform_grid", renderer="fast_json") # type: ignore
|
66
|
+
def grid(self) -> Dict[str, Any]:
|
67
|
+
return super().grid() # type: ignore
|
67
68
|
|
68
|
-
@view_config(
|
69
|
-
|
70
|
-
|
69
|
+
@view_config( # type: ignore
|
70
|
+
route_name="c2cgeoform_item", request_method="GET", renderer="../templates/edit.jinja2"
|
71
|
+
)
|
72
|
+
def view(self) -> Dict[str, Any]:
|
73
|
+
return super().edit() # type: ignore
|
71
74
|
|
72
|
-
@view_config(
|
73
|
-
|
74
|
-
|
75
|
+
@view_config( # type: ignore
|
76
|
+
route_name="c2cgeoform_item", request_method="POST", renderer="../templates/edit.jinja2"
|
77
|
+
)
|
78
|
+
def save(self) -> Dict[str, Any]:
|
79
|
+
return super().save() # type: ignore
|
75
80
|
|
76
|
-
@view_config(route_name="c2cgeoform_item", request_method="DELETE", renderer="fast_json")
|
77
|
-
def delete(self):
|
78
|
-
return super().delete()
|
81
|
+
@view_config(route_name="c2cgeoform_item", request_method="DELETE", renderer="fast_json") # type: ignore
|
82
|
+
def delete(self) -> Dict[str, Any]:
|
83
|
+
return super().delete() # type: ignore
|
79
84
|
|
80
|
-
@view_config(
|
85
|
+
@view_config( # type: ignore
|
81
86
|
route_name="c2cgeoform_item_duplicate", request_method="GET", renderer="../templates/edit.jinja2"
|
82
87
|
)
|
83
|
-
def duplicate(self):
|
84
|
-
return super().duplicate()
|
88
|
+
def duplicate(self) -> Dict[str, Any]:
|
89
|
+
return super().duplicate() # type: ignore
|