c2cgeoportal-geoportal 2.6.0__py2.py3-none-any.whl → 2.7.1.157__py2.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 (212) hide show
  1. c2cgeoportal_geoportal/__init__.py +224 -84
  2. c2cgeoportal_geoportal/lib/__init__.py +67 -43
  3. c2cgeoportal_geoportal/lib/authentication.py +50 -22
  4. c2cgeoportal_geoportal/lib/bashcolor.py +17 -13
  5. c2cgeoportal_geoportal/lib/cacheversion.py +16 -8
  6. c2cgeoportal_geoportal/lib/caching.py +61 -191
  7. c2cgeoportal_geoportal/lib/check_collector.py +17 -10
  8. c2cgeoportal_geoportal/lib/checker.py +61 -63
  9. c2cgeoportal_geoportal/lib/common_headers.py +170 -0
  10. c2cgeoportal_geoportal/lib/dbreflection.py +54 -39
  11. c2cgeoportal_geoportal/lib/filter_capabilities.py +122 -88
  12. c2cgeoportal_geoportal/lib/fulltextsearch.py +6 -5
  13. c2cgeoportal_geoportal/lib/functionality.py +20 -17
  14. c2cgeoportal_geoportal/lib/headers.py +14 -5
  15. c2cgeoportal_geoportal/lib/i18n.py +4 -4
  16. c2cgeoportal_geoportal/lib/layers.py +30 -11
  17. c2cgeoportal_geoportal/lib/lingua_extractor.py +361 -237
  18. c2cgeoportal_geoportal/lib/loader.py +10 -15
  19. c2cgeoportal_geoportal/lib/metrics.py +28 -17
  20. c2cgeoportal_geoportal/lib/oauth2.py +214 -145
  21. c2cgeoportal_geoportal/lib/wmstparsing.py +115 -90
  22. c2cgeoportal_geoportal/lib/xsd.py +26 -16
  23. c2cgeoportal_geoportal/resources.py +15 -9
  24. c2cgeoportal_geoportal/scaffolds/advance_create/ci/config.yaml +26 -0
  25. c2cgeoportal_geoportal/scaffolds/advance_create/cookiecutter.json +18 -0
  26. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.dockerignore +6 -0
  27. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.eslintrc.yaml +19 -0
  28. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+dot+prospector.yaml → advance_create/{{cookiecutter.project}}/geoportal/.prospector.yaml} +8 -2
  29. c2cgeoportal_geoportal/scaffolds/{create/geoportal/Dockerfile_tmpl → advance_create/{{cookiecutter.project}}/geoportal/Dockerfile} +18 -9
  30. c2cgeoportal_geoportal/scaffolds/{create/geoportal/alembic.yaml_tmpl → advance_create/{{cookiecutter.project}}/geoportal/alembic.yaml} +1 -1
  31. c2cgeoportal_geoportal/scaffolds/{create/geoportal/development.ini_tmpl → advance_create/{{cookiecutter.project}}/geoportal/development.ini} +34 -15
  32. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/gunicorn.conf.py +102 -0
  33. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/lingua-client.cfg +1 -0
  34. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/production.ini +38 -0
  35. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/requirements.txt +2 -0
  36. c2cgeoportal_geoportal/scaffolds/{create/geoportal/setup.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/setup.py} +6 -7
  37. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/tools/extract-messages.js +8 -6
  38. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/tsconfig.json +8 -0
  39. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.api.js +75 -0
  40. c2cgeoportal_geoportal/scaffolds/{create/geoportal/webpack.apps.js_tmpl → advance_create/{{cookiecutter.project}}/geoportal/webpack.apps.js} +31 -28
  41. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/webpack.commons.js +3 -7
  42. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/webpack.config.js +1 -1
  43. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal/__init__.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py} +11 -22
  44. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/authentication.py +10 -0
  45. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/dev.py +14 -0
  46. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/models.py +8 -0
  47. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_organization.py +7 -0
  48. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/resources.py +4 -3
  49. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal/static-ngeo/api/index.js_tmpl → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static-ngeo/api/index.js} +1 -2
  50. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal/static-ngeo/js/+package+module.js_tmpl → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static-ngeo/js/{{cookiecutter.package}}module.js} +4 -4
  51. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal/subscribers.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/subscribers.py} +1 -3
  52. c2cgeoportal_geoportal/scaffolds/advance_update/cookiecutter.json +18 -0
  53. c2cgeoportal_geoportal/scaffolds/{update/geoportal/CONST_Makefile_tmpl → advance_update/{{cookiecutter.project}}/geoportal/CONST_Makefile} +3 -7
  54. c2cgeoportal_geoportal/scaffolds/create/cookiecutter.json +18 -0
  55. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.dockerignore +14 -0
  56. c2cgeoportal_geoportal/scaffolds/create/{+dot+editorconfig → {{cookiecutter.project}}/.editorconfig} +2 -5
  57. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/main.yaml +43 -0
  58. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/rebuild.yaml +46 -0
  59. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/update_l10n.yaml +65 -0
  60. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.gitignore +16 -0
  61. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierignore +1 -0
  62. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierrc.yaml +2 -0
  63. c2cgeoportal_geoportal/scaffolds/create/{Dockerfile_tmpl → {{cookiecutter.project}}/Dockerfile} +20 -11
  64. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Makefile +14 -0
  65. c2cgeoportal_geoportal/scaffolds/create/{README.rst_tmpl → {{cookiecutter.project}}/README.rst} +4 -4
  66. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/build +162 -0
  67. c2cgeoportal_geoportal/scaffolds/create/{ci/config.yaml_tmpl → {{cookiecutter.project}}/ci/config.yaml} +7 -5
  68. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/requirements.txt +1 -0
  69. c2cgeoportal_geoportal/scaffolds/create/{docker-compose-lib.yaml → {{cookiecutter.project}}/docker-compose-lib.yaml} +133 -17
  70. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose.override.sample.yaml +67 -0
  71. c2cgeoportal_geoportal/scaffolds/create/{docker-compose.yaml → {{cookiecutter.project}}/docker-compose.yaml} +17 -12
  72. c2cgeoportal_geoportal/scaffolds/create/{env.default_tmpl → {{cookiecutter.project}}/env.default} +29 -14
  73. c2cgeoportal_geoportal/scaffolds/create/{env.project_tmpl → {{cookiecutter.project}}/env.project} +16 -4
  74. c2cgeoportal_geoportal/scaffolds/create/{geoportal/vars.yaml_tmpl → {{cookiecutter.project}}/geoportal/vars.yaml} +93 -27
  75. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/mobile.css +0 -0
  76. c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/data/Readme.txt +1 -1
  77. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/demo.map.tmpl +224 -0
  78. c2cgeoportal_geoportal/scaffolds/create/{mapserver/mapserver.map.tmpl_tmpl → {{cookiecutter.project}}/mapserver/mapserver.map.tmpl} +7 -15
  79. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Landscape.jrxml +8 -8
  80. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Portrait.jrxml +8 -8
  81. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Landscape.jrxml +8 -8
  82. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Portrait.jrxml +8 -8
  83. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/config.yaml.tmpl +5 -4
  84. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/localisation.properties +4 -0
  85. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/localisation_fr.properties +4 -0
  86. c2cgeoportal_geoportal/scaffolds/create/{project.yaml_tmpl → {{cookiecutter.project}}/project.yaml} +6 -6
  87. c2cgeoportal_geoportal/scaffolds/create/{qgisserver/pg_service.conf.tmpl_tmpl → {{cookiecutter.project}}/qgisserver/pg_service.conf.tmpl} +2 -2
  88. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-backup +110 -0
  89. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-restore +114 -0
  90. c2cgeoportal_geoportal/scaffolds/create/{setup.cfg_tmpl → {{cookiecutter.project}}/setup.cfg} +1 -1
  91. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/spell-ignore-words.txt +3 -0
  92. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tilegeneration/config.yaml.tmpl +195 -0
  93. c2cgeoportal_geoportal/scaffolds/update/cookiecutter.json +18 -0
  94. c2cgeoportal_geoportal/scaffolds/update/{+dot+upgrade.yaml_tmpl → {{cookiecutter.project}}/.upgrade.yaml} +49 -39
  95. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_CHANGELOG.txt +1160 -0
  96. c2cgeoportal_geoportal/scaffolds/update/{geoportal → {{cookiecutter.project}}/geoportal}/CONST_config-schema.yaml +47 -2
  97. c2cgeoportal_geoportal/scaffolds/update/{geoportal/CONST_vars.yaml_tmpl → {{cookiecutter.project}}/geoportal/CONST_vars.yaml} +350 -17
  98. c2cgeoportal_geoportal/scripts/__init__.py +16 -30
  99. c2cgeoportal_geoportal/scripts/c2cupgrade.py +271 -232
  100. c2cgeoportal_geoportal/scripts/create_demo_theme.py +3 -6
  101. c2cgeoportal_geoportal/scripts/manage_users.py +34 -39
  102. c2cgeoportal_geoportal/scripts/pcreate.py +312 -0
  103. c2cgeoportal_geoportal/scripts/theme2fts.py +72 -23
  104. c2cgeoportal_geoportal/scripts/urllogin.py +19 -11
  105. c2cgeoportal_geoportal/templates/login.html +88 -84
  106. c2cgeoportal_geoportal/templates/notlogin.html +59 -59
  107. c2cgeoportal_geoportal/templates/testi18n.html +6 -8
  108. c2cgeoportal_geoportal/views/__init__.py +23 -4
  109. c2cgeoportal_geoportal/views/dev.py +9 -7
  110. c2cgeoportal_geoportal/views/dynamic.py +56 -19
  111. c2cgeoportal_geoportal/views/entry.py +93 -24
  112. c2cgeoportal_geoportal/views/fulltextsearch.py +28 -22
  113. c2cgeoportal_geoportal/views/geometry_processing.py +15 -7
  114. c2cgeoportal_geoportal/views/i18n.py +91 -9
  115. c2cgeoportal_geoportal/views/layers.py +160 -126
  116. c2cgeoportal_geoportal/views/login.py +106 -93
  117. c2cgeoportal_geoportal/views/mapserverproxy.py +46 -29
  118. c2cgeoportal_geoportal/views/memory.py +12 -12
  119. c2cgeoportal_geoportal/views/ogcproxy.py +48 -30
  120. c2cgeoportal_geoportal/views/pdfreport.py +26 -22
  121. c2cgeoportal_geoportal/views/printproxy.py +60 -52
  122. c2cgeoportal_geoportal/views/profile.py +24 -23
  123. c2cgeoportal_geoportal/views/proxy.py +87 -69
  124. c2cgeoportal_geoportal/views/raster.py +35 -24
  125. c2cgeoportal_geoportal/views/resourceproxy.py +13 -11
  126. c2cgeoportal_geoportal/views/shortener.py +27 -24
  127. c2cgeoportal_geoportal/views/theme.py +427 -321
  128. c2cgeoportal_geoportal/views/tinyowsproxy.py +46 -39
  129. c2cgeoportal_geoportal/views/vector_tiles.py +80 -0
  130. {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.7.1.157.dist-info}/METADATA +25 -20
  131. c2cgeoportal_geoportal-2.7.1.157.dist-info/RECORD +185 -0
  132. {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.7.1.157.dist-info}/WHEEL +1 -1
  133. {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.7.1.157.dist-info}/entry_points.txt +3 -1
  134. tests/__init__.py +7 -3
  135. tests/test_cachebuster.py +0 -2
  136. tests/test_caching.py +17 -25
  137. tests/test_checker.py +0 -2
  138. tests/test_decimaljson.py +4 -4
  139. tests/test_headerstween.py +0 -2
  140. tests/test_i18n.py +1 -1
  141. tests/test_init.py +4 -7
  142. tests/test_locale_negociator.py +0 -2
  143. tests/test_mapserverproxy_route_predicate.py +0 -2
  144. tests/test_raster.py +0 -2
  145. tests/test_wmstparsing.py +0 -2
  146. c2cgeoportal_geoportal/scaffolds/__init__.py +0 -227
  147. c2cgeoportal_geoportal/scaffolds/create/+dot+dockerignore_tmpl +0 -12
  148. c2cgeoportal_geoportal/scaffolds/create/+dot+github/workflows/main.yaml_tmpl +0 -89
  149. c2cgeoportal_geoportal/scaffolds/create/+dot+github/workflows/rebuild.yaml_tmpl +0 -78
  150. c2cgeoportal_geoportal/scaffolds/create/+dot+gitignore_tmpl +0 -16
  151. c2cgeoportal_geoportal/scaffolds/create/Makefile +0 -3
  152. c2cgeoportal_geoportal/scaffolds/create/build_tmpl +0 -167
  153. c2cgeoportal_geoportal/scaffolds/create/ci/requirements.txt +0 -1
  154. c2cgeoportal_geoportal/scaffolds/create/ci/trigger +0 -68
  155. c2cgeoportal_geoportal/scaffolds/create/docker-compose.override.sample.yaml +0 -54
  156. c2cgeoportal_geoportal/scaffolds/create/geoportal/+dot+dockerignore_tmpl +0 -6
  157. c2cgeoportal_geoportal/scaffolds/create/geoportal/+dot+eslintrc_tmpl +0 -15
  158. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/models.py_tmpl +0 -10
  159. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static/robot.txt +0 -3
  160. c2cgeoportal_geoportal/scaffolds/create/geoportal/production.ini_tmpl +0 -106
  161. c2cgeoportal_geoportal/scaffolds/create/geoportal/requirements.txt +0 -2
  162. c2cgeoportal_geoportal/scaffolds/create/geoportal/tsconfig.json_tmpl +0 -9
  163. c2cgeoportal_geoportal/scaffolds/create/geoportal/webpack.api.js_tmpl +0 -72
  164. c2cgeoportal_geoportal/scaffolds/create/mapserver/demo.map.tmpl_tmpl +0 -262
  165. c2cgeoportal_geoportal/scaffolds/create/mapserver/tinyows.xml +0 -36
  166. c2cgeoportal_geoportal/scaffolds/create/print/print-apps/+package+/config.yaml +0 -168
  167. c2cgeoportal_geoportal/scaffolds/create/qgisserver/geomapfish.yaml.tmpl_tmpl +0 -16
  168. c2cgeoportal_geoportal/scaffolds/create/spell-ignore-words.txt +0 -1
  169. c2cgeoportal_geoportal/scaffolds/create/tilegeneration/config.yaml.tmpl_tmpl +0 -185
  170. c2cgeoportal_geoportal/scaffolds/create/yamllint.yaml +0 -11
  171. c2cgeoportal_geoportal/scaffolds/update/CONST_CHANGELOG.txt_tmpl +0 -454
  172. c2cgeoportal_geoportal/templates/dynamic.js +0 -21
  173. c2cgeoportal_geoportal-2.6.0.dist-info/RECORD +0 -173
  174. /c2cgeoportal_geoportal/{scaffolds/create/geoportal/+package+_geoportal/static/css/desktop.css → py.typed} +0 -0
  175. /c2cgeoportal_geoportal/scaffolds/{create/geoportal/Makefile_tmpl → advance_create/{{cookiecutter.project}}/geoportal/Makefile} +0 -0
  176. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/alembic.ini +0 -0
  177. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/language_mapping +0 -0
  178. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/lingua-server.cfg +0 -0
  179. /c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/views/__init__.py +0 -0
  180. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal/locale/en/LC_MESSAGES/+package+_geoportal-client.po → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/locale/en/LC_MESSAGES/{{cookiecutter.package}}_geoportal-client.po} +0 -0
  181. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal/static/css/iframe_api.css → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/desktop.css} +0 -0
  182. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal/static/css/mobile.css → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/iframe_api.css} +0 -0
  183. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/banner_left.png +0 -0
  184. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/banner_right.png +0 -0
  185. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/blank.png +0 -0
  186. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker-blue.png +0 -0
  187. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker-gold.png +0 -0
  188. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker-green.png +0 -0
  189. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker.png +0 -0
  190. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/robot.txt.tmpl +0 -0
  191. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/data/TM_EUROPE_BORDERS-0.3.sql +0 -0
  192. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arial.ttf +0 -0
  193. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arialbd.ttf +0 -0
  194. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arialbi.ttf +0 -0
  195. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Ariali.ttf +0 -0
  196. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Bold.ttf +0 -0
  197. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-BoldItalic.ttf +0 -0
  198. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Italic.ttf +0 -0
  199. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Regular.ttf +0 -0
  200. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdana.ttf +0 -0
  201. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanab.ttf +0 -0
  202. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanai.ttf +0 -0
  203. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanaz.ttf +0 -0
  204. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts.conf +0 -0
  205. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/tinyows.xml.tmpl +0 -0
  206. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/legend.jrxml +0 -0
  207. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/logo.png +0 -0
  208. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/north.svg +0 -0
  209. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/results.jrxml +0 -0
  210. /c2cgeoportal_geoportal/scaffolds/create/{pyproject.toml → {{cookiecutter.project}}/pyproject.toml} +0 -0
  211. /c2cgeoportal_geoportal/scaffolds/create/{run_alembic.sh → {{cookiecutter.project}}/run_alembic.sh} +0 -0
  212. {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.7.1.157.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  # Copyright (c) 2011-2021, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
@@ -30,15 +28,22 @@
30
28
  import importlib
31
29
  import logging
32
30
  import os
31
+ from functools import partial
32
+ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, cast
33
33
  from urllib.parse import urlsplit
34
34
 
35
35
  import c2cgeoform
36
36
  import c2cwsgiutils
37
37
  import c2cwsgiutils.db
38
38
  import c2cwsgiutils.index
39
+ import pyramid.config
40
+ import pyramid.renderers
41
+ import pyramid.request
42
+ import pyramid.response
39
43
  import pyramid.security
40
44
  import zope.event.classhandler
41
45
  from c2cgeoform import Form, translator
46
+ from c2cwsgiutils.broadcast import decorator
42
47
  from c2cwsgiutils.health_check import HealthCheck
43
48
  from c2cwsgiutils.metrics import MemoryMapProvider, add_provider
44
49
  from dogpile.cache import register_backend
@@ -54,7 +59,7 @@ import c2cgeoportal_geoportal.views
54
59
  from c2cgeoportal_commons.models import InvalidateCacheEvent
55
60
  from c2cgeoportal_geoportal.lib import C2CPregenerator, caching, check_collector, checker
56
61
  from c2cgeoportal_geoportal.lib.cacheversion import version_cache_buster
57
- from c2cgeoportal_geoportal.lib.caching import NO_CACHE, set_common_headers
62
+ from c2cgeoportal_geoportal.lib.common_headers import Cache, set_common_headers
58
63
  from c2cgeoportal_geoportal.lib.i18n import available_locale_names
59
64
  from c2cgeoportal_geoportal.lib.metrics import (
60
65
  MemoryCacheSizeProvider,
@@ -62,7 +67,11 @@ from c2cgeoportal_geoportal.lib.metrics import (
62
67
  TotalPythonObjectMemoryProvider,
63
68
  )
64
69
  from c2cgeoportal_geoportal.lib.xsd import XSD
65
- from c2cgeoportal_geoportal.views.entry import Entry
70
+ from c2cgeoportal_geoportal.views.entry import Entry, canvas_view
71
+
72
+ if TYPE_CHECKING:
73
+ from c2cgeoportal_commons.models import static # pylint: disable=ungrouped-imports,useless-suppression
74
+
66
75
 
67
76
  LOG = logging.getLogger(__name__)
68
77
 
@@ -72,54 +81,132 @@ GEOJSON_CONTENT_TYPE = r"Content-Type:application/geo\+json"
72
81
 
73
82
 
74
83
  class AssetRendererFactory:
75
- def __init__(self, info):
84
+ """Get a renderer for the assets."""
85
+
86
+ def __init__(self, info: Any):
76
87
  del info # unused
77
88
  self.resolver = AssetResolver("c2cgeoportal_geoportal")
78
89
 
79
- def __call__(self, value, system):
90
+ def __call__(self, value: Any, system: Dict[str, str]) -> bytes:
91
+ del value
80
92
  asset = self.resolver.resolve(system["renderer_name"])
81
- return asset.stream().read()
93
+ return cast(bytes, asset.stream().read())
82
94
 
83
95
 
84
96
  INTERFACE_TYPE_NGEO = "ngeo"
97
+ INTERFACE_TYPE_CANVAS = "canvas"
85
98
 
86
99
 
87
- def add_interface(
88
- config, interface_name="desktop", interface_type=INTERFACE_TYPE_NGEO, default=False, **kwargs
89
- ): # pragma: no cover
90
- del interface_type # unused
91
- route = "/" if default else "/{}".format(interface_name)
92
- add_interface_ngeo(
100
+ def add_interface_config(config: pyramid.config.Configurator, interface_config: Dict[str, Any]) -> None:
101
+ """Add the interface (desktop, mobile, ...) views and routes with only the config."""
102
+ add_interface(
93
103
  config,
94
- route_name=interface_name,
95
- route=route,
96
- renderer="/etc/static-ngeo/{}.html".format(interface_name),
97
- **kwargs,
104
+ interface_config["name"],
105
+ interface_config.get("type", INTERFACE_TYPE_NGEO),
106
+ interface_config,
107
+ default=interface_config.get("default", False),
98
108
  )
99
109
 
100
110
 
101
- def add_interface_ngeo(config, route_name, route, renderer=None, permission=None): # pragma: no cover
111
+ def add_interface(
112
+ config: pyramid.config.Configurator,
113
+ interface_name: str = "desktop",
114
+ interface_type: str = INTERFACE_TYPE_NGEO,
115
+ interface_config: Optional[Dict[str, Any]] = None,
116
+ default: bool = False,
117
+ **kwargs: Any,
118
+ ) -> None:
119
+ """Add the interface (desktop, mobile, ...) views and routes."""
120
+ route = "/" if default else f"/{interface_name}"
121
+ if interface_type == INTERFACE_TYPE_NGEO:
122
+ add_interface_ngeo(
123
+ config,
124
+ route_name=interface_name,
125
+ route=route,
126
+ renderer=f"/etc/static-ngeo/{interface_name}.html",
127
+ **kwargs,
128
+ )
129
+ elif interface_type == INTERFACE_TYPE_CANVAS:
130
+ assert interface_config is not None
131
+ add_interface_canvas(
132
+ config,
133
+ route_name=interface_name,
134
+ route=route,
135
+ interface_config=interface_config,
136
+ **kwargs,
137
+ )
138
+ else:
139
+ LOG.error(
140
+ "Unknown interface type '%s', should be '%s' or '%s'.",
141
+ interface_type,
142
+ INTERFACE_TYPE_NGEO,
143
+ INTERFACE_TYPE_CANVAS,
144
+ )
145
+
146
+
147
+ def add_interface_ngeo(
148
+ config: pyramid.config.Configurator,
149
+ route_name: str,
150
+ route: str,
151
+ renderer: Optional[str] = None,
152
+ permission: Optional[str] = None,
153
+ ) -> None:
154
+ """Add the ngeo interfaces views and routes."""
102
155
 
103
156
  config.add_route(route_name, route, request_method="GET")
104
- config.add_view(
105
- Entry, attr="get_ngeo_index_vars", route_name=route_name, renderer=renderer, permission=permission
106
- )
107
157
  # Permalink theme: recover the theme for generating custom viewer.js url
108
158
  config.add_route(
109
- "{}theme".format(route_name),
110
- "{}{}theme/{{themes}}".format(route, "" if route[-1] == "/" else "/"),
159
+ f"{route_name}theme",
160
+ f"{route}{'' if route[-1] == '/' else '/'}theme/{{themes}}",
111
161
  request_method="GET",
112
162
  )
163
+ config.add_view(
164
+ Entry, attr="get_ngeo_index_vars", route_name=route_name, renderer=renderer, permission=permission
165
+ )
113
166
  config.add_view(
114
167
  Entry,
115
168
  attr="get_ngeo_index_vars",
116
- route_name="{}theme".format(route_name),
169
+ route_name=f"{route_name}theme",
117
170
  renderer=renderer,
118
171
  permission=permission,
119
172
  )
120
173
 
121
174
 
122
- def add_admin_interface(config):
175
+ def add_interface_canvas(
176
+ config: pyramid.config.Configurator,
177
+ route_name: str,
178
+ route: str,
179
+ interface_config: Dict[str, Any],
180
+ permission: Optional[str] = None,
181
+ ) -> None:
182
+ """Add the ngeo interfaces views and routes."""
183
+
184
+ renderer = f"/etc/geomapfish/interfaces/{route_name}.html.mako"
185
+ config.add_route(route_name, route, request_method="GET")
186
+ # Permalink theme: recover the theme for generating custom viewer.js URL
187
+ config.add_route(
188
+ f"{route_name}theme",
189
+ f"{route}{'' if route[-1] == '/' else '/'}theme/{{themes}}",
190
+ request_method="GET",
191
+ )
192
+ view = partial(canvas_view, interface_config=interface_config)
193
+ view.__module__ = canvas_view.__module__
194
+ config.add_view(
195
+ view,
196
+ route_name=route_name,
197
+ renderer=renderer,
198
+ permission=permission,
199
+ )
200
+ config.add_view(
201
+ view,
202
+ route_name=f"{route_name}theme",
203
+ renderer=renderer,
204
+ permission=permission,
205
+ )
206
+
207
+
208
+ def add_admin_interface(config: pyramid.config.Configurator) -> None:
209
+ """Add the administration interface views and routes."""
123
210
  if config.get_settings().get("enable_admin_interface", False):
124
211
  config.add_request_method(
125
212
  lambda request: c2cgeoportal_commons.models.DBSession(),
@@ -131,7 +218,8 @@ def add_admin_interface(config):
131
218
  config.include("c2cgeoportal_admin")
132
219
 
133
220
 
134
- def add_getitfixed(config):
221
+ def add_getitfixed(config: pyramid.config.Configurator) -> None:
222
+ """Add the get it fixed views and routes."""
135
223
  if config.get_settings()["getitfixed"].get("enabled", False):
136
224
  for route_name, pattern in (
137
225
  ("getitfixed_add_ending_slash", "/getitfixed"),
@@ -144,8 +232,9 @@ def add_getitfixed(config):
144
232
  Form.set_zpt_renderer(c2cgeoform.default_search_paths, translator=translator)
145
233
 
146
234
 
147
- def locale_negotiator(request):
148
- lang = request.params.get("lang")
235
+ def locale_negotiator(request: pyramid.request.Request) -> str:
236
+ """Get the current language."""
237
+ lang: str = request.params.get("lang")
149
238
  if lang is None:
150
239
  lang = request.cookies.get("_LOCALE_")
151
240
  else:
@@ -159,30 +248,34 @@ def locale_negotiator(request):
159
248
  return lang
160
249
 
161
250
 
162
- def _match_url_start(reference, value):
163
- """
164
- Checks that the val URL starts like the ref URL.
165
- """
251
+ def _match_url_start(reference: str, value: List[str]) -> bool:
252
+ """Check that the val URL starts like the ref URL."""
166
253
  reference_parts = reference.rstrip("/").split("/")
167
- # fmt: off
168
- value_parts = value[0:len(reference_parts)]
169
- # fmt: on
254
+ value_parts = value[0 : len(reference_parts)]
170
255
  return reference_parts == value_parts
171
256
 
172
257
 
173
- def is_valid_referer(request, settings=None):
258
+ def is_valid_referrer(request: pyramid.request.Request, settings: Optional[Dict[str, Any]] = None) -> bool:
259
+ """Check if the referrer is valid."""
174
260
  if request.referer is not None:
175
- referer = urlsplit(request.referer)._replace(query="", fragment="").geturl().rstrip("/").split("/")
261
+ referrer = urlsplit(request.referer)._replace(query="", fragment="").geturl().rstrip("/").split("/")
176
262
  if settings is None:
177
263
  settings = request.registry.settings
178
264
  list_ = settings.get("authorized_referers", [])
179
- return any(_match_url_start(e, referer) for e in list_)
265
+ return any(_match_url_start(e, referrer) for e in list_)
180
266
  return True
181
267
 
182
268
 
183
- def create_get_user_from_request(settings):
184
- def get_user_from_request(request, username=None):
185
- """Return the User object for the request.
269
+ def create_get_user_from_request(
270
+ settings: Dict[str, Any]
271
+ ) -> Callable[[pyramid.request.Request, Optional[str]], Optional["static.User"]]:
272
+ """Get the get_user_from_request function."""
273
+
274
+ def get_user_from_request(
275
+ request: pyramid.request.Request, username: Optional[str] = None
276
+ ) -> Optional["static.User"]:
277
+ """
278
+ Return the User object for the request.
186
279
 
187
280
  Return ``None`` if:
188
281
  * user is anonymous
@@ -193,7 +286,7 @@ def create_get_user_from_request(settings):
193
286
  from c2cgeoportal_commons.models.static import User # pylint: disable=import-outside-toplevel
194
287
 
195
288
  if not hasattr(request, "is_valid_referer"):
196
- request.is_valid_referer = is_valid_referer(request, settings)
289
+ request.is_valid_referer = is_valid_referrer(request, settings)
197
290
  if not request.is_valid_referer:
198
291
  LOG.debug("Invalid referer for %s: %s", request.path_qs, repr(request.referer))
199
292
  return None
@@ -209,13 +302,16 @@ def create_get_user_from_request(settings):
209
302
  DBSession.query(User).filter_by(username=username).options(joinedload("roles")).first()
210
303
  )
211
304
 
212
- return request.user_
305
+ return cast(User, request.user_)
213
306
 
214
307
  return get_user_from_request
215
308
 
216
309
 
217
- def set_user_validator(config, user_validator):
218
- """Call this function to register a user validator function.
310
+ def set_user_validator(
311
+ config: pyramid.config.Configurator, user_validator: Callable[[pyramid.request.Request, str, str], str]
312
+ ) -> None:
313
+ """
314
+ Call this function to register a user validator function.
219
315
 
220
316
  The validator function is passed three arguments: ``request``,
221
317
  ``username``, and ``password``. The function should return the
@@ -231,11 +327,12 @@ def set_user_validator(config, user_validator):
231
327
  config.action("user_validator", register)
232
328
 
233
329
 
234
- def default_user_validator(request, username, password):
330
+ def default_user_validator(request: pyramid.request.Request, username: str, password: str) -> Optional[str]:
235
331
  """
236
- Validate the username/password. This is c2cgeoportal's
237
- default user validator.
238
- Return None if we are anonymous, the string to remember otherwise.
332
+ Validate the username/password.
333
+
334
+ This is c2cgeoportal's default user validator. Return None if we are anonymous, the string to remember
335
+ otherwise.
239
336
  """
240
337
  del request # unused
241
338
  from c2cgeoportal_commons.models import DBSession # pylint: disable=import-outside-toplevel
@@ -243,7 +340,7 @@ def default_user_validator(request, username, password):
243
340
 
244
341
  user = DBSession.query(User).filter_by(username=username).first()
245
342
  if user is None:
246
- LOG.info('Unknow user "%s" tried to log in', username)
343
+ LOG.info('Unknown user "%s" tried to log in', username)
247
344
  return None
248
345
  if user.deactivated:
249
346
  LOG.info('Deactivated user "%s" tried to log in', username)
@@ -258,49 +355,52 @@ def default_user_validator(request, username, password):
258
355
 
259
356
 
260
357
  class MapserverproxyRoutePredicate:
261
- """Serve as a custom route predicate function for mapserverproxy.
262
- If the hide_capabilities setting is set and is true then we want to
263
- return 404s on GetCapabilities requests."""
358
+ """
359
+ Serve as a custom route predicate function for mapserverproxy.
264
360
 
265
- def __init__(self, val, config):
266
- pass
361
+ If the hide_capabilities setting is set and is true then we want to return 404s on GetCapabilities
362
+ requests.
363
+ """
364
+
365
+ def __init__(self, val: Any, config: pyramid.config.Configurator) -> None:
366
+ del val, config
267
367
 
268
- def __call__(self, context, request):
368
+ def __call__(self, context: Any, request: pyramid.request.Request) -> bool:
369
+ del context
269
370
  hide_capabilities = request.registry.settings.get("hide_capabilities")
270
371
  if not hide_capabilities:
271
372
  return True
272
- params = dict((k.lower(), v.lower()) for k, v in request.params.items())
373
+ params = {k.lower(): v.lower() for k, v in request.params.items()}
273
374
  return "request" not in params or params["request"] not in ("getcapabilities", "capabilities")
274
375
 
275
376
  @staticmethod
276
- def text():
377
+ def text() -> str:
277
378
  return "mapserverproxy"
278
379
 
279
380
  phash = text
280
381
 
281
382
 
282
- def add_cors_route(config, pattern, service):
283
- """
284
- Add the OPTIONS route and view need for services supporting CORS.
285
- """
383
+ def add_cors_route(config: pyramid.config.Configurator, pattern: str, service: str) -> None:
384
+ """Add the OPTIONS route and view need for services supporting CORS."""
286
385
 
287
- def view(request): # pragma: no cover
288
- return set_common_headers(request, service, NO_CACHE)
386
+ def view(request: pyramid.request.Request) -> pyramid.response.Response:
387
+ return set_common_headers(request, service, Cache.PRIVATE_NO)
289
388
 
290
389
  name = pattern + "_options"
291
390
  config.add_route(name, pattern, request_method="OPTIONS")
292
391
  config.add_view(view, route_name=name)
293
392
 
294
393
 
295
- def error_handler(http_exception, request): # pragma: no cover
296
- """
297
- View callable for handling all the exceptions that are not already handled.
298
- """
394
+ def error_handler(
395
+ http_exception: HTTPException, request: pyramid.request.Request
396
+ ) -> pyramid.response.Response:
397
+ """View callable for handling all the exceptions that are not already handled."""
299
398
  LOG.warning("%s returned status code %s", request.url, http_exception.status_code)
300
- return caching.set_common_headers(request, "error", caching.NO_CACHE, http_exception)
399
+ return set_common_headers(request, "error", Cache.PRIVATE_NO, http_exception)
301
400
 
302
401
 
303
- def call_hook(settings, name, *args, **kwargs):
402
+ def call_hook(settings: pyramid.config.Configurator, name: str, *args: Any, **kwargs: Any) -> None:
403
+ """Call the hook defined in the settings."""
304
404
  hooks = settings.get("hooks", {})
305
405
  hook = hooks.get(name)
306
406
  if hook is None:
@@ -311,11 +411,8 @@ def call_hook(settings, name, *args, **kwargs):
311
411
  function_(*args, **kwargs)
312
412
 
313
413
 
314
- def includeme(config: pyramid.config.Configurator):
315
- """
316
- This function returns a Pyramid WSGI application.
317
- """
318
-
414
+ def includeme(config: pyramid.config.Configurator) -> None:
415
+ """Get the Pyramid WSGI application."""
319
416
  settings = config.get_settings()
320
417
 
321
418
  if "available_locale_names" not in settings:
@@ -327,7 +424,7 @@ def includeme(config: pyramid.config.Configurator):
327
424
  config.add_request_method(get_user_from_request, name="user", property=True)
328
425
  config.add_request_method(get_user_from_request, name="get_user")
329
426
  # Be able for an organization to override the method to use alternate:
330
- # - Organization roles name for the standard roles 'anonymous', 'registred' and 'intranet'.
427
+ # - Organization roles name for the standard roles 'anonymous', 'registered' and 'intranet'.
331
428
  config.add_request_method(lambda request, role_type: role_type, name="get_organization_role")
332
429
  # - Organization print URL
333
430
  config.add_request_method(
@@ -339,6 +436,7 @@ def includeme(config: pyramid.config.Configurator):
339
436
  # Configure 'locale' dir as the translation dir for c2cgeoportal app
340
437
  config.add_translation_dirs("c2cgeoportal_geoportal:locale/")
341
438
 
439
+ config.include("pyramid_mako")
342
440
  config.include("c2cwsgiutils.pyramid.includeme")
343
441
  health_check = HealthCheck(config)
344
442
  config.registry["health_check"] = health_check
@@ -356,7 +454,7 @@ def includeme(config: pyramid.config.Configurator):
356
454
  add_provider(TotalPythonObjectMemoryProvider())
357
455
 
358
456
  # Initialise DBSessions
359
- init_dbsessions(settings, config, health_check)
457
+ init_db_sessions(settings, config, health_check)
360
458
 
361
459
  checker.init(config, health_check)
362
460
  check_collector.init(config, health_check)
@@ -370,8 +468,8 @@ def includeme(config: pyramid.config.Configurator):
370
468
  for name, cache_config in settings["cache"].items():
371
469
  caching.init_region(cache_config, name)
372
470
 
373
- @zope.event.classhandler.handler(InvalidateCacheEvent)
374
- def handle(event: InvalidateCacheEvent): # pylint: disable=unused-variable
471
+ @zope.event.classhandler.handler(InvalidateCacheEvent) # type: ignore
472
+ def handle(event: InvalidateCacheEvent) -> None:
375
473
  del event
376
474
  caching.invalidate_region()
377
475
  if caching.MEMORY_CACHE_DICT:
@@ -380,7 +478,7 @@ def includeme(config: pyramid.config.Configurator):
380
478
 
381
479
  # Register a tween to get back the cache buster path.
382
480
  if "cache_path" not in config.get_settings():
383
- config.get_settings()["cache_path"] = ["static"]
481
+ config.get_settings()["cache_path"] = ["static", "static-geomapfish"]
384
482
  config.add_tween("c2cgeoportal_geoportal.lib.cacheversion.CachebusterTween")
385
483
  config.add_tween("c2cgeoportal_geoportal.lib.headers.HeadersTween")
386
484
 
@@ -420,6 +518,22 @@ def includeme(config: pyramid.config.Configurator):
420
518
  pregenerator=C2CPregenerator(role=True),
421
519
  request_method="POST",
422
520
  )
521
+ # The tow next views are used to serve the application on the URL /mapserv_proxy/<ogc server name>
522
+ # instead of /mapserv_proxy?ogcserver=<ogc server name>, required for QGIS server landing page
523
+ config.add_route(
524
+ "mapserverproxy_get_path",
525
+ "/mapserv_proxy/{ogcserver}/*path",
526
+ mapserverproxy=True,
527
+ pregenerator=C2CPregenerator(role=True),
528
+ request_method="GET",
529
+ )
530
+ config.add_route(
531
+ "mapserverproxy_post_path",
532
+ "/mapserv_proxy/{ogcserver}/*path",
533
+ mapserverproxy=True,
534
+ pregenerator=C2CPregenerator(role=True),
535
+ request_method="POST",
536
+ )
423
537
  add_cors_route(config, "/mapserv_proxy", "mapserver")
424
538
 
425
539
  # Add route to the tinyows proxy
@@ -444,14 +558,15 @@ def includeme(config: pyramid.config.Configurator):
444
558
  config.add_renderer(".css", AssetRendererFactory)
445
559
  config.add_renderer(".ico", AssetRendererFactory)
446
560
  config.add_route("localejson", "/locale.json", request_method="GET")
561
+ config.add_route("localepot", "/locale.pot", request_method="GET")
447
562
 
448
- def add_static_route(name: str, attr: str, path: str, renderer: str):
563
+ def add_static_route(name: str, attr: str, path: str, renderer: str) -> None:
449
564
  config.add_route(name, path, request_method="GET")
450
565
  config.add_view(Entry, attr=attr, route_name=name, renderer=renderer)
451
566
 
452
567
  add_static_route("favicon", "favicon", "/favicon.ico", "/etc/geomapfish/static/images/favicon.ico")
453
568
  add_static_route("robot.txt", "robot_txt", "/robot.txt", "/etc/geomapfish/static/robot.txt")
454
- add_static_route("apijs", "apijs", "/api.js", "/etc/static-ngeo/api.js")
569
+ config.add_route("apijs", "/api.js", request_method="GET")
455
570
  add_static_route("apijsmap", "apijsmap", "/api.js.map", "/etc/static-ngeo/api.js.map")
456
571
  add_static_route("apicss", "apicss", "/api.css", "/etc/static-ngeo/api.css")
457
572
  add_static_route("apihelp", "apihelp", "/apihelp/index.html", "/etc/geomapfish/static/apihelp/index.html")
@@ -491,6 +606,13 @@ def includeme(config: pyramid.config.Configurator):
491
606
  add_cors_route(config, "/profile.json", "profile")
492
607
  config.add_route("profile.json", "/profile.json", request_method="POST")
493
608
 
609
+ # Access to vector tiles
610
+ add_cors_route(config, "/vector_tiles", "vector_tiles")
611
+ config.add_route("vector_tiles", "/vector_tiles/{layer_name}/{z}/{x}/{y}.pbf", request_method="GET")
612
+ # There is no view corresponding to that route, it is to be used from
613
+ # mako templates to get the root of the "vector_tiles" web service
614
+ config.add_route("vector_tiles_root", "/vector_tiles", request_method="HEAD")
615
+
494
616
  # Shortener
495
617
  add_cors_route(config, "/short/create", "shortener")
496
618
  config.add_route("shortener_create", "/short/create", request_method="POST")
@@ -571,6 +693,21 @@ def includeme(config: pyramid.config.Configurator):
571
693
  cache_max_age=int(config.get_settings()["default_max_age"]),
572
694
  )
573
695
 
696
+ # Add the c2cgeoportal static view with cache buster
697
+ config.add_static_view(
698
+ name="static-geomapfish",
699
+ path="c2cgeoportal_geoportal:static",
700
+ cache_max_age=int(config.get_settings()["default_max_age"]),
701
+ )
702
+ config.add_cache_buster("c2cgeoportal_geoportal:static", version_cache_buster)
703
+
704
+ # Add the project static view without cache buster
705
+ config.add_static_view(
706
+ name="static-ngeo-dist",
707
+ path="/opt/c2cgeoportal/geoportal/node_modules/ngeo/dist",
708
+ cache_max_age=int(config.get_settings()["default_max_age"]),
709
+ )
710
+
574
711
  # Handles the other HTTP errors raised by the views. Without that,
575
712
  # the client receives a status=200 without content.
576
713
  config.add_view(error_handler, context=HTTPException)
@@ -603,7 +740,10 @@ def includeme(config: pyramid.config.Configurator):
603
740
  c2cwsgiutils.index.additional_noauth.append("</div></div><hr>")
604
741
 
605
742
 
606
- def init_dbsessions(settings: dict, config: Configurator, health_check: HealthCheck = None) -> None:
743
+ def init_db_sessions(
744
+ settings: Dict[str, Any], config: Configurator, health_check: Optional[HealthCheck] = None
745
+ ) -> None:
746
+ """Initialize the database sessions."""
607
747
  db_chooser = settings.get("db_chooser", {})
608
748
  master_paths = [i.replace("//", "/") for i in db_chooser.get("master", [])]
609
749
  slave_paths = [i.replace("//", "/") for i in db_chooser.get("slave", [])]
@@ -644,7 +784,7 @@ def init_dbsessions(settings: dict, config: Configurator, health_check: HealthCh
644
784
  version_schema=settings["schema_static"],
645
785
  level=1,
646
786
  )
647
- else: # pragma: no cover
787
+ else:
648
788
 
649
789
  def check(session_: Session) -> None:
650
790
  session_.execute("SELECT 1")