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,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- # Copyright (c) 2012-2020, Camptocamp SA
1
+ # Copyright (c) 2012-2021, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
6
4
  # Redistribution and use in source and binary forms, with or without
@@ -30,47 +28,55 @@
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 sqlalchemy.ext.declarative
34
+ from dogpile.cache.api import NO_VALUE, CacheBackend
35
+ from dogpile.cache.backends.memory import MemoryBackend
36
36
  from dogpile.cache.backends.redis import RedisBackend, RedisSentinelBackend
37
- from dogpile.cache.region import make_region
37
+ from dogpile.cache.region import CacheRegion, make_region
38
38
  from dogpile.cache.util import sha1_mangle_key
39
39
  from pyramid.request import Request
40
40
  from sqlalchemy.orm.util import identity_key
41
41
 
42
42
  from c2cgeoportal_commons.models import Base
43
43
 
44
+ if TYPE_CHECKING:
45
+ from dogpile.cache.api import SerializedReturnType
46
+ else:
47
+ SerializedReturnType = Any
48
+
44
49
  LOG = logging.getLogger(__name__)
45
50
  _REGION: Dict[str, Any] = {}
46
51
  MEMORY_CACHE_DICT: Dict[str, Any] = {}
47
52
 
48
53
 
49
- def map_dbobject(item):
50
-
54
+ def map_dbobject(
55
+ item: sqlalchemy.ext.declarative.ConcreteBase,
56
+ ) -> sqlalchemy.ext.declarative.ConcreteBase:
57
+ """Get an cache identity key for the cache."""
51
58
  return identity_key(item) if isinstance(item, Base) else item
52
59
 
53
60
 
54
- def keygen_function(namespace, function):
61
+ def keygen_function(namespace: Any, function: Callable[..., Any]) -> Callable[..., str]:
55
62
  """
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.
63
+ Return a function that generates a string key.
64
+
65
+ Based on a given function as well as arguments to the returned function itself.
59
66
 
60
- This is used by :meth:`.CacheRegion.cache_on_arguments`
61
- to generate a cache key from a decorated function.
67
+ This is used by :meth:`.CacheRegion.cache_on_arguments` to generate a cache key from a decorated function.
62
68
  """
63
69
 
64
70
  if namespace is None:
65
71
  namespace = (function.__module__, function.__name__)
66
- else: # pragma: no cover
72
+ else:
67
73
  namespace = (function.__module__, function.__name__, namespace)
68
74
 
69
75
  args = inspect.getfullargspec(function)
70
76
  ignore_first_argument = args[0] and args[0][0] in ("self", "cls")
71
77
 
72
- def generate_key(*args, **kw):
73
- if kw: # pragma: no cover
78
+ def generate_key(*args: Any, **kw: Any) -> str:
79
+ if kw:
74
80
  raise ValueError("key creation function does not accept keyword arguments.")
75
81
  parts: List[str] = []
76
82
  parts.extend(namespace)
@@ -83,36 +89,31 @@ def keygen_function(namespace, function):
83
89
  return generate_key
84
90
 
85
91
 
86
- def init_region(conf, region):
87
- """
88
- Initialize the caching module.
89
- """
92
+ def init_region(conf: Dict[str, Any], region: str) -> CacheRegion:
93
+ """Initialize the caching module."""
90
94
  cache_region = get_region(region)
91
95
  _configure_region(conf, cache_region)
92
96
  return cache_region
93
97
 
94
98
 
95
- def _configure_region(conf, cache_region):
96
- global MEMORY_CACHE_DICT
97
- kwargs = {"replace_existing_backend": True}
99
+ def _configure_region(conf: Dict[str, Any], cache_region: CacheRegion) -> None:
100
+ kwargs: Dict[str, Any] = {"replace_existing_backend": True}
98
101
  backend = conf["backend"]
99
102
  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
103
+ kwargs.setdefault("arguments", {})
104
+ kwargs["arguments"]["cache_dict"] = MEMORY_CACHE_DICT
102
105
  cache_region.configure(backend, **kwargs)
103
106
 
104
107
 
105
- def get_region(region):
106
- """
107
- Return a cache region.
108
- """
109
- global _REGION
108
+ def get_region(region: str) -> CacheRegion:
109
+ """Return a cache region."""
110
110
  if region not in _REGION:
111
111
  _REGION[region] = make_region(function_key_generator=keygen_function)
112
112
  return _REGION[region]
113
113
 
114
114
 
115
- def invalidate_region(region=None):
115
+ def invalidate_region(region: Optional[str] = None) -> None:
116
+ """Invalidate a cache region."""
116
117
  if region is None:
117
118
  for cache_region in _REGION.values():
118
119
  cache_region.invalidate()
@@ -120,180 +121,49 @@ def invalidate_region(region=None):
120
121
  get_region(region).invalidate()
121
122
 
122
123
 
123
- class HybridRedisBackend(RedisBackend):
124
- """
125
- A memory and redis backend
126
- """
124
+ class HybridRedisBackend(CacheBackend): # type: ignore
125
+ """A Dogpile cache backend with a memory cache backend in front of a Redis backend for performance."""
127
126
 
128
- def __init__(self, arguments):
129
- self._cache = arguments.pop("cache_dict", {})
127
+ def __init__(self, arguments: Dict[str, Any]): # pylint: disable=super-init-not-called
130
128
  self._use_memory_cache = not arguments.pop("disable_memory_cache", False)
129
+ self._memory = MemoryBackend({"cache_dict": arguments.pop("cache_dict", {})})
130
+ self._redis = RedisBackend(arguments)
131
131
 
132
- super().__init__(arguments)
133
-
134
- def get(self, key):
135
- value = self._cache.get(key, NO_VALUE)
132
+ def get(self, key: str) -> SerializedReturnType:
133
+ value = self._memory.get(key)
136
134
  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
135
+ val = self._redis.get_serialized(sha1_mangle_key(key.encode()))
136
+ if val in (None, NO_VALUE):
137
+ return NO_VALUE
138
+ value = self._redis.deserializer(val)
139
+ if value != NO_VALUE and self._use_memory_cache:
140
+ self._memory.set(key, value)
140
141
  return value
141
142
 
142
- def get_multi(self, keys):
143
+ def get_multi(self, keys: List[str]) -> List[SerializedReturnType]:
143
144
  return [self.get(key) for key in keys]
144
145
 
145
- def set(self, key, value):
146
+ def set(self, key: str, value: SerializedReturnType) -> None:
146
147
  if self._use_memory_cache:
147
- self._cache[key] = value
148
- super().set(sha1_mangle_key(key.encode()), value)
148
+ self._memory.set(key, value)
149
+ self._redis.set_serialized(sha1_mangle_key(key.encode()), self._redis.serializer(value))
149
150
 
150
- def set_multi(self, mapping):
151
+ def set_multi(self, mapping: Dict[str, SerializedReturnType]) -> None:
151
152
  for key, value in mapping.items():
152
153
  self.set(key, value)
153
154
 
154
- def delete(self, key):
155
- self._cache.pop(key, None)
156
- super().delete(key)
155
+ def delete(self, key: str) -> None:
156
+ self._memory.delete(key)
157
+ self._redis.delete(key)
157
158
 
159
+ def delete_multi(self, keys: List[str]) -> None:
160
+ self._memory.delete_multi(keys)
161
+ self._redis.delete_multi(keys)
158
162
 
159
- class HybridRedisSentinelBackend(RedisSentinelBackend):
160
- """
161
- A memory and redis sentinel backend
162
- """
163
163
 
164
- def __init__(self, arguments):
165
- self._cache = arguments.pop("cache_dict", {})
166
- self._use_memory_cache = not arguments.pop("disable_memory_cache", False)
164
+ class HybridRedisSentinelBackend(HybridRedisBackend):
165
+ """Same as HybridRedisBackend but using the Redis Sentinel."""
167
166
 
167
+ def __init__(self, arguments: Dict[str, Any]):
168
168
  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)
169
+ 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"]