c2cgeoportal-geoportal 2.5.0.100__py2.py3-none-any.whl → 2.7.1.83__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 +72 -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 +124 -96
  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 +104 -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 +158 -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 +66 -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 +107 -0
  96. c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-restore +111 -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 +1153 -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 +1412 -0
  105. c2cgeoportal_geoportal/scripts/__init__.py +17 -33
  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 +70 -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 +67 -53
  129. c2cgeoportal_geoportal/views/profile.py +25 -24
  130. c2cgeoportal_geoportal/views/proxy.py +97 -68
  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.83.dist-info}/METADATA +16 -11
  138. c2cgeoportal_geoportal-2.7.1.83.dist-info/RECORD +185 -0
  139. {c2cgeoportal_geoportal-2.5.0.100.dist-info → c2cgeoportal_geoportal-2.7.1.83.dist-info}/WHEEL +1 -1
  140. {c2cgeoportal_geoportal-2.5.0.100.dist-info → c2cgeoportal_geoportal-2.7.1.83.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.83.dist-info}/top_level.txt +0 -0
tests/test_caching.py CHANGED
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  # Copyright (c) 2015-2019, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
@@ -32,16 +30,12 @@
32
30
 
33
31
  from unittest import TestCase
34
32
 
35
- from c2cgeoportal_geoportal.lib.cacheversion import get_cache_version
36
- from c2cgeoportal_geoportal.lib.caching import (
37
- CORS_METHODS,
38
- NO_CACHE,
39
- init_region,
40
- invalidate_region,
41
- set_common_headers,
42
- )
43
33
  from tests import DummyRequest
44
34
 
35
+ from c2cgeoportal_geoportal.lib.cacheversion import get_cache_version
36
+ from c2cgeoportal_geoportal.lib.caching import init_region, invalidate_region
37
+ from c2cgeoportal_geoportal.lib.common_headers import CORS_METHODS, Cache, set_common_headers
38
+
45
39
 
46
40
  class TestSetCorsHeaders(TestCase):
47
41
  ORIGIN1 = "http://www.example.com"
@@ -56,31 +50,31 @@ class TestSetCorsHeaders(TestCase):
56
50
  request.registry.settings = {"headers": {"foo": settings}}
57
51
  else:
58
52
  request.registry.settings = {"headers": {}}
59
- set_common_headers(request, "foo", NO_CACHE, credentials=credentials)
53
+ set_common_headers(request, "foo", Cache.PRIVATE_NO, credentials=credentials)
60
54
 
61
55
  return dict(request.response.headers)
62
56
 
63
57
  def test_simple(self):
64
58
  """
65
- Tests specified in http://www.w3.org/TR/cors/#resource-requests
59
+ Tests specified in http://www.w3.org/TR/cors/#resource-requests.
66
60
  """
67
61
  # 1. If the Origin header is not present terminate this set of steps.
68
62
  # The request is outside the scope of this specification.
69
63
  assert self._do("POST", {}) == {
70
- "Cache-Control": "max-age=0, no-cache",
64
+ "Cache-Control": "max-age=10, public",
71
65
  "Content-Length": "0",
72
66
  "Content-Type": "text/html; charset=UTF-8",
73
- "Vary": "Origin",
67
+ "Vary": "Origin, Cookie",
74
68
  }
75
69
 
76
70
  # 2. If the value of the Origin header is not a case-sensitive match for
77
71
  # any of the values in list of origins, do not set any additional
78
72
  # headers and terminate this set of steps.
79
73
  assert self._do("POST", {"Origin": "http://foe.com"}) == {
80
- "Cache-Control": "max-age=0, no-cache",
74
+ "Cache-Control": "max-age=10, public",
81
75
  "Content-Length": "0",
82
76
  "Content-Type": "text/html; charset=UTF-8",
83
- "Vary": "Origin",
77
+ "Vary": "Origin, Cookie",
84
78
  }
85
79
 
86
80
  # 3. If the resource supports credentials add a single
@@ -88,10 +82,10 @@ class TestSetCorsHeaders(TestCase):
88
82
  # header as value, and add a single Access-Control-Allow-Credentials
89
83
  # header with the case-sensitive string "true" as value.
90
84
  assert self._do("POST", {"Origin": self.ORIGIN2}, credentials=True) == {
91
- "Cache-Control": "max-age=0, no-cache",
85
+ "Cache-Control": "max-age=10, public",
92
86
  "Content-Length": "0",
93
87
  "Content-Type": "text/html; charset=UTF-8",
94
- "Vary": "Origin",
88
+ "Vary": "Origin, Cookie",
95
89
  "Access-Control-Max-Age": self.MAX_AGE,
96
90
  "Access-Control-Allow-Origin": self.ORIGIN2,
97
91
  "Access-Control-Allow-Methods": CORS_METHODS,
@@ -109,8 +103,7 @@ class TestSetCorsHeaders(TestCase):
109
103
 
110
104
  def test_preflight(self):
111
105
  """
112
- Tests specified in
113
- http://www.w3.org/TR/cors/#resource-preflight-requests
106
+ Tests specified in http://www.w3.org/TR/cors/#resource-preflight-requests.
114
107
  """
115
108
  # 1. If the Origin header is not present terminate this set of steps.
116
109
  # The request is outside the scope of this specification.
@@ -209,10 +202,10 @@ class TestSetCorsHeaders(TestCase):
209
202
  def test_not_configured(self):
210
203
  # If the service is not configured, then no CORS head.
211
204
  assert self._do("GET", {"Origin": self.ORIGIN1}, settings=None) == {
212
- "Cache-Control": "max-age=0, no-cache",
205
+ "Cache-Control": "max-age=10, public",
213
206
  "Content-Length": "0",
214
207
  "Content-Type": "text/html; charset=UTF-8",
215
- "Vary": "Origin",
208
+ "Vary": "Origin, Cookie",
216
209
  }
217
210
 
218
211
  def test_match_all(self):
@@ -224,10 +217,10 @@ class TestSetCorsHeaders(TestCase):
224
217
  # An origin included in the access_control_allow_origin list is OK with
225
218
  # credentials
226
219
  assert self._do("POST", {"Origin": self.ORIGIN1}, credentials=True, settings=settings) == {
227
- "Cache-Control": "max-age=0, no-cache",
220
+ "Cache-Control": "max-age=10, public",
228
221
  "Content-Length": "0",
229
222
  "Content-Type": "text/html; charset=UTF-8",
230
- "Vary": "Origin",
223
+ "Vary": "Origin, Cookie",
231
224
  "Access-Control-Max-Age": self.MAX_AGE,
232
225
  "Access-Control-Allow-Origin": self.ORIGIN1,
233
226
  "Access-Control-Allow-Methods": CORS_METHODS,
@@ -237,10 +230,10 @@ class TestSetCorsHeaders(TestCase):
237
230
  # 3. Otherwise, add a single Access-Control-Allow-Origin header, with
238
231
  # either the value of the Origin header or the string "*" as value.
239
232
  assert self._do("POST", {"Origin": "http://www.guest.com"}, settings=settings) == {
240
- "Cache-Control": "max-age=0, no-cache",
233
+ "Cache-Control": "max-age=10, public",
241
234
  "Content-Length": "0",
242
235
  "Content-Type": "text/html; charset=UTF-8",
243
- "Vary": "Origin",
236
+ "Vary": "Origin, Cookie",
244
237
  "Access-Control-Max-Age": self.MAX_AGE,
245
238
  "Access-Control-Allow-Origin": "*",
246
239
  "Access-Control-Allow-Methods": CORS_METHODS,
tests/test_checker.py CHANGED
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  # Copyright (c) 2013-2019, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
@@ -32,9 +30,10 @@
32
30
 
33
31
  from unittest import TestCase
34
32
 
35
- from c2cgeoportal_geoportal.lib.checker import build_url
36
33
  from tests import DummyRequest
37
34
 
35
+ from c2cgeoportal_geoportal.lib.checker import build_url
36
+
38
37
 
39
38
  class TestExportCSVView(TestCase):
40
39
  def test_build_url_docker(self):
tests/test_decimaljson.py CHANGED
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  # Copyright (c) 2011-2019, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
@@ -34,14 +32,16 @@ import decimal
34
32
  import json
35
33
  from unittest import TestCase
36
34
 
37
- from c2cwsgiutils.pretty_json import fast_dumps
35
+ from c2cwsgiutils.pretty_json import _FastDumps as FastDumps
38
36
 
39
37
 
40
38
  class TestDecimalJSON(TestCase):
41
39
  def test_decimal(self):
42
40
  value = {"str": "an str", "int": 1, "dec": decimal.Decimal("1.2")}
41
+ fast_dumps = FastDumps(False, False)
43
42
  result = fast_dumps(value)
44
43
  self.assertEqual(json.loads(result), {"int": 1, "dec": 1.2, "str": "an str"})
45
44
 
46
45
  def test_decimal_json(self):
47
- self.assertEqual(fast_dumps({"a": decimal.Decimal("3.3")}), '{\n "a": 3.3\n}')
46
+ fast_dumps = FastDumps(False, False)
47
+ assert fast_dumps({"a": decimal.Decimal("3.3")}) == '{"a":3.3}'
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  # Copyright (c) 2018-2019, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
@@ -33,7 +31,6 @@
33
31
  from unittest import TestCase
34
32
 
35
33
  import pyramid.registry
36
-
37
34
  from tests import DummyRequest
38
35
 
39
36
 
tests/test_i18n.py ADDED
@@ -0,0 +1,31 @@
1
+ from unittest import TestCase
2
+ from unittest.mock import patch
3
+
4
+ from c2cgeoportal_geoportal.lib.i18n import available_locale_names
5
+
6
+ example_locale_content = {
7
+ ("de", True),
8
+ ("en", True),
9
+ ("fr", True),
10
+ (".emptyfolder", False),
11
+ ("geomapfish_geoportal-client.pot", False),
12
+ }
13
+
14
+
15
+ class TestI18n(TestCase):
16
+ @patch("c2cgeoportal_geoportal.lib.i18n.os.path.exists", return_value=True)
17
+ @patch(
18
+ "c2cgeoportal_geoportal.lib.i18n.os.listdir",
19
+ return_value=[locale[0] for locale in example_locale_content],
20
+ )
21
+ @patch(
22
+ "c2cgeoportal_geoportal.lib.i18n.os.path.isdir",
23
+ side_effect=[locale[1] for locale in example_locale_content],
24
+ )
25
+ def test_available_locale_names(self, isdir_mock, listdir_mock, exists_mock):
26
+ locales = available_locale_names()
27
+ self.assertEqual(set(locales), {"de", "en", "fr"})
28
+
29
+ def test_available_locale_names_no_dir(self):
30
+ locales = available_locale_names()
31
+ self.assertEqual(locales, [])
tests/test_init.py CHANGED
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  # Copyright (c) 2012-2019, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
@@ -31,19 +29,20 @@
31
29
 
32
30
 
33
31
  from unittest import TestCase
32
+ from unittest.mock import patch
34
33
 
35
34
  from c2c.template.config import config
36
35
  from pyramid import testing
36
+ from tests import DummyRequest
37
37
 
38
38
  import c2cgeoportal_geoportal
39
39
  from c2cgeoportal_geoportal import (
40
40
  call_hook,
41
41
  create_get_user_from_request,
42
42
  default_user_validator,
43
- is_valid_referer,
43
+ is_valid_referrer,
44
44
  set_user_validator,
45
45
  )
46
- from tests import DummyRequest
47
46
 
48
47
 
49
48
  class TestIncludeme(TestCase):
@@ -60,7 +59,6 @@ class TestIncludeme(TestCase):
60
59
  "schema": "main",
61
60
  "schema_static": "main_static",
62
61
  "default_max_age": 86400,
63
- "app.cfg": "/opt/c2cgeoportal/geoportal/tests/config.yaml",
64
62
  "package": "c2cgeoportal",
65
63
  "enable_admin_interface": False,
66
64
  "getitfixed": {"enabled": False},
@@ -74,6 +72,12 @@ class TestIncludeme(TestCase):
74
72
  },
75
73
  }
76
74
  )
75
+ config.init("/opt/c2cgeoportal/geoportal/tests/config.yaml")
76
+
77
+ @patch("c2cgeoportal_geoportal.available_locale_names", return_value=["de", "en", "fr"])
78
+ def test_available_locale_names(self, locales_mock):
79
+ self.config.include(c2cgeoportal_geoportal.includeme)
80
+ self.assertEqual(self.config.registry.settings["available_locale_names"], ["de", "en", "fr"])
77
81
 
78
82
  def test_set_user_validator_directive(self):
79
83
  self.config.include(c2cgeoportal_geoportal.includeme)
@@ -89,7 +93,7 @@ class TestIncludeme(TestCase):
89
93
  def custom_validator(username, password):
90
94
  del username # Unused
91
95
  del password # Unused
92
- return False # pragma: no cover
96
+ return False
93
97
 
94
98
  self.config.set_user_validator(custom_validator)
95
99
  self.assertEqual(self.config.registry.validate_user, custom_validator)
@@ -97,8 +101,7 @@ class TestIncludeme(TestCase):
97
101
 
98
102
  class TestReferer(TestCase):
99
103
  """
100
- Check that accessing something with a bad HTTP referer is equivalent to a
101
- not authenticated query.
104
+ Check that accessing something with a bad HTTP referer is equivalent to a not authenticated query.
102
105
  """
103
106
 
104
107
  BASE1 = "http://example.com/app"
@@ -122,7 +125,7 @@ class TestReferer(TestCase):
122
125
  def match(reference, value, expected):
123
126
  r = DummyRequest()
124
127
  r.referer = value
125
- self.assertEqual(is_valid_referer(r, {"authorized_referers": [reference]}), expected)
128
+ self.assertEqual(is_valid_referrer(r, {"authorized_referers": [reference]}), expected)
126
129
 
127
130
  match("http://example.com/app/", "http://example.com/app?k=v", True)
128
131
  match("http://example.com/app/", "http://example.com/app?k=v#link", True)
@@ -173,21 +176,3 @@ class TestHooks(TestCase):
173
176
 
174
177
  def test_bad_hook(self):
175
178
  self.assertRaises(AttributeError, call_hook, self.settings, "bad")
176
-
177
-
178
- class TestInit(TestCase):
179
- def test_add_url_params(self):
180
- from c2cgeoportal_geoportal.lib import add_url_params
181
- from urllib.parse import urlparse, parse_qs
182
-
183
- params = {"Name": "Bob", "Age": 18, "Nationality": "Việt Nam"}
184
- result = add_url_params("http://test/", params)
185
- presult = urlparse(result)
186
- self.assertEqual(presult.scheme, "http")
187
- self.assertEqual(presult.netloc, "test")
188
- self.assertEqual(presult.path, "/")
189
- self.assertEqual(presult.params, "")
190
- self.assertEqual(presult.fragment, "")
191
- self.assertEqual(
192
- parse_qs(presult.query), {"Name": ["Bob"], "Age": ["18"], "Nationality": ["Việt Nam"]}
193
- )
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  # Copyright (c) 2013-2019, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
@@ -44,9 +42,10 @@ class TestLocalNegociator(TestCase):
44
42
  self.assertEqual(lang, "fr")
45
43
 
46
44
  def test_lang_is_not_available(self):
47
- from c2cgeoportal_geoportal import locale_negotiator
48
- from pyramid.threadlocal import get_current_registry
49
45
  from pyramid.request import Request
46
+ from pyramid.threadlocal import get_current_registry
47
+
48
+ from c2cgeoportal_geoportal import locale_negotiator
50
49
 
51
50
  request = Request.blank("/")
52
51
  request.registry = get_current_registry()
@@ -57,9 +56,10 @@ class TestLocalNegociator(TestCase):
57
56
  self.assertEqual(lang, "de")
58
57
 
59
58
  def test_lang_is_available(self):
60
- from c2cgeoportal_geoportal import locale_negotiator
61
- from pyramid.threadlocal import get_current_registry
62
59
  from pyramid.request import Request
60
+ from pyramid.threadlocal import get_current_registry
61
+
62
+ from c2cgeoportal_geoportal import locale_negotiator
63
63
 
64
64
  request = Request.blank("/")
65
65
  request.registry = get_current_registry()
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  # Copyright (c) 2013-2019, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
tests/test_raster.py CHANGED
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- # Copyright (c) 2013-2019, Camptocamp SA
1
+ # Copyright (c) 2013-2021, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
6
4
  # Redistribution and use in source and binary forms, with or without
@@ -36,8 +34,10 @@ from unittest import TestCase
36
34
  class TestRasterViews(TestCase):
37
35
  def test_raster(self):
38
36
  from decimal import Decimal
39
- from tests import DummyRequest
37
+
40
38
  from pyramid.httpexceptions import HTTPNotFound
39
+ from tests import DummyRequest
40
+
41
41
  from c2cgeoportal_geoportal.views.raster import Raster
42
42
 
43
43
  request = DummyRequest()
@@ -76,7 +76,9 @@ class TestRasterViews(TestCase):
76
76
 
77
77
  def test_raster_angle(self):
78
78
  from decimal import Decimal
79
+
79
80
  from tests import DummyRequest
81
+
80
82
  from c2cgeoportal_geoportal.views.raster import Raster
81
83
 
82
84
  request = DummyRequest()
@@ -119,7 +121,9 @@ class TestRasterViews(TestCase):
119
121
 
120
122
  def test_raster_vrt(self):
121
123
  from decimal import Decimal
124
+
122
125
  from tests import DummyRequest
126
+
123
127
  from c2cgeoportal_geoportal.views.raster import Raster
124
128
 
125
129
  request = DummyRequest()
@@ -153,8 +157,10 @@ class TestRasterViews(TestCase):
153
157
 
154
158
  def test_profile_json(self):
155
159
  from decimal import Decimal
156
- from tests import DummyRequest
160
+
157
161
  from pyramid.httpexceptions import HTTPNotFound
162
+ from tests import DummyRequest
163
+
158
164
  from c2cgeoportal_geoportal.views.profile import Profile
159
165
 
160
166
  request = DummyRequest()
@@ -252,3 +258,10 @@ class TestRasterViews(TestCase):
252
258
  # test wrong layer name
253
259
  request.params["layers"] = "wrong"
254
260
  self.assertRaises(HTTPNotFound, profile.json)
261
+
262
+ def test_round_bigvalue(self):
263
+ from decimal import Decimal
264
+
265
+ from c2cgeoportal_geoportal.views.raster import Raster
266
+
267
+ assert Raster._round(-5.4775915e29, 1) == Decimal("-5.4775915E+29")
tests/test_wmstparsing.py CHANGED
@@ -1,5 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
-
3
1
  # Copyright (c) 2013-2019, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
@@ -38,13 +36,13 @@ import isodate
38
36
 
39
37
  class TestExtent(TestCase):
40
38
  def test_parse_values(self):
41
- from c2cgeoportal_geoportal.lib.wmstparsing import parse_extent, TimeExtentValue
39
+ from c2cgeoportal_geoportal.lib.wmstparsing import TimeExtentValue, parse_extent
42
40
 
43
41
  extent = parse_extent(["2005", "2006"], "2005")
44
42
  self.assertTrue(isinstance(extent, TimeExtentValue))
45
43
 
46
44
  def test_parse_interval(self):
47
- from c2cgeoportal_geoportal.lib.wmstparsing import parse_extent, TimeExtentInterval
45
+ from c2cgeoportal_geoportal.lib.wmstparsing import TimeExtentInterval, parse_extent
48
46
 
49
47
  extent = parse_extent(["2000/2005/P1Y"], "2002")
50
48
  self.assertTrue(isinstance(extent, TimeExtentInterval))
@@ -56,7 +54,7 @@ class TestExtent(TestCase):
56
54
  self.assertRaises(ValueError, parse_extent, [], "2002")
57
55
 
58
56
  def test_merge_values(self):
59
- from c2cgeoportal_geoportal.lib.wmstparsing import parse_extent, TimeExtentValue
57
+ from c2cgeoportal_geoportal.lib.wmstparsing import TimeExtentValue, parse_extent
60
58
 
61
59
  e1 = parse_extent(["2000", "2005"], "2000/2005")
62
60
  e2 = parse_extent(["2001", "2003"], "2001/2003")
@@ -82,7 +80,7 @@ class TestExtent(TestCase):
82
80
  )
83
81
 
84
82
  def test_merge_interval(self):
85
- from c2cgeoportal_geoportal.lib.wmstparsing import parse_extent, TimeExtentInterval
83
+ from c2cgeoportal_geoportal.lib.wmstparsing import TimeExtentInterval, parse_extent
86
84
 
87
85
  e1 = parse_extent(["2000/2005/P1Y"], "2000/2005")
88
86
  e2 = parse_extent(["2006/2010/P1Y"], "2006/2010")
@@ -168,7 +166,7 @@ class TestFormat(TestCase):
168
166
  self.assertEqual("2010-02-01T00:00:00Z", _format_date(dt))
169
167
 
170
168
  def test_format_tz(self):
171
- from c2cgeoportal_geoportal.lib.wmstparsing import _parse_date, _format_date
169
+ from c2cgeoportal_geoportal.lib.wmstparsing import _format_date, _parse_date
172
170
 
173
171
  dt = _parse_date("2010-02-03T12:34:00+01:00")
174
172
  self.assertEqual("2010-02-03T12:34:00+01:00", _format_date(dt[1]))
@@ -206,9 +204,10 @@ class TestParseDuration(TestCase):
206
204
  self.assertEqual((0, 0, 0, 10), _parse_duration("PT10S"))
207
205
 
208
206
  def test_invalid(self):
209
- from c2cgeoportal_geoportal.lib.wmstparsing import _parse_duration
210
207
  from isodate import ISO8601Error
211
208
 
209
+ from c2cgeoportal_geoportal.lib.wmstparsing import _parse_duration
210
+
212
211
  self.assertRaises(ISO8601Error, _parse_duration, "10S")
213
212
 
214
213