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) 2018-2019, Camptocamp SA
1
+ # Copyright (c) 2018-2021, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
6
4
  # Redistribution and use in source and binary forms, with or without
@@ -30,8 +28,9 @@
30
28
 
31
29
  import logging
32
30
  import time
33
- from typing import Any, Dict
31
+ from typing import Any, Dict, cast
34
32
 
33
+ import pyramid.request
35
34
  from c2cwsgiutils import broadcast
36
35
  from c2cwsgiutils.auth import auth_view
37
36
  from c2cwsgiutils.debug import get_size
@@ -43,27 +42,28 @@ from c2cgeoportal_geoportal.views import raster
43
42
  LOG = logging.getLogger(__name__)
44
43
 
45
44
 
46
- @view_config(route_name="memory", renderer="fast_json")
47
- def memory(request):
45
+ @view_config(route_name="memory", renderer="fast_json") # type: ignore
46
+ def memory(request: pyramid.request.Request) -> Dict[str, Any]:
47
+ """Offer an authenticated view throw c2cwsgiutils to provide some memory information."""
48
48
  auth_view(request)
49
- return _memory()
49
+ return cast(Dict[str, Any], _memory())
50
50
 
51
51
 
52
- def _nice_type_name(obj, dogpile_cache=False):
52
+ def _nice_type_name(obj: Any, dogpile_cache: bool = False) -> str:
53
53
  # See: https://dogpilecache.sqlalchemy.org/en/latest/api.html#dogpile.cache.api.CachedValue
54
54
  if dogpile_cache:
55
55
  obj, _ = obj
56
56
  type_ = type(obj)
57
- return "{}.{}".format(type_.__module__, type_.__name__)
57
+ return f"{type_.__module__}.{type_.__name__}"
58
58
 
59
59
 
60
- def _process_dict(dict_, dogpile_cache=False):
60
+ def _process_dict(dict_: Dict[str, Any], dogpile_cache: bool = False) -> Dict[str, Any]:
61
61
  # Timeout after one minute, must be set to a bit less that the timeout of the broadcast
62
62
  timeout = time.monotonic() + 20
63
63
 
64
64
  return {
65
65
  "elements": sorted(
66
- [
66
+ (
67
67
  {
68
68
  "key": key,
69
69
  "type": _nice_type_name(value, dogpile_cache),
@@ -72,8 +72,8 @@ def _process_dict(dict_, dogpile_cache=False):
72
72
  "size_kb": get_size(value) / 1024 if time.monotonic() < timeout else -1,
73
73
  }
74
74
  for key, value in dict_.items()
75
- ],
76
- key=lambda i: -i["size_kb"],
75
+ ),
76
+ key=lambda i: cast(float, -i["size_kb"]),
77
77
  ),
78
78
  "id": id(dict_),
79
79
  "size_kb": get_size(dict_) / 1024 if time.monotonic() < timeout else -1,
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- # Copyright (c) 2011-2019, Camptocamp SA
1
+ # Copyright (c) 2011-2022, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
6
4
  # Redistribution and use in source and binary forms, with or without
@@ -28,14 +26,14 @@
28
26
  # either expressed or implied, of the FreeBSD Project.
29
27
 
30
28
  import logging
31
- from typing import Set
29
+ from typing import Dict, Optional, Set, cast
32
30
 
31
+ import pyramid.request
33
32
  from pyramid.httpexceptions import HTTPBadRequest
34
33
  from sqlalchemy.orm.exc import NoResultFound
35
34
 
36
- from c2cgeoportal_commons.models import DBSession
37
- from c2cgeoportal_commons.models.main import OGCServer
38
- from c2cgeoportal_geoportal.lib import get_url2
35
+ from c2cgeoportal_commons.lib.url import Url, get_url2
36
+ from c2cgeoportal_commons.models import DBSession, main
39
37
  from c2cgeoportal_geoportal.lib.caching import get_region
40
38
  from c2cgeoportal_geoportal.views.proxy import Proxy
41
39
 
@@ -44,54 +42,74 @@ LOG = logging.getLogger(__name__)
44
42
 
45
43
 
46
44
  class OGCProxy(Proxy):
47
- def __init__(self, request, has_default_ogc_server=False):
45
+ """
46
+ Proxy implementation that manly manage the ogcserver parameter.
47
+
48
+ Then load the corresponding OGCServer.
49
+ """
50
+
51
+ def __init__(self, request: pyramid.request.Request, has_default_ogc_server: bool = False):
48
52
  Proxy.__init__(self, request)
49
53
 
50
54
  # params hold the parameters we"re going to send to backend
51
55
  self.params = dict(self.request.params)
52
56
 
53
57
  # reset possible value of role_id and user_id
54
- if "role_id" in self.params: # pragma: no cover
58
+ if "role_id" in self.params:
55
59
  del self.params["role_id"]
56
- if "user_id" in self.params: # pragma: no cover
60
+ if "user_id" in self.params:
57
61
  del self.params["user_id"]
58
62
 
59
63
  self.lower_params = self._get_lower_params(self.params)
60
- if not has_default_ogc_server and "ogcserver" not in self.params:
64
+
65
+ # We need original case for OGCSERVER parameter value
66
+ self.lower_key_params = {k.lower(): v for k, v in self.params.items()}
67
+
68
+ if "ogcserver" in request.matchdict:
69
+ self.ogc_server = self._get_ogcserver_byname(request.matchdict["ogcserver"])
70
+ elif "ogcserver" in self.lower_key_params:
71
+ self.ogc_server = self._get_ogcserver_byname(self.lower_key_params["ogcserver"])
72
+ elif not has_default_ogc_server:
61
73
  raise HTTPBadRequest("The querystring argument 'ogcserver' is required")
62
- if "ogcserver" in self.params:
63
- self.ogc_server = self._get_ogcserver_byname(self.params["ogcserver"])
64
74
 
65
- @CACHE_REGION.cache_on_arguments()
66
- def _get_ogcserver_byname(self, name): # pylint: disable=no-self-use
75
+ @CACHE_REGION.cache_on_arguments() # type: ignore
76
+ def _get_ogcserver_byname(self, name: str) -> main.OGCServer: # pylint: disable=no-self-use
67
77
  try:
68
- result = DBSession.query(OGCServer).filter(OGCServer.name == name).one()
78
+ result = DBSession.query(main.OGCServer).filter(main.OGCServer.name == name).one()
69
79
  DBSession.expunge(result)
70
- return result
71
- except NoResultFound: # pragma nocover
72
- raise HTTPBadRequest(
73
- "OGSServer '{}' does not exists (existing: {}).".format(
74
- name, ",".join([t[0] for t in DBSession.query(OGCServer.name).all()])
75
- )
80
+ return cast(main.OGCServer, result)
81
+ except NoResultFound:
82
+ raise HTTPBadRequest( # pylint: disable=raise-missing-from
83
+ f"The OGC Server '{name}' does not exist (existing: "
84
+ f"{','.join([t[0] for t in DBSession.query(main.OGCServer.name).all()])})."
76
85
  )
77
86
 
78
- def _get_wms_url(self):
87
+ def _get_wms_url(self, errors: Set[str]) -> Optional[Url]:
79
88
  ogc_server = self.ogc_server
80
- errors: Set[str] = set()
81
- url = get_url2("The OGC server '{}'".format(ogc_server.name), ogc_server.url, self.request, errors)
82
- if errors: # pragma: no cover
89
+ url = get_url2(f"The OGC server '{ogc_server.name}'", ogc_server.url, self.request, errors)
90
+ if errors:
83
91
  LOG.error("\n".join(errors))
84
92
  return url
85
93
 
86
- def _get_wfs_url(self):
94
+ def _get_wfs_url(self, errors: Set[str]) -> Optional[Url]:
87
95
  ogc_server = self.ogc_server
88
- errors: Set[str] = set()
89
96
  url = get_url2(
90
- "The OGC server (WFS) '{}'".format(ogc_server.name),
97
+ f"The OGC server (WFS) '{ogc_server.name}'",
91
98
  ogc_server.url_wfs or ogc_server.url,
92
99
  self.request,
93
100
  errors,
94
101
  )
95
- if errors: # pragma: no cover
102
+ if errors:
96
103
  LOG.error("\n".join(errors))
97
104
  return url
105
+
106
+ def get_headers(self) -> Dict[str, str]:
107
+ headers: Dict[str, str] = super().get_headers()
108
+ if self.ogc_server.type == main.OGCSERVER_TYPE_QGISSERVER:
109
+ if self.request.matched_route.name.endswith("_path"):
110
+ headers["X-Qgis-Service-Url"] = self.request.current_route_url(path=[], _query={})
111
+ else:
112
+ headers["X-Qgis-Service-Url"] = self.request.current_route_url(
113
+ _query={"ogcserver": self.ogc_server.name}
114
+ )
115
+ return headers
@@ -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,46 +25,51 @@
27
25
  # of the authors and should not be interpreted as representing official policies,
28
26
  # either expressed or implied, of the FreeBSD Project.
29
27
 
30
- from json import dumps, loads
31
28
  import logging
29
+ from json import dumps, loads
30
+ from typing import Any, Dict, List, Union
32
31
 
32
+ import pyramid.request
33
+ import pyramid.response
33
34
  from pyramid.httpexceptions import HTTPBadRequest, HTTPForbidden
34
35
  from pyramid.view import view_config
35
36
 
36
37
  from c2cgeoportal_commons import models
38
+ from c2cgeoportal_commons.lib.url import Url
37
39
  from c2cgeoportal_commons.models import main
38
- from c2cgeoportal_geoportal.lib import add_url_params
39
- from c2cgeoportal_geoportal.lib.caching import NO_CACHE
40
+ from c2cgeoportal_geoportal.lib.common_headers import Cache
40
41
  from c2cgeoportal_geoportal.lib.layers import get_private_layers, get_protected_layers
41
42
  from c2cgeoportal_geoportal.views.ogcproxy import OGCProxy
42
43
 
43
44
  LOG = logging.getLogger(__name__)
44
45
 
45
46
 
46
- class PdfReport(OGCProxy): # pragma: no cover
47
+ class PdfReport(OGCProxy):
48
+ """All the views concerned the PDF report."""
47
49
 
48
50
  layername = None
49
51
 
50
- def __init__(self, request):
52
+ def __init__(self, request: pyramid.request.Request):
51
53
  OGCProxy.__init__(self, request)
52
54
  self.config = self.request.registry.settings.get("pdfreport", {})
53
55
 
54
- def _do_print(self, spec):
55
- """ Create and get report PDF. """
56
-
56
+ def _do_print(self, spec: Dict[str, Any]) -> pyramid.response.Response:
57
+ """Create and get report PDF."""
57
58
  headers = dict(self.request.headers)
58
59
  headers["Content-Type"] = "application/json"
59
60
  response = self._proxy(
60
- "{0!s}/buildreport.{1!s}".format(self.config["print_url"], spec["outputFormat"]),
61
+ Url(f"{self.config['print_url']}/buildreport.{spec['outputFormat']}"),
61
62
  method="POST",
62
63
  body=dumps(spec).encode("utf-8"),
63
64
  headers=headers,
64
65
  )
65
66
 
66
- return self._build_response(response, response.content, NO_CACHE, "pdfreport")
67
+ return self._build_response(response, response.content, Cache.PRIVATE_NO, "pdfreport")
67
68
 
68
69
  @staticmethod
69
- def _build_map(mapserv_url, vector_request_url, srs, map_config):
70
+ def _build_map(
71
+ mapserv_url: str, vector_request_url: str, srs: str, map_config: Dict[str, Any]
72
+ ) -> Dict[str, Any]:
70
73
  backgroundlayers = map_config["backgroundlayers"]
71
74
  imageformat = map_config["imageformat"]
72
75
  return {
@@ -98,8 +101,8 @@ class PdfReport(OGCProxy): # pragma: no cover
98
101
  ],
99
102
  }
100
103
 
101
- @view_config(route_name="pdfreport", renderer="json")
102
- def get_report(self):
104
+ @view_config(route_name="pdfreport", renderer="json") # type: ignore
105
+ def get_report(self) -> pyramid.response.Response:
103
106
  self.layername = self.request.matchdict["layername"]
104
107
  layer_config = self.config["layers"].get(self.layername)
105
108
 
@@ -138,8 +141,8 @@ class PdfReport(OGCProxy): # pragma: no cover
138
141
  mapserv_url = self.request.route_url(
139
142
  "mapserverproxy", _query={"ogcserver": layer_config["ogc_server"]}
140
143
  )
141
- vector_request_url = add_url_params(
142
- mapserv_url,
144
+ url = Url(mapserv_url)
145
+ url.add_query(
143
146
  {
144
147
  "service": "WFS",
145
148
  "version": "1.1.0",
@@ -148,8 +151,9 @@ class PdfReport(OGCProxy): # pragma: no cover
148
151
  "typeName": self.layername,
149
152
  "featureid": ",".join(features_ids),
150
153
  "srsName": srs,
151
- },
154
+ }
152
155
  )
156
+ vector_request_url = url.url()
153
157
 
154
158
  spec = layer_config["spec"]
155
159
  if spec is None:
@@ -173,7 +177,7 @@ class PdfReport(OGCProxy): # pragma: no cover
173
177
  datasource = layer_config.get("datasource", True)
174
178
  if multiple and datasource:
175
179
  data = dumps(layer_config["data"])
176
- datas = [
180
+ data_list = [
177
181
  loads(
178
182
  data
179
183
  % {
@@ -186,7 +190,7 @@ class PdfReport(OGCProxy): # pragma: no cover
186
190
  )
187
191
  for id_ in ids
188
192
  ]
189
- self.walker(spec, "%(datasource)s", datas)
193
+ self.walker(spec, "%(datasource)s", data_list)
190
194
  spec = loads(
191
195
  dumps(spec)
192
196
  % {
@@ -221,7 +225,7 @@ class PdfReport(OGCProxy): # pragma: no cover
221
225
 
222
226
  return self._do_print(spec)
223
227
 
224
- def walker(self, spec, name, value):
228
+ def walker(self, spec: Union[Dict[str, Any], List[Dict[str, Any]]], name: str, value: Any) -> None:
225
229
  if isinstance(spec, dict):
226
230
  for k, v in spec.items():
227
231
  if isinstance(v, str):
@@ -231,9 +235,9 @@ class PdfReport(OGCProxy): # pragma: no cover
231
235
  self.walker(v, name, value)
232
236
 
233
237
  if isinstance(spec, list):
234
- for k, v in enumerate(spec):
235
- if isinstance(v, str):
236
- if v == name:
237
- spec[k] = value
238
+ for k2, v2 in enumerate(spec):
239
+ if isinstance(v2, str):
240
+ if v2 == name:
241
+ spec[k2] = value
238
242
  else:
239
- self.walker(v, name, value)
243
+ self.walker(v2, name, value)
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- # Copyright (c) 2011-2019, Camptocamp SA
1
+ # Copyright (c) 2011-2024, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
6
4
  # Redistribution and use in source and binary forms, with or without
@@ -31,12 +29,18 @@
31
29
  import json
32
30
  import logging
33
31
  import urllib.parse
32
+ from typing import Dict, List, Tuple
34
33
 
34
+ import pyramid.request
35
+ import pyramid.response
36
+ import requests
35
37
  from pyramid.httpexceptions import HTTPBadGateway, HTTPFound
36
38
  from pyramid.view import view_config
37
39
 
40
+ from c2cgeoportal_commons.lib.url import Url
38
41
  from c2cgeoportal_geoportal.lib import is_intranet
39
- from c2cgeoportal_geoportal.lib.caching import PRIVATE_CACHE, get_region
42
+ from c2cgeoportal_geoportal.lib.caching import get_region
43
+ from c2cgeoportal_geoportal.lib.common_headers import Cache
40
44
  from c2cgeoportal_geoportal.lib.functionality import get_functionality
41
45
  from c2cgeoportal_geoportal.views.proxy import Proxy
42
46
 
@@ -44,85 +48,97 @@ LOG = logging.getLogger(__name__)
44
48
  CACHE_REGION = get_region("std")
45
49
 
46
50
 
47
- class PrintProxy(Proxy): # pragma: no cover
48
- def __init__(self, request):
49
- Proxy.__init__(self, request)
50
- self.config = self.request.registry.settings
51
+ class PrintProxy(Proxy):
52
+ """All the view concerned the print."""
51
53
 
52
- @view_config(route_name="printproxy_capabilities")
53
- def capabilities(self):
54
- """ Get print capabilities. """
54
+ def __init__(self, request: pyramid.request.Request):
55
+ Proxy.__init__(self, request)
55
56
 
57
+ @view_config(route_name="printproxy_capabilities") # type: ignore
58
+ def capabilities(self) -> pyramid.response.Response:
59
+ """Get print capabilities."""
56
60
  templates = get_functionality("print_template", self.request, is_intranet(self.request))
57
61
 
58
62
  # get query string
59
63
  params = dict(self.request.params)
60
64
  query_string = urllib.parse.urlencode(params)
61
65
 
62
- resp, content = self._capabilities(templates, query_string, self.request.method)
66
+ resp, content = self._capabilities(
67
+ templates, query_string, self.request.method, self.request.referrer, self.request.host
68
+ )
63
69
 
64
- return self._build_response(resp, content, PRIVATE_CACHE, "print")
70
+ response = self._build_response(resp, content, Cache.PRIVATE, "print")
71
+ # Mapfish print will check the referer header to return the capabilities.
72
+ response.vary += ("Referer",)
73
+ return response
65
74
 
66
- @CACHE_REGION.cache_on_arguments()
67
- def _capabilities(self, templates, query_string, method):
75
+ @CACHE_REGION.cache_on_arguments() # type: ignore
76
+ def _capabilities(
77
+ self, templates: List[str], query_string: Dict[str, str], method: str, referrer: str, host: str
78
+ ) -> Tuple[requests.Response, str]:
68
79
  del query_string # Just for caching
69
80
  del method # Just for caching
70
- # get URL
71
- _url = self.config["print_url"] + "/capabilities.json"
81
+ del referrer # Just for caching
82
+ del host # Just for caching
83
+
84
+ # Get URL
85
+ _url = self.request.get_organization_print_url() + "/capabilities.json"
72
86
 
73
- response = self._proxy(_url)
87
+ response = self._proxy(Url(_url))
88
+ response.raise_for_status()
74
89
 
75
90
  if self.request.method == "GET":
76
- if response.ok:
77
- try:
78
- capabilities = response.json()
79
- except json.decoder.JSONDecodeError as e:
80
- # log and raise
81
- LOG.error("Unable to parse capabilities.")
82
- LOG.exception(e)
83
- LOG.error(response.text)
84
- raise HTTPBadGateway(response.text)
85
-
86
- capabilities["layouts"] = list(
87
- layout for layout in capabilities["layouts"] if layout["name"] in templates
88
- )
89
-
90
- pretty = self.request.params.get("pretty", "false") == "true"
91
- content = json.dumps(
92
- capabilities, separators=None if pretty else (",", ":"), indent=4 if pretty else None
93
- )
91
+ try:
92
+ capabilities = response.json()
93
+ except json.decoder.JSONDecodeError:
94
+ LOG.exception("Unable to parse capabilities: %s", response.text)
95
+ raise HTTPBadGateway(response.text) # pylint: disable=raise-missing-from
96
+
97
+ capabilities["layouts"] = list(
98
+ layout for layout in capabilities["layouts"] if layout["name"] in templates
99
+ )
100
+
101
+ pretty = self.request.params.get("pretty", "false") == "true"
102
+ content = json.dumps(
103
+ capabilities, separators=None if pretty else (",", ":"), indent=4 if pretty else None
104
+ )
94
105
  else:
95
106
  content = ""
96
107
 
97
108
  return response, content
98
109
 
99
- @view_config(route_name="printproxy_report_create")
100
- def report_create(self):
101
- """ Create PDF. """
110
+ @view_config(route_name="printproxy_report_create") # type: ignore
111
+ def report_create(self) -> pyramid.response.Response:
112
+ """Create PDF."""
102
113
  return self._proxy_response(
103
114
  "print",
104
- "{0!s}/report.{1!s}".format(self.config["print_url"], self.request.matchdict.get("format")),
115
+ Url(
116
+ f"{ self.request.get_organization_print_url()}/report.{self.request.matchdict.get('format')}"
117
+ ),
105
118
  )
106
119
 
107
- @view_config(route_name="printproxy_status")
108
- def status(self):
109
- """ PDF status. """
120
+ @view_config(route_name="printproxy_status") # type: ignore
121
+ def status(self) -> pyramid.response.Response:
122
+ """PDF status."""
110
123
  return self._proxy_response(
111
124
  "print",
112
- "{0!s}/status/{1!s}.json".format(self.config["print_url"], self.request.matchdict.get("ref")),
125
+ Url(
126
+ f"{self.request.get_organization_print_url()}/status/{self.request.matchdict.get('ref')}.json"
127
+ ),
113
128
  )
114
129
 
115
- @view_config(route_name="printproxy_cancel")
116
- def cancel(self):
117
- """ PDF cancel. """
130
+ @view_config(route_name="printproxy_cancel") # type: ignore
131
+ def cancel(self) -> pyramid.response.Response:
132
+ """PDF cancel."""
118
133
  return self._proxy_response(
119
- "print", "{0!s}/cancel/{1!s}".format(self.config["print_url"], self.request.matchdict.get("ref"))
134
+ "print",
135
+ Url(f"{self.request.get_organization_print_url()}/cancel/{self.request.matchdict.get('ref')}"),
120
136
  )
121
137
 
122
- @view_config(route_name="printproxy_report_get")
123
- def report_get(self):
124
- """ Get the PDF. """
125
- url = "{0!s}/report/{1!s}".format(self.config["print_url"], self.request.matchdict.get("ref"))
126
- if self.config.get("print_get_redirect", False):
127
- raise HTTPFound(location=url)
138
+ @view_config(route_name="printproxy_report_get") # type: ignore
139
+ def report_get(self) -> pyramid.response.Response:
140
+ """Get the PDF."""
141
+ url = Url(f"{self.request.get_organization_print_url()}/report/{self.request.matchdict.get('ref')}")
142
+ if self.request.registry.settings.get("print_get_redirect", False):
143
+ raise HTTPFound(location=url.url())
128
144
  return self._proxy_response("print", url)
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- # Copyright (c) 2012-2019, 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
@@ -28,35 +26,40 @@
28
26
  # either expressed or implied, of the FreeBSD Project.
29
27
 
30
28
 
31
- from decimal import Decimal
32
29
  import math
30
+ from decimal import Decimal
31
+ from typing import Any, Dict, List, Tuple
33
32
 
34
33
  import geojson
34
+ import pyramid.request
35
35
  from pyramid.httpexceptions import HTTPNotFound
36
36
  from pyramid.i18n import TranslationStringFactory
37
37
  from pyramid.view import view_config
38
38
 
39
- from c2cgeoportal_geoportal.lib.caching import NO_CACHE, set_common_headers
39
+ from c2cgeoportal_geoportal.lib.common_headers import Cache, set_common_headers
40
40
  from c2cgeoportal_geoportal.views.raster import Raster
41
41
 
42
42
  _ = TranslationStringFactory("c2cgeoportal")
43
43
 
44
44
 
45
45
  class Profile(Raster):
46
- def __init__(self, request):
46
+ """All the view concerned the profile."""
47
+
48
+ def __init__(self, request: pyramid.request.Request):
47
49
  Raster.__init__(self, request)
48
50
 
49
- @view_config(route_name="profile.json", renderer="fast_json")
50
- def json(self):
51
- """answers to /profile.json"""
51
+ @view_config(route_name="profile.json", renderer="fast_json") # type: ignore
52
+ def json(self) -> Dict[str, Any]:
53
+ """Answer to /profile.json."""
52
54
  _, points = self._compute_points()
53
- set_common_headers(self.request, "profile", NO_CACHE)
55
+ set_common_headers(self.request, "profile", Cache.PUBLIC_NO)
54
56
  return {"profile": points}
55
57
 
56
- def _compute_points(self):
57
- """Compute the alt=fct(dist) array"""
58
+ def _compute_points(self) -> Tuple[List[str], List[Dict[str, Any]]]:
59
+ """Compute the alt=fct(dist) array."""
58
60
  geom = geojson.loads(self.request.params["geom"], object_hook=geojson.GeoJSON.to_instance)
59
61
 
62
+ layers: List[str]
60
63
  if "layers" in self.request.params:
61
64
  rasters = {}
62
65
  layers = self.request.params["layers"].split(",")
@@ -64,13 +67,13 @@ class Profile(Raster):
64
67
  if layer in self.rasters:
65
68
  rasters[layer] = self.rasters[layer]
66
69
  else:
67
- raise HTTPNotFound("Layer {0!s} not found".format(layer))
70
+ raise HTTPNotFound(f"Layer {layer!s} not found")
68
71
  else:
69
72
  rasters = self.rasters
70
73
  layers = list(rasters.keys())
71
74
  layers.sort()
72
75
 
73
- points = []
76
+ points: List[Dict[str, Any]] = []
74
77
 
75
78
  dist = 0
76
79
  prev_coord = None
@@ -92,12 +95,12 @@ class Profile(Raster):
92
95
  return layers, points
93
96
 
94
97
  @staticmethod
95
- def _dist(coord1, coord2):
96
- """Compute the distance between 2 points"""
98
+ def _dist(coord1: Tuple[float, float], coord2: Tuple[float, float]) -> float:
99
+ """Compute the distance between 2 points."""
97
100
  return math.sqrt(math.pow(coord1[0] - coord2[0], 2.0) + math.pow(coord1[1] - coord2[1], 2.0))
98
101
 
99
- def _create_points(self, coords, nb_points):
100
- """Add some points in order to reach roughly the asked number of points"""
102
+ def _create_points(self, coords: List[Tuple[float, float]], nb_points: int) -> List[Tuple[float, float]]:
103
+ """Add some points in order to reach roughly the asked number of points."""
101
104
  total_length = 0
102
105
  prev_coord = None
103
106
  for coord in coords:
@@ -108,19 +111,17 @@ class Profile(Raster):
108
111
  if total_length == 0.0:
109
112
  return coords
110
113
 
111
- result = []
114
+ result: List[Tuple[float, float]] = []
112
115
  prev_coord = None
113
116
  for coord in coords:
114
117
  if prev_coord is not None:
115
118
  cur_length = self._dist(prev_coord, coord)
116
- cur_nb_points = int(nb_points * cur_length / total_length + 0.5)
117
- if cur_nb_points < 1:
118
- cur_nb_points = 1
119
+ cur_nb_points = max(int(nb_points * cur_length / total_length + 0.5), 1)
119
120
  dx = (coord[0] - prev_coord[0]) / float(cur_nb_points)
120
121
  dy = (coord[1] - prev_coord[1]) / float(cur_nb_points)
121
122
  for i in range(1, cur_nb_points + 1):
122
- result.append([prev_coord[0] + dx * i, prev_coord[1] + dy * i])
123
+ result.append((prev_coord[0] + dx * i, prev_coord[1] + dy * i))
123
124
  else:
124
- result.append([coord[0], coord[1]])
125
+ result.append((coord[0], coord[1]))
125
126
  prev_coord = coord
126
127
  return result