c2cgeoportal-geoportal 2.6.0__py2.py3-none-any.whl → 2.8.1.180__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 (225) hide show
  1. c2cgeoportal_geoportal/__init__.py +245 -95
  2. c2cgeoportal_geoportal/lib/__init__.py +67 -43
  3. c2cgeoportal_geoportal/lib/authentication.py +50 -26
  4. c2cgeoportal_geoportal/lib/bashcolor.py +17 -13
  5. c2cgeoportal_geoportal/lib/cacheversion.py +16 -8
  6. c2cgeoportal_geoportal/lib/caching.py +65 -193
  7. c2cgeoportal_geoportal/lib/check_collector.py +17 -10
  8. c2cgeoportal_geoportal/lib/checker.py +67 -65
  9. c2cgeoportal_geoportal/lib/common_headers.py +167 -0
  10. c2cgeoportal_geoportal/lib/dbreflection.py +61 -46
  11. c2cgeoportal_geoportal/lib/filter_capabilities.py +126 -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 +363 -240
  18. c2cgeoportal_geoportal/lib/loader.py +11 -16
  19. c2cgeoportal_geoportal/lib/metrics.py +28 -17
  20. c2cgeoportal_geoportal/lib/oauth2.py +392 -206
  21. c2cgeoportal_geoportal/lib/wmstparsing.py +105 -84
  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} +22 -15
  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 +100 -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/{create/geoportal/setup.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/setup.py} +6 -7
  36. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/tsconfig.json +8 -0
  37. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.api.js +77 -0
  38. c2cgeoportal_geoportal/scaffolds/{create/geoportal/webpack.apps.js_tmpl → advance_create/{{cookiecutter.project}}/geoportal/webpack.apps.js} +29 -28
  39. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/webpack.commons.js +4 -7
  40. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/webpack.config.js +1 -1
  41. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py +42 -0
  42. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/authentication.py +10 -0
  43. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/dev.py +14 -0
  44. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/models.py +8 -0
  45. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_organization.py +7 -0
  46. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/resources.py +4 -3
  47. 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
  48. 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
  49. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal/subscribers.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/subscribers.py} +1 -3
  50. c2cgeoportal_geoportal/scaffolds/advance_update/cookiecutter.json +18 -0
  51. c2cgeoportal_geoportal/scaffolds/{update/geoportal/CONST_Makefile_tmpl → advance_update/{{cookiecutter.project}}/geoportal/CONST_Makefile} +3 -27
  52. c2cgeoportal_geoportal/scaffolds/create/cookiecutter.json +18 -0
  53. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.dockerignore +14 -0
  54. c2cgeoportal_geoportal/scaffolds/create/{+dot+editorconfig → {{cookiecutter.project}}/.editorconfig} +2 -5
  55. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/main.yaml +57 -0
  56. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/rebuild.yaml +46 -0
  57. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/update_l10n.yaml +66 -0
  58. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.gitignore +16 -0
  59. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierignore +1 -0
  60. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierrc.yaml +2 -0
  61. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Dockerfile +76 -0
  62. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Makefile +70 -0
  63. c2cgeoportal_geoportal/scaffolds/create/{README.rst_tmpl → {{cookiecutter.project}}/README.rst} +4 -4
  64. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/build +186 -0
  65. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/config.yaml +22 -0
  66. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/docker-compose-check +25 -0
  67. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/requirements.txt +1 -0
  68. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-db.yaml +26 -0
  69. c2cgeoportal_geoportal/scaffolds/create/{docker-compose-lib.yaml → {{cookiecutter.project}}/docker-compose-lib.yaml} +165 -22
  70. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-qgis.yaml +23 -0
  71. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose.override.sample.yaml +66 -0
  72. c2cgeoportal_geoportal/scaffolds/create/{docker-compose.yaml → {{cookiecutter.project}}/docker-compose.yaml} +20 -15
  73. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.default +101 -0
  74. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.project +69 -0
  75. c2cgeoportal_geoportal/scaffolds/create/{geoportal/vars.yaml_tmpl → {{cookiecutter.project}}/geoportal/vars.yaml} +126 -36
  76. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/mobile.css +0 -0
  77. c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/data/Readme.txt +3 -3
  78. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/demo.map.tmpl +224 -0
  79. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/mapserver.conf +15 -0
  80. c2cgeoportal_geoportal/scaffolds/create/{mapserver/mapserver.map.tmpl_tmpl → {{cookiecutter.project}}/mapserver/mapserver.map.tmpl} +9 -18
  81. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Landscape.jrxml +13 -8
  82. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Portrait.jrxml +13 -8
  83. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Landscape.jrxml +13 -8
  84. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Portrait.jrxml +13 -8
  85. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/config.yaml.tmpl +11 -4
  86. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/localisation.properties +4 -0
  87. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/localisation_fr.properties +4 -0
  88. c2cgeoportal_geoportal/scaffolds/create/{project.yaml_tmpl → {{cookiecutter.project}}/project.yaml} +6 -6
  89. c2cgeoportal_geoportal/scaffolds/create/{pyproject.toml → {{cookiecutter.project}}/pyproject.toml} +4 -0
  90. c2cgeoportal_geoportal/scaffolds/create/{qgisserver/pg_service.conf.tmpl_tmpl → {{cookiecutter.project}}/qgisserver/pg_service.conf.tmpl} +2 -2
  91. c2cgeoportal_geoportal/scaffolds/create/{run_alembic.sh → {{cookiecutter.project}}/run_alembic.sh} +3 -5
  92. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-backup +110 -0
  93. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-restore +114 -0
  94. c2cgeoportal_geoportal/scaffolds/create/{setup.cfg_tmpl → {{cookiecutter.project}}/setup.cfg} +1 -1
  95. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/spell-ignore-words.txt +5 -0
  96. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tests/__init__.py +0 -0
  97. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tests/test_app.py +38 -0
  98. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tilegeneration/config.yaml.tmpl +195 -0
  99. c2cgeoportal_geoportal/scaffolds/update/cookiecutter.json +18 -0
  100. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/.upgrade.yaml +61 -0
  101. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_CHANGELOG.txt +273 -0
  102. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_create_template/tests/test_testapp.py +48 -0
  103. c2cgeoportal_geoportal/scaffolds/update/{geoportal → {{cookiecutter.project}}/geoportal}/CONST_config-schema.yaml +64 -17
  104. c2cgeoportal_geoportal/scaffolds/update/{geoportal/CONST_vars.yaml_tmpl → {{cookiecutter.project}}/geoportal/CONST_vars.yaml} +396 -19
  105. c2cgeoportal_geoportal/scripts/__init__.py +16 -30
  106. c2cgeoportal_geoportal/scripts/c2cupgrade.py +272 -234
  107. c2cgeoportal_geoportal/scripts/create_demo_theme.py +3 -6
  108. c2cgeoportal_geoportal/scripts/manage_users.py +34 -39
  109. c2cgeoportal_geoportal/scripts/pcreate.py +310 -0
  110. c2cgeoportal_geoportal/scripts/theme2fts.py +128 -24
  111. c2cgeoportal_geoportal/scripts/urllogin.py +19 -11
  112. c2cgeoportal_geoportal/templates/login.html +88 -84
  113. c2cgeoportal_geoportal/templates/notlogin.html +59 -59
  114. c2cgeoportal_geoportal/templates/testi18n.html +6 -8
  115. c2cgeoportal_geoportal/views/__init__.py +23 -6
  116. c2cgeoportal_geoportal/views/dev.py +9 -7
  117. c2cgeoportal_geoportal/views/dynamic.py +56 -19
  118. c2cgeoportal_geoportal/views/entry.py +85 -24
  119. c2cgeoportal_geoportal/views/fulltextsearch.py +29 -23
  120. c2cgeoportal_geoportal/views/geometry_processing.py +17 -9
  121. c2cgeoportal_geoportal/views/i18n.py +91 -9
  122. c2cgeoportal_geoportal/views/layers.py +166 -133
  123. c2cgeoportal_geoportal/views/login.py +161 -93
  124. c2cgeoportal_geoportal/views/mapserverproxy.py +47 -31
  125. c2cgeoportal_geoportal/views/memory.py +12 -12
  126. c2cgeoportal_geoportal/views/ogcproxy.py +52 -30
  127. c2cgeoportal_geoportal/views/pdfreport.py +30 -26
  128. c2cgeoportal_geoportal/views/printproxy.py +60 -52
  129. c2cgeoportal_geoportal/views/profile.py +24 -23
  130. c2cgeoportal_geoportal/views/proxy.py +88 -72
  131. c2cgeoportal_geoportal/views/raster.py +37 -26
  132. c2cgeoportal_geoportal/views/resourceproxy.py +13 -11
  133. c2cgeoportal_geoportal/views/shortener.py +27 -25
  134. c2cgeoportal_geoportal/views/theme.py +472 -332
  135. c2cgeoportal_geoportal/views/tinyowsproxy.py +42 -44
  136. c2cgeoportal_geoportal/views/vector_tiles.py +80 -0
  137. {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.8.1.180.dist-info}/METADATA +19 -8
  138. c2cgeoportal_geoportal-2.8.1.180.dist-info/RECORD +191 -0
  139. {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.8.1.180.dist-info}/WHEEL +1 -1
  140. {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.8.1.180.dist-info}/entry_points.txt +3 -0
  141. tests/__init__.py +10 -5
  142. tests/test_cachebuster.py +3 -5
  143. tests/test_caching.py +18 -26
  144. tests/test_checker.py +1 -3
  145. tests/test_decimaljson.py +5 -5
  146. tests/test_headerstween.py +1 -3
  147. tests/test_i18n.py +2 -2
  148. tests/test_init.py +16 -20
  149. tests/test_locale_negociator.py +4 -6
  150. tests/test_mapserverproxy_route_predicate.py +1 -4
  151. tests/test_raster.py +15 -17
  152. tests/test_wmstparsing.py +10 -12
  153. tests/xmlstr.py +1 -3
  154. c2cgeoportal_geoportal/scaffolds/__init__.py +0 -227
  155. c2cgeoportal_geoportal/scaffolds/create/+dot+dockerignore_tmpl +0 -12
  156. c2cgeoportal_geoportal/scaffolds/create/+dot+github/workflows/main.yaml_tmpl +0 -89
  157. c2cgeoportal_geoportal/scaffolds/create/+dot+github/workflows/rebuild.yaml_tmpl +0 -78
  158. c2cgeoportal_geoportal/scaffolds/create/+dot+gitignore_tmpl +0 -16
  159. c2cgeoportal_geoportal/scaffolds/create/Dockerfile_tmpl +0 -67
  160. c2cgeoportal_geoportal/scaffolds/create/Makefile +0 -3
  161. c2cgeoportal_geoportal/scaffolds/create/build_tmpl +0 -167
  162. c2cgeoportal_geoportal/scaffolds/create/ci/config.yaml_tmpl +0 -23
  163. c2cgeoportal_geoportal/scaffolds/create/ci/requirements.txt +0 -1
  164. c2cgeoportal_geoportal/scaffolds/create/ci/trigger +0 -68
  165. c2cgeoportal_geoportal/scaffolds/create/docker-compose.override.sample.yaml +0 -54
  166. c2cgeoportal_geoportal/scaffolds/create/env.default_tmpl +0 -67
  167. c2cgeoportal_geoportal/scaffolds/create/env.project_tmpl +0 -48
  168. c2cgeoportal_geoportal/scaffolds/create/geoportal/+dot+dockerignore_tmpl +0 -6
  169. c2cgeoportal_geoportal/scaffolds/create/geoportal/+dot+eslintrc_tmpl +0 -15
  170. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/__init__.py_tmpl +0 -58
  171. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/models.py_tmpl +0 -10
  172. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static/robot.txt +0 -3
  173. c2cgeoportal_geoportal/scaffolds/create/geoportal/production.ini_tmpl +0 -106
  174. c2cgeoportal_geoportal/scaffolds/create/geoportal/tools/extract-messages.js +0 -39
  175. c2cgeoportal_geoportal/scaffolds/create/geoportal/tsconfig.json_tmpl +0 -9
  176. c2cgeoportal_geoportal/scaffolds/create/geoportal/webpack.api.js_tmpl +0 -72
  177. c2cgeoportal_geoportal/scaffolds/create/mapserver/demo.map.tmpl_tmpl +0 -262
  178. c2cgeoportal_geoportal/scaffolds/create/mapserver/tinyows.xml +0 -36
  179. c2cgeoportal_geoportal/scaffolds/create/print/print-apps/+package+/config.yaml +0 -168
  180. c2cgeoportal_geoportal/scaffolds/create/qgisserver/geomapfish.yaml.tmpl_tmpl +0 -16
  181. c2cgeoportal_geoportal/scaffolds/create/spell-ignore-words.txt +0 -1
  182. c2cgeoportal_geoportal/scaffolds/create/tilegeneration/config.yaml.tmpl_tmpl +0 -185
  183. c2cgeoportal_geoportal/scaffolds/create/yamllint.yaml +0 -11
  184. c2cgeoportal_geoportal/scaffolds/update/+dot+upgrade.yaml_tmpl +0 -181
  185. c2cgeoportal_geoportal/scaffolds/update/CONST_CHANGELOG.txt_tmpl +0 -454
  186. c2cgeoportal_geoportal/templates/dynamic.js +0 -21
  187. c2cgeoportal_geoportal-2.6.0.dist-info/RECORD +0 -173
  188. /c2cgeoportal_geoportal/{scaffolds/create/geoportal/+package+_geoportal/static/css/desktop.css → py.typed} +0 -0
  189. /c2cgeoportal_geoportal/scaffolds/{create/geoportal/Makefile_tmpl → advance_create/{{cookiecutter.project}}/geoportal/Makefile} +0 -0
  190. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/alembic.ini +0 -0
  191. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/language_mapping +0 -0
  192. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/lingua-server.cfg +0 -0
  193. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/requirements.txt +0 -0
  194. /c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/views/__init__.py +0 -0
  195. /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
  196. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal/static/css/iframe_api.css → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/desktop.css} +0 -0
  197. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal/static/css/mobile.css → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/iframe_api.css} +0 -0
  198. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/banner_left.png +0 -0
  199. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/banner_right.png +0 -0
  200. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/blank.png +0 -0
  201. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker-blue.png +0 -0
  202. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker-gold.png +0 -0
  203. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker-green.png +0 -0
  204. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker.png +0 -0
  205. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/robot.txt.tmpl +0 -0
  206. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/data/TM_EUROPE_BORDERS-0.3.sql +0 -0
  207. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arial.ttf +0 -0
  208. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arialbd.ttf +0 -0
  209. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arialbi.ttf +0 -0
  210. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Ariali.ttf +0 -0
  211. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Bold.ttf +0 -0
  212. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-BoldItalic.ttf +0 -0
  213. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Italic.ttf +0 -0
  214. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Regular.ttf +0 -0
  215. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdana.ttf +0 -0
  216. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanab.ttf +0 -0
  217. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanai.ttf +0 -0
  218. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanaz.ttf +0 -0
  219. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts.conf +0 -0
  220. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/tinyows.xml.tmpl +0 -0
  221. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/legend.jrxml +0 -0
  222. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/logo.png +0 -0
  223. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/north.svg +0 -0
  224. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/results.jrxml +0 -0
  225. {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.8.1.180.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- # Copyright (c) 2012-2020, Camptocamp SA
1
+ # Copyright (c) 2012-2023, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
6
4
  # Redistribution and use in source and binary forms, with or without
@@ -30,89 +28,94 @@
30
28
 
31
29
  import inspect
32
30
  import logging
33
- from typing import Any, Dict, List
31
+ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional
34
32
 
35
- from dogpile.cache.api import NO_VALUE
33
+ import pyramid.interfaces
34
+ import sqlalchemy.ext.declarative
35
+ import zope.interface
36
+ from dogpile.cache.api import NO_VALUE, CacheBackend
37
+ from dogpile.cache.backends.memory import MemoryBackend
36
38
  from dogpile.cache.backends.redis import RedisBackend, RedisSentinelBackend
37
- from dogpile.cache.region import make_region
39
+ from dogpile.cache.region import CacheRegion, make_region
38
40
  from dogpile.cache.util import sha1_mangle_key
39
- from pyramid.request import Request
40
41
  from sqlalchemy.orm.util import identity_key
41
42
 
42
43
  from c2cgeoportal_commons.models import Base
43
44
 
45
+ if TYPE_CHECKING:
46
+ from dogpile.cache.api import SerializedReturnType
47
+ else:
48
+ SerializedReturnType = Any
49
+
44
50
  LOG = logging.getLogger(__name__)
45
51
  _REGION: Dict[str, Any] = {}
46
52
  MEMORY_CACHE_DICT: Dict[str, Any] = {}
47
53
 
48
54
 
49
- def map_dbobject(item):
50
-
55
+ def map_dbobject(
56
+ item: sqlalchemy.ext.declarative.ConcreteBase,
57
+ ) -> sqlalchemy.ext.declarative.ConcreteBase:
58
+ """Get an cache identity key for the cache."""
51
59
  return identity_key(item) if isinstance(item, Base) else item
52
60
 
53
61
 
54
- def keygen_function(namespace, function):
62
+ def keygen_function(namespace: Any, function: Callable[..., Any]) -> Callable[..., str]:
55
63
  """
56
- Return a function that generates a string
57
- key, based on a given function as well as
58
- arguments to the returned function itself.
64
+ Return a function that generates a string key.
65
+
66
+ Based on a given function as well as arguments to the returned function itself.
59
67
 
60
- This is used by :meth:`.CacheRegion.cache_on_arguments`
61
- to generate a cache key from a decorated function.
68
+ This is used by :meth:`.CacheRegion.cache_on_arguments` to generate a cache key from a decorated function.
62
69
  """
63
70
 
64
71
  if namespace is None:
65
72
  namespace = (function.__module__, function.__name__)
66
- else: # pragma: no cover
73
+ else:
67
74
  namespace = (function.__module__, function.__name__, namespace)
68
75
 
69
76
  args = inspect.getfullargspec(function)
70
77
  ignore_first_argument = args[0] and args[0][0] in ("self", "cls")
71
78
 
72
- def generate_key(*args, **kw):
73
- if kw: # pragma: no cover
79
+ def generate_key(*args: Any, **kw: Any) -> str:
80
+ if kw:
74
81
  raise ValueError("key creation function does not accept keyword arguments.")
75
82
  parts: List[str] = []
76
83
  parts.extend(namespace)
77
84
  if ignore_first_argument:
78
85
  args = args[1:]
79
- new_args: List[str] = [arg for arg in args if not isinstance(arg, Request)]
86
+ new_args: List[str] = [
87
+ arg for arg in args if pyramid.interfaces.IRequest not in zope.interface.implementedBy(type(arg))
88
+ ]
80
89
  parts.extend(map(str, map(map_dbobject, new_args)))
81
90
  return "|".join(parts)
82
91
 
83
92
  return generate_key
84
93
 
85
94
 
86
- def init_region(conf, region):
87
- """
88
- Initialize the caching module.
89
- """
95
+ def init_region(conf: Dict[str, Any], region: str) -> CacheRegion:
96
+ """Initialize the caching module."""
90
97
  cache_region = get_region(region)
91
98
  _configure_region(conf, cache_region)
92
99
  return cache_region
93
100
 
94
101
 
95
- def _configure_region(conf, cache_region):
96
- global MEMORY_CACHE_DICT
97
- kwargs = {"replace_existing_backend": True}
102
+ def _configure_region(conf: Dict[str, Any], cache_region: CacheRegion) -> None:
103
+ kwargs: Dict[str, Any] = {"replace_existing_backend": True}
98
104
  backend = conf["backend"]
99
105
  kwargs.update({k: conf[k] for k in conf if k != "backend"})
100
- kwargs.setdefault("arguments", {}) # type: ignore
101
- kwargs["arguments"]["cache_dict"] = MEMORY_CACHE_DICT # type: ignore
106
+ kwargs.setdefault("arguments", {}).setdefault("cache_dict", MEMORY_CACHE_DICT)
102
107
  cache_region.configure(backend, **kwargs)
103
108
 
104
109
 
105
- def get_region(region):
106
- """
107
- Return a cache region.
108
- """
109
- global _REGION
110
+ def get_region(region: str) -> CacheRegion:
111
+ """Return a cache region."""
110
112
  if region not in _REGION:
111
113
  _REGION[region] = make_region(function_key_generator=keygen_function)
112
114
  return _REGION[region]
113
115
 
114
116
 
115
- def invalidate_region(region=None):
117
+ def invalidate_region(region: Optional[str] = None) -> None:
118
+ """Invalidate a cache region."""
116
119
  if region is None:
117
120
  for cache_region in _REGION.values():
118
121
  cache_region.invalidate()
@@ -120,180 +123,49 @@ def invalidate_region(region=None):
120
123
  get_region(region).invalidate()
121
124
 
122
125
 
123
- class HybridRedisBackend(RedisBackend):
124
- """
125
- A memory and redis backend
126
- """
126
+ class HybridRedisBackend(CacheBackend): # type: ignore
127
+ """A Dogpile cache backend with a memory cache backend in front of a Redis backend for performance."""
127
128
 
128
- def __init__(self, arguments):
129
- self._cache = arguments.pop("cache_dict", {})
129
+ def __init__(self, arguments: Dict[str, Any]):
130
130
  self._use_memory_cache = not arguments.pop("disable_memory_cache", False)
131
+ self._memory = MemoryBackend({"cache_dict": arguments.pop("cache_dict", {})})
132
+ self._redis = RedisBackend(arguments)
131
133
 
132
- super().__init__(arguments)
133
-
134
- def get(self, key):
135
- value = self._cache.get(key, NO_VALUE)
134
+ def get(self, key: str) -> SerializedReturnType:
135
+ value = self._memory.get(key)
136
136
  if value == NO_VALUE:
137
- value = super().get(sha1_mangle_key(key.encode()))
138
- if value != NO_VALUE and self._use_memory_cache:
139
- self._cache[key] = value
137
+ val = self._redis.get_serialized(sha1_mangle_key(key.encode()))
138
+ if val in (None, NO_VALUE):
139
+ return NO_VALUE
140
+ value = self._redis.deserializer(val)
141
+ if value != NO_VALUE and self._use_memory_cache:
142
+ self._memory.set(key, value)
140
143
  return value
141
144
 
142
- def get_multi(self, keys):
145
+ def get_multi(self, keys: List[str]) -> List[SerializedReturnType]:
143
146
  return [self.get(key) for key in keys]
144
147
 
145
- def set(self, key, value):
148
+ def set(self, key: str, value: SerializedReturnType) -> None:
146
149
  if self._use_memory_cache:
147
- self._cache[key] = value
148
- super().set(sha1_mangle_key(key.encode()), value)
150
+ self._memory.set(key, value)
151
+ self._redis.set_serialized(sha1_mangle_key(key.encode()), self._redis.serializer(value))
149
152
 
150
- def set_multi(self, mapping):
153
+ def set_multi(self, mapping: Dict[str, SerializedReturnType]) -> None:
151
154
  for key, value in mapping.items():
152
155
  self.set(key, value)
153
156
 
154
- def delete(self, key):
155
- self._cache.pop(key, None)
156
- super().delete(key)
157
+ def delete(self, key: str) -> None:
158
+ self._memory.delete(key)
159
+ self._redis.delete(key)
157
160
 
161
+ def delete_multi(self, keys: List[str]) -> None:
162
+ self._memory.delete_multi(keys)
163
+ self._redis.delete_multi(keys)
158
164
 
159
- class HybridRedisSentinelBackend(RedisSentinelBackend):
160
- """
161
- A memory and redis sentinel backend
162
- """
163
165
 
164
- def __init__(self, arguments):
165
- self._cache = arguments.pop("cache_dict", {})
166
- self._use_memory_cache = not arguments.pop("disable_memory_cache", False)
166
+ class HybridRedisSentinelBackend(HybridRedisBackend):
167
+ """Same as HybridRedisBackend but using the Redis Sentinel."""
167
168
 
169
+ def __init__(self, arguments: Dict[str, Any]):
168
170
  super().__init__(arguments)
169
-
170
- def get(self, key):
171
- value = self._cache.get(key, NO_VALUE)
172
- if value == NO_VALUE:
173
- value = super().get(sha1_mangle_key(key.encode()))
174
- if value != NO_VALUE and self._use_memory_cache:
175
- self._cache[key] = value
176
- return value
177
-
178
- def get_multi(self, keys):
179
- return [self.get(key) for key in keys]
180
-
181
- def set(self, key, value):
182
- if self._use_memory_cache:
183
- self._cache[key] = value
184
- super().set(sha1_mangle_key(key.encode()), value)
185
-
186
- def set_multi(self, mapping):
187
- for key, value in mapping.items():
188
- self.set(key, value)
189
-
190
- def delete(self, key):
191
- self._cache.pop(key, None)
192
- super().delete(key)
193
-
194
-
195
- NO_CACHE = 0
196
- PUBLIC_CACHE = 1
197
- PRIVATE_CACHE = 2
198
-
199
- CORS_METHODS = "HEAD, GET, POST, PUT, DELETE"
200
-
201
-
202
- def _set_cors_headers(request, response, service_name, service_headers_settings, credentials):
203
- """
204
- Handle CORS requests, as specified in https://www.w3.org/TR/cors/
205
- """
206
- response.vary = (response.vary or ()) + ("Origin",)
207
-
208
- if "Origin" not in request.headers:
209
- return # Not a CORS request if this header is missing
210
- origin = request.headers["Origin"]
211
-
212
- if request.method == "OPTIONS" and "Access-Control-Request-Method" not in request.headers:
213
- LOG.warning("CORS preflight query missing the Access-Control-Request-Method header")
214
- return
215
-
216
- allowed_origins = service_headers_settings.get("access_control_allow_origin", [])
217
- if origin not in allowed_origins:
218
- if "*" in allowed_origins:
219
- origin = "*"
220
- credentials = False # Force no credentials
221
- else:
222
- LOG.warning("CORS query not allowed for origin=%s, service=%s", origin, service_name)
223
- return
224
-
225
- response.headers.update(
226
- {"Access-Control-Allow-Origin": origin, "Access-Control-Allow-Methods": CORS_METHODS}
227
- )
228
-
229
- max_age = service_headers_settings.get("access_control_max_age", 3600)
230
- response.headers["Access-Control-Max-Age"] = str(max_age)
231
-
232
- if credentials:
233
- response.headers["Access-Control-Allow-Credentials"] = "true"
234
-
235
- if request.method != "OPTIONS":
236
- return
237
-
238
- response.cache_control.max_age = max_age
239
-
240
- if not service_headers_settings or "access_control_allow_origin" not in service_headers_settings:
241
- LOG.warning("CORS query not configured for service=%s", service_name)
242
- return
243
-
244
- requested_headers = request.headers.get("Access-Control-Request-Headers", False)
245
- if requested_headers:
246
- # For the moment, we allow all requested headers
247
- response.headers["Access-Control-Allow-Headers"] = requested_headers
248
-
249
- # If we start using headers in responses, we'll have to add
250
- # Access-Control-Expose-Headers
251
-
252
-
253
- def _set_common_headers(request, response, service_headers_settings, cache, content_type):
254
- """
255
- Set the common headers
256
- """
257
-
258
- response.headers.update(service_headers_settings.get("headers", {}))
259
-
260
- if cache == NO_CACHE:
261
- response.cache_control.no_cache = True
262
- response.cache_control.max_age = 0
263
- elif cache == PUBLIC_CACHE:
264
- response.cache_control.public = True
265
- elif cache == PRIVATE_CACHE:
266
- if request.user is not None:
267
- response.cache_control.private = True
268
- else:
269
- response.cache_control.public = True
270
- else: # pragma: no cover
271
- raise Exception("Invalid cache type")
272
-
273
- if cache != NO_CACHE:
274
- max_age = service_headers_settings.get("cache_control_max_age", 3600)
275
-
276
- response.cache_control.max_age = max_age
277
- if max_age == 0:
278
- response.cache_control.no_cache = True
279
-
280
- if content_type is not None:
281
- response.content_type = content_type
282
-
283
- return response
284
-
285
-
286
- def set_common_headers(request, service_name, cache, response=None, credentials=True, content_type=None):
287
- """
288
- Set the common headers
289
- """
290
- if response is None:
291
- response = request.response
292
-
293
- headers_settings = request.registry.settings.get("headers", {})
294
- service_headers_settings = headers_settings.get(service_name, {})
295
-
296
- _set_cors_headers(request, response, service_name, service_headers_settings, credentials)
297
- if request.method == "OPTIONS":
298
- return response
299
- return _set_common_headers(request, response, service_headers_settings, cache, content_type)
171
+ self._redis = RedisSentinelBackend(arguments)
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- # Copyright (c) 2011-2020, Camptocamp SA
1
+ # Copyright (c) 2011-2021, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
6
4
  # Redistribution and use in source and binary forms, with or without
@@ -27,8 +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
  import logging
30
- from typing import Any
28
+ from typing import Any, Dict, Optional, cast
31
29
 
30
+ import c2cwsgiutils.health_check
31
+ import pyramid.config
32
+ import pyramid.request
32
33
  import requests
33
34
 
34
35
  from c2cgeoportal_geoportal.lib.checker import build_url
@@ -36,7 +37,12 @@ from c2cgeoportal_geoportal.lib.checker import build_url
36
37
  LOG = logging.getLogger(__name__)
37
38
 
38
39
 
39
- def init(config, health_check):
40
+ def init(config: pyramid.config.Configurator, health_check: c2cwsgiutils.health_check.HealthCheck) -> None:
41
+ """
42
+ Initialize the check collector.
43
+
44
+ Add him in the c2cwsgichecks.
45
+ """
40
46
  global_settings = config.get_settings()
41
47
  if "check_collector" not in global_settings:
42
48
  return
@@ -48,25 +54,26 @@ def init(config, health_check):
48
54
  for host in settings["hosts"]:
49
55
 
50
56
  class Check:
51
- def __init__(self, host):
57
+ def __init__(self, host: Dict[str, Any]):
52
58
  self.host = host
53
59
 
54
- def __call__(self, request) -> Any: # pylint: disable=inconsistent-return-statements
60
+ def __call__(self, request: pyramid.request.Request) -> Optional[Dict[str, Any]]:
55
61
  params = request.params
56
62
  display = self.host["display"]
57
63
  if "host" not in params or display == params["host"]:
58
64
  url_headers = build_url(
59
65
  "check_collector",
60
- "%s/%s/health_check" % (self.host["url"].rstrip("/"), c2c_base.strip("/")),
66
+ f"{self.host['url'].rstrip('/')}/{c2c_base.strip('/')}/health_check",
61
67
  request,
62
68
  )
63
69
  r = requests.get(
64
70
  params={"max_level": str(self.host.get("max_level", max_level))},
65
71
  timeout=120,
66
- **url_headers,
72
+ **url_headers, # type: ignore
67
73
  )
68
74
  r.raise_for_status()
69
- return r.json()
75
+ return cast(Dict[str, Any], r.json())
76
+ return None
70
77
 
71
78
  health_check.add_custom_check(
72
79
  name="check_collector_" + host["display"], check_cb=Check(host), level=settings["level"]