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
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
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 metadatas_schema_node
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(metadatas_schema_node.clone())
50
- base_schema.add(interfaces_schema_node.clone())
51
- base_schema.add(restrictionareas_schema_node.clone())
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
- # -*- coding: utf-8 -*-
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 metadatas_schema_node
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.clone())
55
- base_schema.add(metadatas_schema_node.clone())
56
- base_schema.add(interfaces_schema_node.clone())
57
- base_schema.add(restrictionareas_schema_node.clone())
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(route_name="c2cgeoform_item", request_method="GET", renderer="../templates/edit.jinja2")
115
- def view(self):
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(route_name="c2cgeoform_item", request_method="POST", renderer="../templates/edit.jinja2")
124
- def save(self):
125
- return super().save()
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
- # -*- coding: utf-8 -*-
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 metadatas_schema_node
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.clone())
55
- base_schema.add(metadatas_schema_node.clone())
56
- base_schema.add(interfaces_schema_node.clone())
57
- base_schema.add(restrictionareas_schema_node.clone())
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(route_name="c2cgeoform_item", request_method="GET", renderer="../templates/edit.jinja2")
107
- def view(self):
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(route_name="c2cgeoform_item", request_method="POST", renderer="../templates/edit.jinja2")
116
- def save(self):
117
- return super().save()
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
- # -*- coding: utf-8 -*-
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
- def __init__(self, request):
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("{}-client".format(self._request.registry.package_name))
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) # pylint: disable=no-member
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": "{}_{}".format(path, item.id),
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="{}?parent_id={}".format(
109
- self._request.route_url("c2cgeoform_item", table="layer_groups", id="new"), item.id
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="{}?parent_id={}".format(
121
- self._request.route_url("c2cgeoform_item", table="layers_wms", id="new"), item.id
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="{}?parent_id={}".format(
132
- self._request.route_url("c2cgeoform_item", table="layers_wmts", id="new"), item.id
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(route_name="c2cgeoform_item", request_method="GET", renderer="../templates/edit.jinja2")
69
- def view(self):
70
- return super().edit()
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(route_name="c2cgeoform_item", request_method="POST", renderer="../templates/edit.jinja2")
73
- def save(self):
74
- return super().save()
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