c2cgeoportal-geoportal 2.5.0.100__py2.py3-none-any.whl → 2.7.1.156__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 (224) hide show
  1. c2cgeoportal_geoportal/__init__.py +261 -130
  2. c2cgeoportal_geoportal/lib/__init__.py +74 -120
  3. c2cgeoportal_geoportal/lib/authentication.py +170 -21
  4. c2cgeoportal_geoportal/lib/bashcolor.py +17 -13
  5. c2cgeoportal_geoportal/lib/cacheversion.py +19 -11
  6. c2cgeoportal_geoportal/lib/caching.py +66 -160
  7. c2cgeoportal_geoportal/lib/check_collector.py +17 -10
  8. c2cgeoportal_geoportal/lib/checker.py +62 -64
  9. c2cgeoportal_geoportal/lib/common_headers.py +170 -0
  10. c2cgeoportal_geoportal/lib/dbreflection.py +70 -31
  11. c2cgeoportal_geoportal/lib/filter_capabilities.py +127 -97
  12. c2cgeoportal_geoportal/lib/fulltextsearch.py +50 -0
  13. c2cgeoportal_geoportal/lib/functionality.py +36 -21
  14. c2cgeoportal_geoportal/lib/headers.py +14 -5
  15. c2cgeoportal_geoportal/lib/i18n.py +39 -0
  16. c2cgeoportal_geoportal/lib/layers.py +29 -10
  17. c2cgeoportal_geoportal/lib/lingua_extractor.py +408 -211
  18. c2cgeoportal_geoportal/lib/loader.py +18 -16
  19. c2cgeoportal_geoportal/lib/metrics.py +29 -18
  20. c2cgeoportal_geoportal/lib/oauth2.py +1036 -0
  21. c2cgeoportal_geoportal/lib/wmstparsing.py +115 -90
  22. c2cgeoportal_geoportal/lib/xsd.py +29 -19
  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/+dot+prospector.yaml → advance_create/{{cookiecutter.project}}/geoportal/.prospector.yaml} +8 -4
  29. c2cgeoportal_geoportal/scaffolds/{create/geoportal/Dockerfile_tmpl → advance_create/{{cookiecutter.project}}/geoportal/Dockerfile} +24 -15
  30. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/alembic.ini +1 -0
  31. c2cgeoportal_geoportal/scaffolds/{create/geoportal/alembic.yaml_tmpl → advance_create/{{cookiecutter.project}}/geoportal/alembic.yaml} +1 -1
  32. c2cgeoportal_geoportal/scaffolds/{create/geoportal/development.ini_tmpl → advance_create/{{cookiecutter.project}}/geoportal/development.ini} +34 -15
  33. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/gunicorn.conf.py +102 -0
  34. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/lingua-client.cfg +1 -0
  35. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/production.ini +38 -0
  36. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/requirements.txt +2 -0
  37. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/setup.py +25 -0
  38. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/tools/extract-messages.js +8 -6
  39. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/tsconfig.json +8 -0
  40. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.api.js +75 -0
  41. c2cgeoportal_geoportal/scaffolds/{create/geoportal/webpack.apps.js_tmpl → advance_create/{{cookiecutter.project}}/geoportal/webpack.apps.js} +31 -28
  42. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/webpack.commons.js +3 -7
  43. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/webpack.config.js +4 -4
  44. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py +47 -0
  45. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/authentication.py +10 -0
  46. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/dev.py +14 -0
  47. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/models.py +8 -0
  48. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_organization.py +7 -0
  49. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/resources.py +4 -3
  50. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static-ngeo/api/index.js +12 -0
  51. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static-ngeo/js/{{cookiecutter.package}}module.js +25 -0
  52. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal/subscribers.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/subscribers.py} +3 -6
  53. c2cgeoportal_geoportal/scaffolds/advance_update/cookiecutter.json +18 -0
  54. c2cgeoportal_geoportal/scaffolds/{update/geoportal/CONST_Makefile_tmpl → advance_update/{{cookiecutter.project}}/geoportal/CONST_Makefile} +32 -20
  55. c2cgeoportal_geoportal/scaffolds/create/cookiecutter.json +18 -0
  56. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.dockerignore +14 -0
  57. c2cgeoportal_geoportal/scaffolds/create/{+dot+editorconfig → {{cookiecutter.project}}/.editorconfig} +4 -8
  58. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/main.yaml +43 -0
  59. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/rebuild.yaml +46 -0
  60. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/update_l10n.yaml +65 -0
  61. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.gitignore +16 -0
  62. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierignore +1 -0
  63. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierrc.yaml +2 -0
  64. c2cgeoportal_geoportal/scaffolds/create/{Dockerfile_tmpl → {{cookiecutter.project}}/Dockerfile} +34 -24
  65. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Makefile +14 -0
  66. c2cgeoportal_geoportal/scaffolds/create/{README.rst_tmpl → {{cookiecutter.project}}/README.rst} +4 -4
  67. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/build +162 -0
  68. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/config.yaml +25 -0
  69. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/requirements.txt +1 -0
  70. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-lib.yaml +474 -0
  71. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose.override.sample.yaml +67 -0
  72. c2cgeoportal_geoportal/scaffolds/create/{docker-compose.yaml → {{cookiecutter.project}}/docker-compose.yaml} +43 -18
  73. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.default +82 -0
  74. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.project +60 -0
  75. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/vars.yaml +396 -0
  76. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/mobile.css +0 -0
  77. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/markers/marker-blue.png +0 -0
  78. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/markers/marker-gold.png +0 -0
  79. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/markers/marker-green.png +0 -0
  80. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/markers/marker.png +0 -0
  81. c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/data/Readme.txt +1 -1
  82. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/demo.map.tmpl +224 -0
  83. c2cgeoportal_geoportal/scaffolds/create/{mapserver/mapserver.map.tmpl_tmpl → {{cookiecutter.project}}/mapserver/mapserver.map.tmpl} +7 -15
  84. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Landscape.jrxml +17 -9
  85. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Portrait.jrxml +17 -9
  86. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Landscape.jrxml +17 -9
  87. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Portrait.jrxml +17 -9
  88. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/config.yaml.tmpl +30 -27
  89. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/legend.jrxml +109 -0
  90. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/localisation.properties +4 -0
  91. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/localisation_fr.properties +4 -0
  92. c2cgeoportal_geoportal/scaffolds/create/{project.yaml_tmpl → {{cookiecutter.project}}/project.yaml} +6 -6
  93. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/pyproject.toml +3 -0
  94. c2cgeoportal_geoportal/scaffolds/create/{qgisserver/pg_service.conf.tmpl_tmpl → {{cookiecutter.project}}/qgisserver/pg_service.conf.tmpl} +2 -2
  95. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-backup +110 -0
  96. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-restore +114 -0
  97. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/setup.cfg +7 -0
  98. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/spell-ignore-words.txt +3 -0
  99. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tilegeneration/config.yaml.tmpl +195 -0
  100. c2cgeoportal_geoportal/scaffolds/update/cookiecutter.json +18 -0
  101. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/.upgrade.yaml +191 -0
  102. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_CHANGELOG.txt +1160 -0
  103. c2cgeoportal_geoportal/scaffolds/update/{geoportal → {{cookiecutter.project}}/geoportal}/CONST_config-schema.yaml +99 -47
  104. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/geoportal/CONST_vars.yaml +1410 -0
  105. c2cgeoportal_geoportal/scripts/__init__.py +18 -32
  106. c2cgeoportal_geoportal/scripts/c2cupgrade.py +295 -200
  107. c2cgeoportal_geoportal/scripts/create_demo_theme.py +5 -6
  108. c2cgeoportal_geoportal/scripts/manage_users.py +34 -37
  109. c2cgeoportal_geoportal/scripts/pcreate.py +312 -0
  110. c2cgeoportal_geoportal/scripts/theme2fts.py +92 -25
  111. c2cgeoportal_geoportal/scripts/urllogin.py +23 -17
  112. c2cgeoportal_geoportal/templates/login.html +88 -84
  113. c2cgeoportal_geoportal/templates/notlogin.html +62 -0
  114. c2cgeoportal_geoportal/templates/testi18n.html +6 -8
  115. c2cgeoportal_geoportal/views/__init__.py +23 -4
  116. c2cgeoportal_geoportal/views/dev.py +9 -7
  117. c2cgeoportal_geoportal/views/dynamic.py +71 -40
  118. c2cgeoportal_geoportal/views/entry.py +93 -24
  119. c2cgeoportal_geoportal/views/fulltextsearch.py +36 -29
  120. c2cgeoportal_geoportal/views/geometry_processing.py +15 -7
  121. c2cgeoportal_geoportal/views/i18n.py +91 -9
  122. c2cgeoportal_geoportal/views/layers.py +173 -134
  123. c2cgeoportal_geoportal/views/login.py +206 -87
  124. c2cgeoportal_geoportal/views/mapserverproxy.py +59 -35
  125. c2cgeoportal_geoportal/views/memory.py +13 -13
  126. c2cgeoportal_geoportal/views/ogcproxy.py +48 -30
  127. c2cgeoportal_geoportal/views/pdfreport.py +31 -27
  128. c2cgeoportal_geoportal/views/printproxy.py +70 -54
  129. c2cgeoportal_geoportal/views/profile.py +25 -24
  130. c2cgeoportal_geoportal/views/proxy.py +100 -70
  131. c2cgeoportal_geoportal/views/raster.py +47 -29
  132. c2cgeoportal_geoportal/views/resourceproxy.py +13 -11
  133. c2cgeoportal_geoportal/views/shortener.py +31 -24
  134. c2cgeoportal_geoportal/views/theme.py +475 -365
  135. c2cgeoportal_geoportal/views/tinyowsproxy.py +46 -39
  136. c2cgeoportal_geoportal/views/vector_tiles.py +80 -0
  137. {c2cgeoportal_geoportal-2.5.0.100.dist-info → c2cgeoportal_geoportal-2.7.1.156.dist-info}/METADATA +17 -11
  138. c2cgeoportal_geoportal-2.7.1.156.dist-info/RECORD +185 -0
  139. {c2cgeoportal_geoportal-2.5.0.100.dist-info → c2cgeoportal_geoportal-2.7.1.156.dist-info}/WHEEL +1 -1
  140. {c2cgeoportal_geoportal-2.5.0.100.dist-info → c2cgeoportal_geoportal-2.7.1.156.dist-info}/entry_points.txt +3 -1
  141. tests/__init__.py +24 -3
  142. tests/test_cachebuster.py +1 -3
  143. tests/test_caching.py +19 -26
  144. tests/test_checker.py +2 -3
  145. tests/test_decimaljson.py +4 -4
  146. tests/test_headerstween.py +0 -3
  147. tests/test_i18n.py +31 -0
  148. tests/test_init.py +12 -27
  149. tests/test_locale_negociator.py +6 -6
  150. tests/test_mapserverproxy_route_predicate.py +0 -2
  151. tests/test_raster.py +18 -5
  152. tests/test_wmstparsing.py +7 -8
  153. c2cgeoportal_geoportal/scaffolds/__init__.py +0 -226
  154. c2cgeoportal_geoportal/scaffolds/create/+dot+dockerignore_tmpl +0 -11
  155. c2cgeoportal_geoportal/scaffolds/create/+dot+github/workflows/ci.yaml_tmpl +0 -56
  156. c2cgeoportal_geoportal/scaffolds/create/+dot+gitignore_tmpl +0 -12
  157. c2cgeoportal_geoportal/scaffolds/create/build_tmpl +0 -144
  158. c2cgeoportal_geoportal/scaffolds/create/docker-compose-lib.yaml_tmpl +0 -302
  159. c2cgeoportal_geoportal/scaffolds/create/docker-compose.override.sample.yaml_tmpl +0 -54
  160. c2cgeoportal_geoportal/scaffolds/create/env.default_tmpl +0 -49
  161. c2cgeoportal_geoportal/scaffolds/create/env.project_tmpl +0 -39
  162. c2cgeoportal_geoportal/scaffolds/create/geoportal/+dot+dockerignore_tmpl +0 -5
  163. c2cgeoportal_geoportal/scaffolds/create/geoportal/+dot+eslintrc_tmpl +0 -19
  164. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/__init__.py_tmpl +0 -48
  165. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/models.py_tmpl +0 -10
  166. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static/images/favicon.ico +0 -0
  167. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static/robot.txt +0 -3
  168. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/api/index.js_tmpl +0 -37
  169. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/js/+package+module.js_tmpl +0 -22
  170. c2cgeoportal_geoportal/scaffolds/create/geoportal/production.ini_tmpl +0 -106
  171. c2cgeoportal_geoportal/scaffolds/create/geoportal/requirements.txt +0 -2
  172. c2cgeoportal_geoportal/scaffolds/create/geoportal/setup.py_tmpl +0 -18
  173. c2cgeoportal_geoportal/scaffolds/create/geoportal/tsconfig.json_tmpl +0 -9
  174. c2cgeoportal_geoportal/scaffolds/create/geoportal/vars.yaml_tmpl +0 -224
  175. c2cgeoportal_geoportal/scaffolds/create/geoportal/webpack.api.js_tmpl +0 -71
  176. c2cgeoportal_geoportal/scaffolds/create/mapserver/demo.map.tmpl_tmpl +0 -262
  177. c2cgeoportal_geoportal/scaffolds/create/mapserver/tinyows.xml +0 -36
  178. c2cgeoportal_geoportal/scaffolds/create/print/print-apps/+package+/config.yaml +0 -166
  179. c2cgeoportal_geoportal/scaffolds/create/print/print-apps/+package+/legend.jrxml +0 -27
  180. c2cgeoportal_geoportal/scaffolds/create/qgisserver/geomapfish.yaml.tmpl_tmpl +0 -29
  181. c2cgeoportal_geoportal/scaffolds/create/scripts/publish-docker +0 -124
  182. c2cgeoportal_geoportal/scaffolds/create/setup.cfg_tmpl +0 -3
  183. c2cgeoportal_geoportal/scaffolds/create/spell-ignore-words.txt +0 -1
  184. c2cgeoportal_geoportal/scaffolds/create/tilegeneration/config.yaml.tmpl_tmpl +0 -169
  185. c2cgeoportal_geoportal/scaffolds/create/yamllint.yaml +0 -11
  186. c2cgeoportal_geoportal/scaffolds/update/+dot+upgrade.yaml_tmpl +0 -171
  187. c2cgeoportal_geoportal/scaffolds/update/CONST_CHANGELOG.txt_tmpl +0 -64
  188. c2cgeoportal_geoportal/scaffolds/update/geoportal/CONST_vars.yaml_tmpl +0 -783
  189. c2cgeoportal_geoportal/templates/dynamic.js +0 -21
  190. c2cgeoportal_geoportal-2.5.0.100.dist-info/RECORD +0 -162
  191. tests/test_get_url.py +0 -96
  192. tests/test_lib.py +0 -77
  193. /c2cgeoportal_geoportal/{scaffolds/create/geoportal/+package+_geoportal/static/css/desktop.css → py.typed} +0 -0
  194. /c2cgeoportal_geoportal/scaffolds/{create/geoportal/Makefile_tmpl → advance_create/{{cookiecutter.project}}/geoportal/Makefile} +0 -0
  195. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/language_mapping +0 -0
  196. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/lingua-server.cfg +0 -0
  197. /c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/views/__init__.py +0 -0
  198. /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
  199. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal/static/css/iframe_api.css → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/desktop.css} +0 -0
  200. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal/static/css/mobile.css → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/iframe_api.css} +0 -0
  201. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/banner_left.png +0 -0
  202. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/banner_right.png +0 -0
  203. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/blank.png +0 -0
  204. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/robot.txt.tmpl +0 -0
  205. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/data/TM_EUROPE_BORDERS-0.3.sql +0 -0
  206. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arial.ttf +0 -0
  207. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arialbd.ttf +0 -0
  208. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arialbi.ttf +0 -0
  209. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Ariali.ttf +0 -0
  210. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Bold.ttf +0 -0
  211. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-BoldItalic.ttf +0 -0
  212. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Italic.ttf +0 -0
  213. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Regular.ttf +0 -0
  214. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdana.ttf +0 -0
  215. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanab.ttf +0 -0
  216. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanai.ttf +0 -0
  217. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanaz.ttf +0 -0
  218. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts.conf +0 -0
  219. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/tinyows.xml.tmpl +0 -0
  220. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/logo.png +0 -0
  221. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/north.svg +0 -0
  222. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/results.jrxml +0 -0
  223. /c2cgeoportal_geoportal/scaffolds/create/{run_alembic.sh → {{cookiecutter.project}}/run_alembic.sh} +0 -0
  224. {c2cgeoportal_geoportal-2.5.0.100.dist-info → c2cgeoportal_geoportal-2.7.1.156.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,89 +28,92 @@
30
28
 
31
29
  import inspect
32
30
  import logging
33
- from typing import Any, Dict, List
34
-
35
- from dogpile.cache.api import NO_VALUE
36
- from dogpile.cache.backends.redis import RedisBackend
37
- from dogpile.cache.region import make_region
38
- from dogpile.cache.util import compat, sha1_mangle_key
31
+ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional
32
+
33
+ import sqlalchemy.ext.declarative
34
+ from dogpile.cache.api import NO_VALUE, CacheBackend
35
+ from dogpile.cache.backends.memory import MemoryBackend
36
+ from dogpile.cache.backends.redis import RedisBackend, RedisSentinelBackend
37
+ from dogpile.cache.region import CacheRegion, make_region
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)
77
83
  if ignore_first_argument:
78
84
  args = args[1:]
79
85
  new_args: List[str] = [arg for arg in args if not isinstance(arg, Request)]
80
- parts.extend(map(compat.text_type, map(map_dbobject, new_args)))
86
+ parts.extend(map(str, map(map_dbobject, new_args)))
81
87
  return "|".join(parts)
82
88
 
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,144 +121,49 @@ def invalidate_region(region=None):
120
121
  get_region(region).invalidate()
121
122
 
122
123
 
123
- class HybridBackend(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)
157
-
158
-
159
- NO_CACHE = 0
160
- PUBLIC_CACHE = 1
161
- PRIVATE_CACHE = 2
162
-
163
- CORS_METHODS = "HEAD, GET, POST, PUT, DELETE"
164
-
165
-
166
- def _set_cors_headers(request, response, service_name, service_headers_settings, credentials):
167
- """
168
- Handle CORS requests, as specified in https://www.w3.org/TR/cors/
169
- """
170
- response.vary = (response.vary or ()) + ("Origin",)
171
-
172
- if "Origin" not in request.headers:
173
- return # Not a CORS request if this header is missing
174
- origin = request.headers["Origin"]
175
-
176
- if request.method == "OPTIONS" and "Access-Control-Request-Method" not in request.headers:
177
- LOG.warning("CORS preflight query missing the Access-Control-Request-Method header")
178
- return
155
+ def delete(self, key: str) -> None:
156
+ self._memory.delete(key)
157
+ self._redis.delete(key)
179
158
 
180
- allowed_origins = service_headers_settings.get("access_control_allow_origin", [])
181
- if origin not in allowed_origins:
182
- if "*" in allowed_origins:
183
- origin = "*"
184
- credentials = False # Force no credentials
185
- else:
186
- LOG.warning("CORS query not allowed for origin=%s, service=%s", origin, service_name)
187
- return
159
+ def delete_multi(self, keys: List[str]) -> None:
160
+ self._memory.delete_multi(keys)
161
+ self._redis.delete_multi(keys)
188
162
 
189
- response.headers.update(
190
- {"Access-Control-Allow-Origin": origin, "Access-Control-Allow-Methods": CORS_METHODS}
191
- )
192
163
 
193
- max_age = service_headers_settings.get("access_control_max_age", 3600)
194
- response.headers["Access-Control-Max-Age"] = str(max_age)
164
+ class HybridRedisSentinelBackend(HybridRedisBackend):
165
+ """Same as HybridRedisBackend but using the Redis Sentinel."""
195
166
 
196
- if credentials:
197
- response.headers["Access-Control-Allow-Credentials"] = "true"
198
-
199
- if request.method != "OPTIONS":
200
- return
201
-
202
- response.cache_control.max_age = max_age
203
-
204
- if not service_headers_settings or "access_control_allow_origin" not in service_headers_settings:
205
- LOG.warning("CORS query not configured for service=%s", service_name)
206
- return
207
-
208
- requested_headers = request.headers.get("Access-Control-Request-Headers", False)
209
- if requested_headers:
210
- # For the moment, we allow all requested headers
211
- response.headers["Access-Control-Allow-Headers"] = requested_headers
212
-
213
- # If we start using headers in responses, we'll have to add
214
- # Access-Control-Expose-Headers
215
-
216
-
217
- def _set_common_headers(request, response, service_headers_settings, cache, content_type):
218
- """
219
- Set the common headers
220
- """
221
-
222
- response.headers.update(service_headers_settings.get("headers", {}))
223
-
224
- if cache == NO_CACHE:
225
- response.cache_control.no_cache = True
226
- response.cache_control.max_age = 0
227
- elif cache == PUBLIC_CACHE:
228
- response.cache_control.public = True
229
- elif cache == PRIVATE_CACHE:
230
- if request.user is not None:
231
- response.cache_control.private = True
232
- else:
233
- response.cache_control.public = True
234
- else: # pragma: no cover
235
- raise Exception("Invalid cache type")
236
-
237
- if cache != NO_CACHE:
238
- max_age = service_headers_settings.get("cache_control_max_age", 3600)
239
-
240
- response.cache_control.max_age = max_age
241
- if max_age == 0:
242
- response.cache_control.no_cache = True
243
-
244
- if content_type is not None:
245
- response.content_type = content_type
246
-
247
- return response
248
-
249
-
250
- def set_common_headers(request, service_name, cache, response=None, credentials=True, content_type=None):
251
- """
252
- Set the common headers
253
- """
254
- if response is None:
255
- response = request.response
256
-
257
- headers_settings = request.registry.settings.get("headers", {})
258
- service_headers_settings = headers_settings.get(service_name, {})
259
-
260
- _set_cors_headers(request, response, service_name, service_headers_settings, credentials)
261
- if request.method == "OPTIONS":
262
- return response
263
- return _set_common_headers(request, response, service_headers_settings, cache, content_type)
167
+ def __init__(self, arguments: Dict[str, Any]):
168
+ super().__init__(arguments)
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"]