c2cgeoportal-geoportal 2.6.0__py2.py3-none-any.whl → 2.8.1.180__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. c2cgeoportal_geoportal/__init__.py +245 -95
  2. c2cgeoportal_geoportal/lib/__init__.py +67 -43
  3. c2cgeoportal_geoportal/lib/authentication.py +50 -26
  4. c2cgeoportal_geoportal/lib/bashcolor.py +17 -13
  5. c2cgeoportal_geoportal/lib/cacheversion.py +16 -8
  6. c2cgeoportal_geoportal/lib/caching.py +65 -193
  7. c2cgeoportal_geoportal/lib/check_collector.py +17 -10
  8. c2cgeoportal_geoportal/lib/checker.py +67 -65
  9. c2cgeoportal_geoportal/lib/common_headers.py +167 -0
  10. c2cgeoportal_geoportal/lib/dbreflection.py +61 -46
  11. c2cgeoportal_geoportal/lib/filter_capabilities.py +126 -88
  12. c2cgeoportal_geoportal/lib/fulltextsearch.py +6 -5
  13. c2cgeoportal_geoportal/lib/functionality.py +20 -17
  14. c2cgeoportal_geoportal/lib/headers.py +14 -5
  15. c2cgeoportal_geoportal/lib/i18n.py +4 -4
  16. c2cgeoportal_geoportal/lib/layers.py +30 -11
  17. c2cgeoportal_geoportal/lib/lingua_extractor.py +363 -240
  18. c2cgeoportal_geoportal/lib/loader.py +11 -16
  19. c2cgeoportal_geoportal/lib/metrics.py +28 -17
  20. c2cgeoportal_geoportal/lib/oauth2.py +392 -206
  21. c2cgeoportal_geoportal/lib/wmstparsing.py +105 -84
  22. c2cgeoportal_geoportal/lib/xsd.py +26 -16
  23. c2cgeoportal_geoportal/resources.py +15 -9
  24. c2cgeoportal_geoportal/scaffolds/advance_create/ci/config.yaml +26 -0
  25. c2cgeoportal_geoportal/scaffolds/advance_create/cookiecutter.json +18 -0
  26. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.dockerignore +6 -0
  27. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.eslintrc.yaml +19 -0
  28. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+dot+prospector.yaml → advance_create/{{cookiecutter.project}}/geoportal/.prospector.yaml} +8 -2
  29. c2cgeoportal_geoportal/scaffolds/{create/geoportal/Dockerfile_tmpl → advance_create/{{cookiecutter.project}}/geoportal/Dockerfile} +22 -15
  30. c2cgeoportal_geoportal/scaffolds/{create/geoportal/alembic.yaml_tmpl → advance_create/{{cookiecutter.project}}/geoportal/alembic.yaml} +1 -1
  31. c2cgeoportal_geoportal/scaffolds/{create/geoportal/development.ini_tmpl → advance_create/{{cookiecutter.project}}/geoportal/development.ini} +34 -15
  32. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/gunicorn.conf.py +100 -0
  33. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/lingua-client.cfg +1 -0
  34. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/production.ini +38 -0
  35. c2cgeoportal_geoportal/scaffolds/{create/geoportal/setup.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/setup.py} +6 -7
  36. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/tsconfig.json +8 -0
  37. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.api.js +77 -0
  38. c2cgeoportal_geoportal/scaffolds/{create/geoportal/webpack.apps.js_tmpl → advance_create/{{cookiecutter.project}}/geoportal/webpack.apps.js} +29 -28
  39. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/webpack.commons.js +4 -7
  40. c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/webpack.config.js +1 -1
  41. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py +42 -0
  42. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/authentication.py +10 -0
  43. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/dev.py +14 -0
  44. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/models.py +8 -0
  45. c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_organization.py +7 -0
  46. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/resources.py +4 -3
  47. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal/static-ngeo/api/index.js_tmpl → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static-ngeo/api/index.js} +1 -2
  48. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal/static-ngeo/js/+package+module.js_tmpl → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static-ngeo/js/{{cookiecutter.package}}module.js} +4 -4
  49. c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal/subscribers.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/subscribers.py} +1 -3
  50. c2cgeoportal_geoportal/scaffolds/advance_update/cookiecutter.json +18 -0
  51. c2cgeoportal_geoportal/scaffolds/{update/geoportal/CONST_Makefile_tmpl → advance_update/{{cookiecutter.project}}/geoportal/CONST_Makefile} +3 -27
  52. c2cgeoportal_geoportal/scaffolds/create/cookiecutter.json +18 -0
  53. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.dockerignore +14 -0
  54. c2cgeoportal_geoportal/scaffolds/create/{+dot+editorconfig → {{cookiecutter.project}}/.editorconfig} +2 -5
  55. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/main.yaml +57 -0
  56. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/rebuild.yaml +46 -0
  57. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/update_l10n.yaml +66 -0
  58. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.gitignore +16 -0
  59. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierignore +1 -0
  60. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierrc.yaml +2 -0
  61. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Dockerfile +76 -0
  62. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Makefile +70 -0
  63. c2cgeoportal_geoportal/scaffolds/create/{README.rst_tmpl → {{cookiecutter.project}}/README.rst} +4 -4
  64. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/build +186 -0
  65. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/config.yaml +22 -0
  66. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/docker-compose-check +25 -0
  67. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/requirements.txt +1 -0
  68. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-db.yaml +26 -0
  69. c2cgeoportal_geoportal/scaffolds/create/{docker-compose-lib.yaml → {{cookiecutter.project}}/docker-compose-lib.yaml} +165 -22
  70. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-qgis.yaml +23 -0
  71. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose.override.sample.yaml +66 -0
  72. c2cgeoportal_geoportal/scaffolds/create/{docker-compose.yaml → {{cookiecutter.project}}/docker-compose.yaml} +20 -15
  73. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.default +101 -0
  74. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.project +69 -0
  75. c2cgeoportal_geoportal/scaffolds/create/{geoportal/vars.yaml_tmpl → {{cookiecutter.project}}/geoportal/vars.yaml} +126 -36
  76. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/mobile.css +0 -0
  77. c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/data/Readme.txt +3 -3
  78. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/demo.map.tmpl +224 -0
  79. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/mapserver.conf +15 -0
  80. c2cgeoportal_geoportal/scaffolds/create/{mapserver/mapserver.map.tmpl_tmpl → {{cookiecutter.project}}/mapserver/mapserver.map.tmpl} +9 -18
  81. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Landscape.jrxml +13 -8
  82. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Portrait.jrxml +13 -8
  83. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Landscape.jrxml +13 -8
  84. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Portrait.jrxml +13 -8
  85. c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/config.yaml.tmpl +11 -4
  86. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/localisation.properties +4 -0
  87. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/localisation_fr.properties +4 -0
  88. c2cgeoportal_geoportal/scaffolds/create/{project.yaml_tmpl → {{cookiecutter.project}}/project.yaml} +6 -6
  89. c2cgeoportal_geoportal/scaffolds/create/{pyproject.toml → {{cookiecutter.project}}/pyproject.toml} +4 -0
  90. c2cgeoportal_geoportal/scaffolds/create/{qgisserver/pg_service.conf.tmpl_tmpl → {{cookiecutter.project}}/qgisserver/pg_service.conf.tmpl} +2 -2
  91. c2cgeoportal_geoportal/scaffolds/create/{run_alembic.sh → {{cookiecutter.project}}/run_alembic.sh} +3 -5
  92. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-backup +110 -0
  93. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-restore +114 -0
  94. c2cgeoportal_geoportal/scaffolds/create/{setup.cfg_tmpl → {{cookiecutter.project}}/setup.cfg} +1 -1
  95. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/spell-ignore-words.txt +5 -0
  96. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tests/__init__.py +0 -0
  97. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tests/test_app.py +38 -0
  98. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tilegeneration/config.yaml.tmpl +195 -0
  99. c2cgeoportal_geoportal/scaffolds/update/cookiecutter.json +18 -0
  100. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/.upgrade.yaml +61 -0
  101. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_CHANGELOG.txt +273 -0
  102. c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_create_template/tests/test_testapp.py +48 -0
  103. c2cgeoportal_geoportal/scaffolds/update/{geoportal → {{cookiecutter.project}}/geoportal}/CONST_config-schema.yaml +64 -17
  104. c2cgeoportal_geoportal/scaffolds/update/{geoportal/CONST_vars.yaml_tmpl → {{cookiecutter.project}}/geoportal/CONST_vars.yaml} +396 -19
  105. c2cgeoportal_geoportal/scripts/__init__.py +16 -30
  106. c2cgeoportal_geoportal/scripts/c2cupgrade.py +272 -234
  107. c2cgeoportal_geoportal/scripts/create_demo_theme.py +3 -6
  108. c2cgeoportal_geoportal/scripts/manage_users.py +34 -39
  109. c2cgeoportal_geoportal/scripts/pcreate.py +310 -0
  110. c2cgeoportal_geoportal/scripts/theme2fts.py +128 -24
  111. c2cgeoportal_geoportal/scripts/urllogin.py +19 -11
  112. c2cgeoportal_geoportal/templates/login.html +88 -84
  113. c2cgeoportal_geoportal/templates/notlogin.html +59 -59
  114. c2cgeoportal_geoportal/templates/testi18n.html +6 -8
  115. c2cgeoportal_geoportal/views/__init__.py +23 -6
  116. c2cgeoportal_geoportal/views/dev.py +9 -7
  117. c2cgeoportal_geoportal/views/dynamic.py +56 -19
  118. c2cgeoportal_geoportal/views/entry.py +85 -24
  119. c2cgeoportal_geoportal/views/fulltextsearch.py +29 -23
  120. c2cgeoportal_geoportal/views/geometry_processing.py +17 -9
  121. c2cgeoportal_geoportal/views/i18n.py +91 -9
  122. c2cgeoportal_geoportal/views/layers.py +166 -133
  123. c2cgeoportal_geoportal/views/login.py +161 -93
  124. c2cgeoportal_geoportal/views/mapserverproxy.py +47 -31
  125. c2cgeoportal_geoportal/views/memory.py +12 -12
  126. c2cgeoportal_geoportal/views/ogcproxy.py +52 -30
  127. c2cgeoportal_geoportal/views/pdfreport.py +30 -26
  128. c2cgeoportal_geoportal/views/printproxy.py +60 -52
  129. c2cgeoportal_geoportal/views/profile.py +24 -23
  130. c2cgeoportal_geoportal/views/proxy.py +88 -72
  131. c2cgeoportal_geoportal/views/raster.py +37 -26
  132. c2cgeoportal_geoportal/views/resourceproxy.py +13 -11
  133. c2cgeoportal_geoportal/views/shortener.py +27 -25
  134. c2cgeoportal_geoportal/views/theme.py +472 -332
  135. c2cgeoportal_geoportal/views/tinyowsproxy.py +42 -44
  136. c2cgeoportal_geoportal/views/vector_tiles.py +80 -0
  137. {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.8.1.180.dist-info}/METADATA +19 -8
  138. c2cgeoportal_geoportal-2.8.1.180.dist-info/RECORD +191 -0
  139. {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.8.1.180.dist-info}/WHEEL +1 -1
  140. {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.8.1.180.dist-info}/entry_points.txt +3 -0
  141. tests/__init__.py +10 -5
  142. tests/test_cachebuster.py +3 -5
  143. tests/test_caching.py +18 -26
  144. tests/test_checker.py +1 -3
  145. tests/test_decimaljson.py +5 -5
  146. tests/test_headerstween.py +1 -3
  147. tests/test_i18n.py +2 -2
  148. tests/test_init.py +16 -20
  149. tests/test_locale_negociator.py +4 -6
  150. tests/test_mapserverproxy_route_predicate.py +1 -4
  151. tests/test_raster.py +15 -17
  152. tests/test_wmstparsing.py +10 -12
  153. tests/xmlstr.py +1 -3
  154. c2cgeoportal_geoportal/scaffolds/__init__.py +0 -227
  155. c2cgeoportal_geoportal/scaffolds/create/+dot+dockerignore_tmpl +0 -12
  156. c2cgeoportal_geoportal/scaffolds/create/+dot+github/workflows/main.yaml_tmpl +0 -89
  157. c2cgeoportal_geoportal/scaffolds/create/+dot+github/workflows/rebuild.yaml_tmpl +0 -78
  158. c2cgeoportal_geoportal/scaffolds/create/+dot+gitignore_tmpl +0 -16
  159. c2cgeoportal_geoportal/scaffolds/create/Dockerfile_tmpl +0 -67
  160. c2cgeoportal_geoportal/scaffolds/create/Makefile +0 -3
  161. c2cgeoportal_geoportal/scaffolds/create/build_tmpl +0 -167
  162. c2cgeoportal_geoportal/scaffolds/create/ci/config.yaml_tmpl +0 -23
  163. c2cgeoportal_geoportal/scaffolds/create/ci/requirements.txt +0 -1
  164. c2cgeoportal_geoportal/scaffolds/create/ci/trigger +0 -68
  165. c2cgeoportal_geoportal/scaffolds/create/docker-compose.override.sample.yaml +0 -54
  166. c2cgeoportal_geoportal/scaffolds/create/env.default_tmpl +0 -67
  167. c2cgeoportal_geoportal/scaffolds/create/env.project_tmpl +0 -48
  168. c2cgeoportal_geoportal/scaffolds/create/geoportal/+dot+dockerignore_tmpl +0 -6
  169. c2cgeoportal_geoportal/scaffolds/create/geoportal/+dot+eslintrc_tmpl +0 -15
  170. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/__init__.py_tmpl +0 -58
  171. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/models.py_tmpl +0 -10
  172. c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static/robot.txt +0 -3
  173. c2cgeoportal_geoportal/scaffolds/create/geoportal/production.ini_tmpl +0 -106
  174. c2cgeoportal_geoportal/scaffolds/create/geoportal/tools/extract-messages.js +0 -39
  175. c2cgeoportal_geoportal/scaffolds/create/geoportal/tsconfig.json_tmpl +0 -9
  176. c2cgeoportal_geoportal/scaffolds/create/geoportal/webpack.api.js_tmpl +0 -72
  177. c2cgeoportal_geoportal/scaffolds/create/mapserver/demo.map.tmpl_tmpl +0 -262
  178. c2cgeoportal_geoportal/scaffolds/create/mapserver/tinyows.xml +0 -36
  179. c2cgeoportal_geoportal/scaffolds/create/print/print-apps/+package+/config.yaml +0 -168
  180. c2cgeoportal_geoportal/scaffolds/create/qgisserver/geomapfish.yaml.tmpl_tmpl +0 -16
  181. c2cgeoportal_geoportal/scaffolds/create/spell-ignore-words.txt +0 -1
  182. c2cgeoportal_geoportal/scaffolds/create/tilegeneration/config.yaml.tmpl_tmpl +0 -185
  183. c2cgeoportal_geoportal/scaffolds/create/yamllint.yaml +0 -11
  184. c2cgeoportal_geoportal/scaffolds/update/+dot+upgrade.yaml_tmpl +0 -181
  185. c2cgeoportal_geoportal/scaffolds/update/CONST_CHANGELOG.txt_tmpl +0 -454
  186. c2cgeoportal_geoportal/templates/dynamic.js +0 -21
  187. c2cgeoportal_geoportal-2.6.0.dist-info/RECORD +0 -173
  188. /c2cgeoportal_geoportal/{scaffolds/create/geoportal/+package+_geoportal/static/css/desktop.css → py.typed} +0 -0
  189. /c2cgeoportal_geoportal/scaffolds/{create/geoportal/Makefile_tmpl → advance_create/{{cookiecutter.project}}/geoportal/Makefile} +0 -0
  190. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/alembic.ini +0 -0
  191. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/language_mapping +0 -0
  192. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/lingua-server.cfg +0 -0
  193. /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/requirements.txt +0 -0
  194. /c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/views/__init__.py +0 -0
  195. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal/locale/en/LC_MESSAGES/+package+_geoportal-client.po → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/locale/en/LC_MESSAGES/{{cookiecutter.package}}_geoportal-client.po} +0 -0
  196. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal/static/css/iframe_api.css → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/desktop.css} +0 -0
  197. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal/static/css/mobile.css → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/iframe_api.css} +0 -0
  198. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/banner_left.png +0 -0
  199. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/banner_right.png +0 -0
  200. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/blank.png +0 -0
  201. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker-blue.png +0 -0
  202. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker-gold.png +0 -0
  203. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker-green.png +0 -0
  204. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker.png +0 -0
  205. /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/robot.txt.tmpl +0 -0
  206. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/data/TM_EUROPE_BORDERS-0.3.sql +0 -0
  207. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arial.ttf +0 -0
  208. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arialbd.ttf +0 -0
  209. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arialbi.ttf +0 -0
  210. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Ariali.ttf +0 -0
  211. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Bold.ttf +0 -0
  212. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-BoldItalic.ttf +0 -0
  213. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Italic.ttf +0 -0
  214. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Regular.ttf +0 -0
  215. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdana.ttf +0 -0
  216. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanab.ttf +0 -0
  217. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanai.ttf +0 -0
  218. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanaz.ttf +0 -0
  219. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts.conf +0 -0
  220. /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/tinyows.xml.tmpl +0 -0
  221. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/legend.jrxml +0 -0
  222. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/logo.png +0 -0
  223. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/north.svg +0 -0
  224. /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/results.jrxml +0 -0
  225. {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.8.1.180.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- # Copyright (c) 2013-2020, Camptocamp SA
1
+ # Copyright (c) 2013-2023, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
6
4
  # Redistribution and use in source and binary forms, with or without
@@ -29,12 +27,15 @@
29
27
 
30
28
 
31
29
  import datetime
32
- from typing import Optional, cast
30
+ from typing import Any, Dict, List, Optional, Set, Tuple, Union
33
31
 
34
32
  import isodate
35
33
 
34
+ TimeExtent = Union["TimeExtentValue", "TimeExtentInterval"]
35
+
36
36
 
37
- def min_none(a, b):
37
+ def min_none(a: Optional[datetime.datetime], b: Optional[datetime.datetime]) -> Optional[datetime.datetime]:
38
+ """Return the min value, support non in input."""
38
39
  if a is None:
39
40
  return b
40
41
  if b is None:
@@ -42,7 +43,8 @@ def min_none(a, b):
42
43
  return min(a, b)
43
44
 
44
45
 
45
- def max_none(a, b):
46
+ def max_none(a: Optional[datetime.datetime], b: Optional[datetime.datetime]) -> Optional[datetime.datetime]:
47
+ """Return the max value, support non in input."""
46
48
  if a is None:
47
49
  return b
48
50
  if b is None:
@@ -52,21 +54,22 @@ def max_none(a, b):
52
54
 
53
55
  class TimeInformation:
54
56
  """
57
+ Collect the WMS time information.
58
+
55
59
  Arguments:
56
60
 
57
- * ``extent`` A time extent instance (``TimeExtentValue`` or
58
- ``TimeExtentInterval``)
59
- * ``mode`` The layer mode ("single", "range" or "disabled")
60
- * ``widget`` The layer mode ("slider" (default) or "datepicker")
61
+ extent: A time extent instance (``TimeExtentValue`` or ``TimeExtentInterval``)
62
+ mode: The layer mode ("single", "range" or "disabled")
63
+ widget: The layer mode ("slider" (default) or "datepicker")
61
64
  """
62
65
 
63
- def __init__(self):
64
- self.extent: Optional[TimeExtentValue] = None
65
- self.mode = None
66
- self.widget = None
67
- self.layer = None
66
+ def __init__(self) -> None:
67
+ self.extent: Optional[TimeExtent] = None
68
+ self.mode: Optional[str] = None
69
+ self.widget: Optional[str] = None
70
+ self.layer: Optional[Dict[str, Any]] = None
68
71
 
69
- def merge(self, layer, extent, mode, widget):
72
+ def merge(self, layer: Dict[str, Any], extent: TimeExtent, mode: str, widget: str) -> None:
70
73
  layer_apply = self.layer == layer or (not self.has_time() and extent is not None)
71
74
 
72
75
  self.merge_extent(extent)
@@ -80,35 +83,37 @@ class TimeInformation:
80
83
  del self.layer["time"]
81
84
  self.layer = None
82
85
 
83
- def merge_extent(self, extent):
86
+ def merge_extent(self, extent: TimeExtent) -> None:
84
87
  if self.extent is not None:
85
88
  self.extent.merge(extent)
86
89
  else:
87
90
  self.extent = extent
88
91
 
89
- def merge_mode(self, mode):
92
+ def merge_mode(self, mode: str) -> None:
90
93
  if mode != "disabled":
91
94
  if self.mode is not None:
92
95
  if self.mode != mode:
93
- raise ValueError("Could not mix time mode '{0!s}' and '{1!s}'".format(mode, self.mode))
96
+ raise ValueError(f"Could not mix time mode '{mode!s}' and '{self.mode!s}'")
94
97
  else:
95
98
  self.mode = mode
96
99
 
97
- def merge_widget(self, widget):
100
+ def merge_widget(self, widget: Optional[str]) -> None:
98
101
  widget = "slider" if not widget else widget
102
+ assert widget is not None
99
103
 
100
104
  if self.widget is not None:
101
105
  if self.widget != widget:
102
- raise ValueError("Could not mix time widget '{0!s}' and '{1!s}'".format(widget, self.widget))
106
+ raise ValueError(f"Could not mix time widget '{widget!s}' and '{self.widget!s}'")
103
107
  else:
104
108
  self.widget = widget
105
109
 
106
- def has_time(self):
110
+ def has_time(self) -> bool:
107
111
  return self.extent is not None
108
112
 
109
- def to_dict(self):
113
+ def to_dict(self) -> Optional[Dict[str, Any]]:
110
114
  if self.has_time():
111
- time = cast(TimeExtentValue, self.extent).to_dict()
115
+ assert self.extent is not None
116
+ time = self.extent.to_dict()
112
117
  time["mode"] = self.mode
113
118
  time["widget"] = self.widget
114
119
  return time
@@ -116,34 +121,38 @@ class TimeInformation:
116
121
 
117
122
 
118
123
  class TimeExtentValue:
119
- """
120
- Represents time as a list of values.
121
- """
122
-
123
- def __init__(self, values, resolution, min_def_value, max_def_value):
124
+ """Represents time as a list of values."""
125
+
126
+ def __init__(
127
+ self,
128
+ values: Set[datetime.datetime],
129
+ resolution: str,
130
+ min_def_value: Optional[datetime.datetime],
131
+ max_def_value: Optional[datetime.datetime],
132
+ ):
124
133
  """
134
+ Initialize.
135
+
125
136
  Arguments:
126
137
 
127
- * ``values`` A set() of datetime
128
- * ``resolution`` The resolution from the mapfile time definition
129
- * ``min_def_value`` the minimum default value as a datetime
130
- * ``max_def_value`` the maximum default value as a datetime
138
+ values: A set() of datetime
139
+ resolution: The resolution from the mapfile time definition
140
+ min_def_value: the minimum default value as a datetime
141
+ max_def_value: the maximum default value as a datetime
131
142
  """
132
143
  self.values = values
133
144
  self.resolution = resolution
134
145
  self.min_def_value = min_def_value
135
146
  self.max_def_value = max_def_value
136
147
 
137
- def merge(self, extent):
148
+ def merge(self, extent: TimeExtent) -> None:
138
149
  if not isinstance(extent, TimeExtentValue):
139
- raise ValueError(
140
- "Could not mix time defined as a list of " "values with other type of definition"
141
- )
150
+ raise ValueError("Could not mix time defined as a list of values with other type of definition")
142
151
  self.values.update(extent.values)
143
152
  self.min_def_value = min_none(self.min_def_value, extent.min_def_value)
144
153
  self.max_def_value = max_none(self.max_def_value, extent.max_def_value)
145
154
 
146
- def to_dict(self):
155
+ def to_dict(self) -> Dict[str, Any]:
147
156
  values = sorted(self.values)
148
157
  min_def_value = _format_date(self.min_def_value) if self.min_def_value else None
149
158
  max_def_value = _format_date(self.max_def_value) if self.max_def_value else None
@@ -159,20 +168,28 @@ class TimeExtentValue:
159
168
 
160
169
 
161
170
  class TimeExtentInterval:
162
- """
163
- Represents time with the help of a start, an end and an interval.
164
- """
165
-
166
- def __init__(self, start, end, interval, resolution, min_def_value, max_def_value):
171
+ """Represents time with the help of a start, an end and an interval."""
172
+
173
+ def __init__(
174
+ self,
175
+ start: datetime.datetime,
176
+ end: datetime.datetime,
177
+ interval: Tuple[int, int, int, int],
178
+ resolution: str,
179
+ min_def_value: Optional[datetime.datetime],
180
+ max_def_value: Optional[datetime.datetime],
181
+ ):
167
182
  """
183
+ Initialize.
184
+
168
185
  Arguments:
169
186
 
170
- * ``start`` The start value as a datetime
171
- * ``end`` The end value as a datetime
172
- * ``interval`` The interval as a tuple (years, months, days, seconds)
173
- * ``resolution`` The resolution from the mapfile time definition
174
- * ``min_def_value`` the minimum default value as a datetime
175
- * ``max_def_value`` the maximum default value as a datetime
187
+ start: The start value as a datetime
188
+ end: The end value as a datetime
189
+ interval: The interval as a tuple (years, months, days, seconds)
190
+ resolution: The resolution from the mapfile time definition
191
+ min_def_value: the minimum default value as a datetime
192
+ max_def_value: the maximum default value as a datetime
176
193
  """
177
194
  self.start = start
178
195
  self.end = end
@@ -181,15 +198,17 @@ class TimeExtentInterval:
181
198
  self.min_def_value = min_def_value
182
199
  self.max_def_value = max_def_value
183
200
 
184
- def merge(self, extent):
201
+ def merge(self, extent: TimeExtent) -> None:
185
202
  if not isinstance(extent, TimeExtentInterval):
186
- raise ValueError(
187
- "Could not merge time defined as with an " " interval with other type of definition"
188
- )
203
+ raise ValueError("Could not merge time defined as with an interval with other type of definition")
189
204
  if self.interval != extent.interval:
190
- raise ValueError("Could not merge times defined with a " "different interval")
191
- self.start = min_none(self.start, extent.start)
192
- self.end = max_none(self.end, extent.end)
205
+ raise ValueError("Could not merge times defined with a different interval")
206
+ start = min_none(self.start, extent.start)
207
+ assert start is not None
208
+ self.start = start
209
+ end = max_none(self.end, extent.end)
210
+ assert end is not None
211
+ self.end = end
193
212
  self.min_def_value = (
194
213
  self.min_def_value
195
214
  if extent.min_def_value is None
@@ -205,7 +224,7 @@ class TimeExtentInterval:
205
224
  else max_none(self.max_def_value, extent.max_def_value)
206
225
  )
207
226
 
208
- def to_dict(self):
227
+ def to_dict(self) -> Dict[str, Any]:
209
228
  min_def_value = _format_date(self.min_def_value) if self.min_def_value is not None else None
210
229
  max_def_value = _format_date(self.max_def_value) if self.max_def_value is not None else None
211
230
 
@@ -219,10 +238,9 @@ class TimeExtentInterval:
219
238
  }
220
239
 
221
240
 
222
- def parse_extent(extent, default_values):
241
+ def parse_extent(extent: List[str], default_values: str) -> TimeExtent:
223
242
  """
224
- Parse a time extend from OWSLib to a `̀ TimeExtentValue`` or a
225
- ``TimeExtentInterval``
243
+ Parse a time extend from OWSLib to a `̀ TimeExtentValue`` or a ``TimeExtentInterval``.
226
244
 
227
245
  Two formats are supported:
228
246
  * ['start/end/interval']
@@ -236,7 +254,7 @@ def parse_extent(extent, default_values):
236
254
  if extent[0].count("/") > 0:
237
255
  # case "start/end/interval"
238
256
  if len(extent) > 1 or extent[0].count("/") != 2:
239
- raise ValueError("Unsupported time definition '{0!s}'".format(extent))
257
+ raise ValueError(f"Unsupported time definition '{extent!s}'")
240
258
  s, e, i = extent[0].split("/")
241
259
  start = _parse_date(s)
242
260
  end = _parse_date(e)
@@ -246,20 +264,19 @@ def parse_extent(extent, default_values):
246
264
  # case "value1, value2, ..., valueN"
247
265
  dates = [_parse_date(d) for d in extent]
248
266
  resolution = dates[0][0]
249
- values = set(d[1] for d in dates)
267
+ values = {d[1] for d in dates}
250
268
 
251
269
  return TimeExtentValue(values, resolution, min_def_value, max_def_value)
252
- raise ValueError("Invalid time extent format '{}'".format(extent))
270
+ raise ValueError(f"Invalid time extent format '{extent}'")
253
271
 
254
272
 
255
- def _parse_default_values(default_values):
273
+ def _parse_default_values(default_values: str) -> Tuple[datetime.datetime, Optional[datetime.datetime]]:
256
274
  """
257
- Parse the 'default' value from OWSLib's defaulttimeposition
258
- and return a maximum of two dates. default value must be a
259
- slash separated String.
260
- return None on the seconde value if it does not exist.
275
+ Parse the 'default' value from OWSLib's defaulttimeposition and return a maximum of two dates.
276
+
277
+ default value must be a slash separated String. return None on the seconde value if it does not exist.
261
278
  """
262
- if default_values is None: # pragma: no cover
279
+ if default_values is None:
263
280
  return None, None
264
281
 
265
282
  def_value = default_values.split("/")
@@ -273,14 +290,16 @@ def _parse_default_values(default_values):
273
290
  return min_def_value, max_def_value
274
291
 
275
292
 
276
- def _parse_date(date):
293
+ def _parse_date(date: str) -> Tuple[str, datetime.datetime]:
277
294
  """
278
- Parses a string into a tuple containing:
295
+ Parse a date string.
296
+
297
+ Return a tuple containing:
279
298
 
280
299
  * the resolution: "year", "month", "day" or "second"
281
300
  * the date as a datetime
282
301
 
283
- The returned datetime always has a timezone (default to UTC)
302
+ The returned datetime always has a timezone (default is UTC)
284
303
  """
285
304
  resolutions = {"year": "%Y", "month": "%Y-%m", "day": "%Y-%m-%d"}
286
305
 
@@ -288,7 +307,7 @@ def _parse_date(date):
288
307
  try:
289
308
  dt = datetime.datetime.strptime(date, pattern)
290
309
  return resolution, dt.replace(tzinfo=isodate.UTC)
291
- except Exception:
310
+ except Exception: # nosec
292
311
  pass
293
312
 
294
313
  try:
@@ -296,33 +315,35 @@ def _parse_date(date):
296
315
  if dt.tzinfo is None:
297
316
  dt = dt.replace(tzinfo=isodate.UTC)
298
317
  return "second", dt
299
- except Exception:
300
- raise ValueError("Invalid date format '{0!s}'".format(date))
318
+ except Exception as e:
319
+ raise ValueError(f"Invalid date format '{date}'") from e
301
320
 
302
321
 
303
- def _format_date(date):
304
- assert isinstance(date, datetime.datetime)
322
+ def _format_date(date: datetime.datetime) -> str:
305
323
  str_ = isodate.datetime_isoformat(date)
324
+ assert isinstance(str_, str)
306
325
  if date.tzinfo is None:
307
326
  str_ += "Z"
308
327
  return str_
309
328
 
310
329
 
311
- def _parse_duration(duration):
330
+ def _parse_duration(duration: str) -> Tuple[int, int, int, int]:
312
331
  """
313
- Parses an ISO 8601 duration (i.e. "P2DT5S") and returns a tuple containing:
332
+ Parse an ISO 8601 duration (i.e. "P2DT5S").
333
+
334
+ Return a tuple containing:
314
335
 
315
336
  * years
316
337
  * months
317
338
  * days
318
339
  * seconds
319
340
  """
320
- duration = isodate.parse_duration(duration)
341
+ parsed_duration = isodate.parse_duration(duration)
321
342
 
322
343
  # casting years and months to int as isodate might return a float
323
344
  return (
324
- int(duration.years) if hasattr(duration, "years") else 0,
325
- int(duration.months) if hasattr(duration, "months") else 0,
326
- duration.days,
327
- duration.seconds,
345
+ int(parsed_duration.years) if hasattr(parsed_duration, "years") else 0,
346
+ int(parsed_duration.months) if hasattr(parsed_duration, "months") else 0,
347
+ parsed_duration.days,
348
+ parsed_duration.seconds,
328
349
  )
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  # Copyright (c) 2018-2021, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
@@ -29,17 +27,25 @@
29
27
 
30
28
 
31
29
  from io import BytesIO
30
+ from typing import Any, Callable, Dict, Optional, Type, Union, cast
32
31
 
32
+ import sqlalchemy.sql.schema
33
33
  from papyrus.xsd import XSDGenerator as PapyrusXSDGenerator
34
34
  from papyrus.xsd import tag
35
+ from sqlalchemy.ext.declarative import DeclarativeMeta
35
36
  from sqlalchemy.orm.properties import ColumnProperty
36
37
  from sqlalchemy.orm.util import class_mapper
37
38
 
38
39
 
39
- class XSDGenerator(PapyrusXSDGenerator):
40
- def add_class_properties_xsd(self, tb, cls):
41
- """Add the XSD for the class properties to the ``TreeBuilder``. And
42
- call the user ``sequence_callback``."""
40
+ class XSDGenerator(PapyrusXSDGenerator): # type: ignore
41
+ """Extends the PapyrusXSDGenerator."""
42
+
43
+ def add_class_properties_xsd(self, tb: str, cls: DeclarativeMeta) -> None:
44
+ """
45
+ Add the XSD for the class properties to the ``TreeBuilder``.
46
+
47
+ And call the user ``sequence_callback``.
48
+ """
43
49
  mapper = class_mapper(cls)
44
50
  properties = []
45
51
  if cls.__attributes_order__:
@@ -62,7 +68,7 @@ class XSDGenerator(PapyrusXSDGenerator):
62
68
  if self.sequence_callback:
63
69
  self.sequence_callback(tb, cls)
64
70
 
65
- def add_column_property_xsd(self, tb, column_property):
71
+ def add_column_property_xsd(self, tb: str, column_property: ColumnProperty) -> None:
66
72
  column = column_property.columns[0]
67
73
  if column.foreign_keys:
68
74
  self.add_association_proxy_xsd(tb, column_property)
@@ -70,7 +76,7 @@ class XSDGenerator(PapyrusXSDGenerator):
70
76
 
71
77
  super().add_column_property_xsd(tb, column_property)
72
78
 
73
- def add_association_proxy_xsd(self, tb, column_property):
79
+ def add_association_proxy_xsd(self, tb: str, column_property: ColumnProperty) -> None:
74
80
  from c2cgeoportal_commons.models import DBSession # pylint: disable=import-outside-toplevel
75
81
 
76
82
  column = column_property.columns[0]
@@ -96,7 +102,7 @@ class XSDGenerator(PapyrusXSDGenerator):
96
102
  pass
97
103
  self.element_callback(tb4, column)
98
104
 
99
- def element_callback(self, tb, column):
105
+ def element_callback(self, tb: str, column: sqlalchemy.sql.schema.Column) -> None:
100
106
  if column.info.get("readonly"):
101
107
  with tag(tb, "xsd:annotation"):
102
108
  with tag(tb, "xsd:appinfo"):
@@ -105,12 +111,14 @@ class XSDGenerator(PapyrusXSDGenerator):
105
111
 
106
112
 
107
113
  class XSD:
114
+ """The XSD file generator on a pyramid view."""
115
+
108
116
  def __init__(
109
117
  self,
110
- include_primary_keys=False,
111
- include_foreign_keys=False,
112
- sequence_callback=None,
113
- element_callback=None,
118
+ include_primary_keys: bool = False,
119
+ include_foreign_keys: bool = False,
120
+ sequence_callback: Optional[str] = None,
121
+ element_callback: Optional[str] = None,
114
122
  ):
115
123
  self.generator = XSDGenerator(
116
124
  include_primary_keys=include_primary_keys,
@@ -119,14 +127,16 @@ class XSD:
119
127
  element_callback=element_callback,
120
128
  )
121
129
 
122
- def __call__(self, table):
123
- def _render(cls, system):
130
+ def __call__(
131
+ self, table: str
132
+ ) -> Callable[[Union[Type[str], Type[bytes]], Dict[str, Any]], Optional[bytes]]:
133
+ def _render(cls: Union[Type[str], Type[bytes]], system: Dict[str, Any]) -> Optional[bytes]:
124
134
  request = system.get("request")
125
135
  if request is not None:
126
136
  response = request.response
127
137
  response.content_type = "application/xml"
128
138
  io = self.generator.get_class_xsd(BytesIO(), cls)
129
- return io.getvalue()
139
+ return cast(bytes, io.getvalue())
130
140
  return None
131
141
 
132
142
  return _render
@@ -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,18 +25,26 @@
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
 
28
+ from typing import List
29
+
30
+ import pyramid.request
31
+
30
32
 
31
33
  class Root:
32
- def __init__(self, request):
33
- self.request = request # pragma: no cover
34
+ """The pyramid root object."""
34
35
 
36
+ def __init__(self, request: pyramid.request.Request):
37
+ self.request = request
35
38
 
36
- def defaultgroupsfinder(username, request):
39
+
40
+ def defaultgroupsfinder(username: str, request: pyramid.request.Request) -> List[str]:
37
41
  """
38
- The c2cgeoportal default group finder. To be used as the callback of the ``AuthTktAuthenticationPolicy``
39
- or any callback-based authentication policy.
42
+ Get the c2cgeoportal default group finder.
43
+
44
+ To be used as the callback of the ``AuthTktAuthenticationPolicy`` or any callback-based authentication
45
+ policy.
40
46
  """
41
47
  del username # unused
42
48
  if not hasattr(request, "user") or request.user is None:
43
- return [] # pragma: no cover
49
+ return []
44
50
  return [role.name for role in request.user.roles]
@@ -0,0 +1,26 @@
1
+ # yaml-language-server: $schema=https://raw.githubusercontent.com/camptocamp/c2cciutils/master/c2cciutils/schema.json
2
+
3
+ checks:
4
+ black: False
5
+ isort: False
6
+ prettier: False
7
+ codespell: False
8
+ eof: False
9
+ required_workflows: False
10
+ dependabot_config: False
11
+ prospector_config: False
12
+ setup: False
13
+
14
+ version:
15
+ branch_to_version_re:
16
+ - from: (prod-[0-9]+-[0-9]+)
17
+ to: \1
18
+ - from: (int-[0-9]+-[0-9]+)
19
+ to: \1
20
+
21
+ publish:
22
+ pypi: false
23
+ docker:
24
+ images:
25
+ - name: camptocamp/{{cookiecutter.package}}-config
26
+ - name: camptocamp/{{cookiecutter.package}}-geoportal
@@ -0,0 +1,18 @@
1
+ {
2
+ "project": "test_project",
3
+ "package": "test_project",
4
+ "srid": "2056",
5
+ "extent": "",
6
+ "extent_mapserver": "",
7
+ "authtkt_secret": "",
8
+ "unsafe_long_version": false,
9
+ "geomapfish_version": "",
10
+ "geomapfish_main_version": "",
11
+ "geomapfish_main_version_dash": "",
12
+ "geomapfish_main_minor_version": "",
13
+ "geomapfish_version_tag": "",
14
+ "geomapfish_version_tag_env": "",
15
+ "geomapfish_major_version_tag": "",
16
+ "geomapfish_major_version_tag_env": "",
17
+ "_copy_without_render": ["*.po", "*/contextualdata.html"]
18
+ }
@@ -0,0 +1,6 @@
1
+ Dockerfile
2
+ vars*.yaml
3
+ CONST_vars.yaml
4
+ CONST_config-schema.yaml
5
+ {{cookiecutter.package}}_geoportal/locale
6
+ {{cookiecutter.package}}_geoportal/static
@@ -0,0 +1,19 @@
1
+ extends:
2
+ - eslint:recommended
3
+
4
+ globals:
5
+ '{{cookiecutter.package}}': false
6
+
7
+ env:
8
+ es6: true
9
+ node: true
10
+ browser: true
11
+ jquery: true
12
+
13
+ parserOptions:
14
+ sourceType: module
15
+ ecmaVersion: 2020
16
+
17
+ rules:
18
+ no-console: 0
19
+ no-unused-vars: 0
@@ -1,5 +1,6 @@
1
- ---
2
- pep8:
1
+ max-line-length: 110
2
+
3
+ pycodestyle:
3
4
  options:
4
5
  max-line-length: 110
5
6
  disable:
@@ -12,6 +13,11 @@ pylint:
12
13
  - too-many-locals
13
14
  - too-many-statements
14
15
  - too-many-branches
16
+ - c-extension-no-member
17
+
18
+ pyflakes:
19
+ disable:
20
+ - F401
15
21
 
16
22
  mccabe:
17
23
  run: false