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) 2013-2020, Camptocamp SA
1
+ # Copyright (c) 2013-2024, 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
+ Initialise.
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,31 +198,37 @@ 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
196
- else extent.min_def_value
197
- if self.min_def_value is None
198
- else min_none(self.min_def_value, extent.min_def_value)
215
+ else (
216
+ extent.min_def_value
217
+ if self.min_def_value is None
218
+ else min_none(self.min_def_value, extent.min_def_value)
219
+ )
199
220
  )
200
221
  self.max_def_value = (
201
222
  self.max_def_value
202
223
  if extent.max_def_value is None
203
- else extent.max_def_value
204
- if self.max_def_value is None
205
- else max_none(self.max_def_value, extent.max_def_value)
224
+ else (
225
+ extent.max_def_value
226
+ if self.max_def_value is None
227
+ else max_none(self.max_def_value, extent.max_def_value)
228
+ )
206
229
  )
207
230
 
208
- def to_dict(self):
231
+ def to_dict(self) -> Dict[str, Any]:
209
232
  min_def_value = _format_date(self.min_def_value) if self.min_def_value is not None else None
210
233
  max_def_value = _format_date(self.max_def_value) if self.max_def_value is not None else None
211
234
 
@@ -219,10 +242,9 @@ class TimeExtentInterval:
219
242
  }
220
243
 
221
244
 
222
- def parse_extent(extent, default_values):
245
+ def parse_extent(extent: List[str], default_values: str) -> TimeExtent:
223
246
  """
224
- Parse a time extend from OWSLib to a `̀ TimeExtentValue`` or a
225
- ``TimeExtentInterval``
247
+ Parse a time extend from OWSLib to a `̀ TimeExtentValue`` or a ``TimeExtentInterval``.
226
248
 
227
249
  Two formats are supported:
228
250
  * ['start/end/interval']
@@ -236,7 +258,7 @@ def parse_extent(extent, default_values):
236
258
  if extent[0].count("/") > 0:
237
259
  # case "start/end/interval"
238
260
  if len(extent) > 1 or extent[0].count("/") != 2:
239
- raise ValueError("Unsupported time definition '{0!s}'".format(extent))
261
+ raise ValueError(f"Unsupported time definition '{extent!s}'")
240
262
  s, e, i = extent[0].split("/")
241
263
  start = _parse_date(s)
242
264
  end = _parse_date(e)
@@ -246,20 +268,19 @@ def parse_extent(extent, default_values):
246
268
  # case "value1, value2, ..., valueN"
247
269
  dates = [_parse_date(d) for d in extent]
248
270
  resolution = dates[0][0]
249
- values = set(d[1] for d in dates)
271
+ values = {d[1] for d in dates}
250
272
 
251
273
  return TimeExtentValue(values, resolution, min_def_value, max_def_value)
252
- raise ValueError("Invalid time extent format '{}'".format(extent))
274
+ raise ValueError(f"Invalid time extent format '{extent}'")
253
275
 
254
276
 
255
- def _parse_default_values(default_values):
277
+ def _parse_default_values(default_values: str) -> Tuple[datetime.datetime, Optional[datetime.datetime]]:
256
278
  """
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.
279
+ Parse the 'default' value from OWSLib's defaulttimeposition and return a maximum of two dates.
280
+
281
+ default value must be a slash separated String. return None on the seconde value if it does not exist.
261
282
  """
262
- if default_values is None: # pragma: no cover
283
+ if default_values is None:
263
284
  return None, None
264
285
 
265
286
  def_value = default_values.split("/")
@@ -273,14 +294,16 @@ def _parse_default_values(default_values):
273
294
  return min_def_value, max_def_value
274
295
 
275
296
 
276
- def _parse_date(date):
297
+ def _parse_date(date: str) -> Tuple[str, datetime.datetime]:
277
298
  """
278
- Parses a string into a tuple containing:
299
+ Parse a date string.
300
+
301
+ Return a tuple containing:
279
302
 
280
303
  * the resolution: "year", "month", "day" or "second"
281
304
  * the date as a datetime
282
305
 
283
- The returned datetime always has a timezone (default to UTC)
306
+ The returned datetime always has a timezone (default is UTC)
284
307
  """
285
308
  resolutions = {"year": "%Y", "month": "%Y-%m", "day": "%Y-%m-%d"}
286
309
 
@@ -288,7 +311,7 @@ def _parse_date(date):
288
311
  try:
289
312
  dt = datetime.datetime.strptime(date, pattern)
290
313
  return resolution, dt.replace(tzinfo=isodate.UTC)
291
- except Exception:
314
+ except Exception: # nosec
292
315
  pass
293
316
 
294
317
  try:
@@ -296,33 +319,35 @@ def _parse_date(date):
296
319
  if dt.tzinfo is None:
297
320
  dt = dt.replace(tzinfo=isodate.UTC)
298
321
  return "second", dt
299
- except Exception:
300
- raise ValueError("Invalid date format '{0!s}'".format(date))
322
+ except Exception as e:
323
+ raise ValueError(f"Invalid date format '{date}'") from e
301
324
 
302
325
 
303
- def _format_date(date):
304
- assert isinstance(date, datetime.datetime)
326
+ def _format_date(date: datetime.datetime) -> str:
305
327
  str_ = isodate.datetime_isoformat(date)
328
+ assert isinstance(str_, str)
306
329
  if date.tzinfo is None:
307
330
  str_ += "Z"
308
331
  return str_
309
332
 
310
333
 
311
- def _parse_duration(duration):
334
+ def _parse_duration(duration: str) -> Tuple[int, int, int, int]:
312
335
  """
313
- Parses an ISO 8601 duration (i.e. "P2DT5S") and returns a tuple containing:
336
+ Parse an ISO 8601 duration (i.e. "P2DT5S").
337
+
338
+ Return a tuple containing:
314
339
 
315
340
  * years
316
341
  * months
317
342
  * days
318
343
  * seconds
319
344
  """
320
- duration = isodate.parse_duration(duration)
345
+ parsed_duration = isodate.parse_duration(duration)
321
346
 
322
347
  # casting years and months to int as isodate might return a float
323
348
  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,
349
+ int(parsed_duration.years) if hasattr(parsed_duration, "years") else 0,
350
+ int(parsed_duration.months) if hasattr(parsed_duration, "months") else 0,
351
+ parsed_duration.days,
352
+ parsed_duration.seconds,
328
353
  )
@@ -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
@@ -29,19 +27,26 @@
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``. """
43
- mapper = class_mapper(cls)
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``.
44
46
 
47
+ And call the user ``sequence_callback``.
48
+ """
49
+ mapper = class_mapper(cls)
45
50
  properties = []
46
51
  if cls.__attributes_order__:
47
52
  for attribute_name in cls.__attributes_order__:
@@ -63,7 +68,7 @@ class XSDGenerator(PapyrusXSDGenerator):
63
68
  if self.sequence_callback:
64
69
  self.sequence_callback(tb, cls)
65
70
 
66
- def add_column_property_xsd(self, tb, column_property):
71
+ def add_column_property_xsd(self, tb: str, column_property: ColumnProperty) -> None:
67
72
  column = column_property.columns[0]
68
73
  if column.foreign_keys:
69
74
  self.add_association_proxy_xsd(tb, column_property)
@@ -71,7 +76,7 @@ class XSDGenerator(PapyrusXSDGenerator):
71
76
 
72
77
  super().add_column_property_xsd(tb, column_property)
73
78
 
74
- def add_association_proxy_xsd(self, tb, column_property):
79
+ def add_association_proxy_xsd(self, tb: str, column_property: ColumnProperty) -> None:
75
80
  from c2cgeoportal_commons.models import DBSession # pylint: disable=import-outside-toplevel
76
81
 
77
82
  column = column_property.columns[0]
@@ -82,6 +87,8 @@ class XSDGenerator(PapyrusXSDGenerator):
82
87
  relationship_property = class_mapper(cls).get_property(association_proxy.target)
83
88
  target_cls = relationship_property.argument
84
89
  query = DBSession.query(getattr(target_cls, association_proxy.value_attr))
90
+ if association_proxy.order_by is not None:
91
+ query = query.order_by(getattr(target_cls, association_proxy.order_by))
85
92
  attrs = {}
86
93
  if association_proxy.nullable:
87
94
  attrs["minOccurs"] = "0"
@@ -95,8 +102,7 @@ class XSDGenerator(PapyrusXSDGenerator):
95
102
  pass
96
103
  self.element_callback(tb4, column)
97
104
 
98
- # pylint: disable=method-hidden
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-2019, 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,7 +1,6 @@
1
- ---
2
- strictness: veryhigh
1
+ max-line-length: 110
3
2
 
4
- pep8:
3
+ pycodestyle:
5
4
  options:
6
5
  max-line-length: 110
7
6
  disable:
@@ -14,9 +13,14 @@ pylint:
14
13
  - too-many-locals
15
14
  - too-many-statements
16
15
  - too-many-branches
16
+ - c-extension-no-member
17
+
18
+ pyflakes:
19
+ disable:
20
+ - F401
17
21
 
18
22
  mccabe:
19
23
  run: false
20
24
 
21
- mypy:
25
+ bandit:
22
26
  run: true