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) 2014-2020, Camptocamp SA
1
+ # Copyright (c) 2014-2023, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
6
4
  # Redistribution and use in source and binary forms, with or without
@@ -31,19 +29,25 @@
31
29
  import gettext
32
30
  import os
33
31
  import sys
34
- from argparse import ArgumentParser
35
- from typing import Any, Dict, List, Set
32
+ from argparse import ArgumentParser, Namespace
33
+ from typing import TYPE_CHECKING, Any, Dict, Iterator, List, Optional, Set
36
34
 
35
+ import pyramid.config
37
36
  import transaction
38
37
  from sqlalchemy import func
38
+ from sqlalchemy.orm.session import Session
39
39
 
40
- from c2cgeoportal_geoportal.lib.bashcolor import RED, colorize
40
+ from c2cgeoportal_geoportal.lib.bashcolor import Color, colorize
41
41
  from c2cgeoportal_geoportal.lib.fulltextsearch import Normalize
42
42
  from c2cgeoportal_geoportal.lib.i18n import LOCALE_PATH
43
43
  from c2cgeoportal_geoportal.scripts import fill_arguments, get_appsettings, get_session
44
44
 
45
+ if TYPE_CHECKING:
46
+ import c2cgeoportal_commons.models.main
47
+
45
48
 
46
- def main():
49
+ def get_argparser() -> ArgumentParser:
50
+ """Get the argument parser for this script."""
47
51
  parser = ArgumentParser(
48
52
  prog=sys.argv[0],
49
53
  add_help=True,
@@ -53,7 +57,7 @@ def main():
53
57
  parser.add_argument(
54
58
  "--locale-folder",
55
59
  default=LOCALE_PATH,
56
- help="The folder where the locale files are stored (default to {})".format(LOCALE_PATH),
60
+ help=f"The folder where the locale files are stored (default is {LOCALE_PATH})",
57
61
  )
58
62
  parser.add_argument("--interfaces", action="append", help="the interfaces to export")
59
63
  parser.add_argument(
@@ -85,7 +89,13 @@ def main():
85
89
  )
86
90
  parser.add_argument("--package", help="the application package")
87
91
  fill_arguments(parser)
88
- options = parser.parse_args()
92
+ return parser
93
+
94
+
95
+ def main() -> None:
96
+ """Run the command."""
97
+
98
+ options = get_argparser().parse_args()
89
99
  settings = get_appsettings(options)
90
100
 
91
101
  with transaction.manager:
@@ -95,7 +105,13 @@ def main():
95
105
 
96
106
 
97
107
  class Import:
98
- def __init__(self, session, settings, options):
108
+ """
109
+ To import all the themes, layer groups and layers names into the full-text search table.
110
+
111
+ Done by interface and by language.
112
+ """
113
+
114
+ def __init__(self, session: Session, settings: pyramid.config.Configurator, options: Namespace):
99
115
  self.options = options
100
116
  self.imported: Set[Any] = set()
101
117
  package = settings["package"]
@@ -106,9 +122,9 @@ class Import:
106
122
 
107
123
  fts_missing_langs = [lang for lang in self.languages if lang not in self.fts_languages]
108
124
  if fts_missing_langs:
109
- msg = "Keys {} are missing in fulltextsearch languages configuration.".format(fts_missing_langs)
125
+ msg = f"Keys {fts_missing_langs} are missing in fulltextsearch languages configuration."
110
126
  if os.environ.get("IGNORE_I18N_ERRORS", "FALSE") == "TRUE":
111
- print(colorize(msg, RED))
127
+ print(colorize(msg, Color.RED))
112
128
  self.languages = [lang for lang in self.languages if lang in self.fts_languages]
113
129
  else:
114
130
  raise KeyError(KeyError(msg))
@@ -122,19 +138,19 @@ class Import:
122
138
  )
123
139
 
124
140
  self.session = session
125
- self.session.execute(FullTextSearch.__table__.delete().where(FullTextSearch.from_theme)) # noqa
141
+ self.session.execute(FullTextSearch.__table__.delete().where(FullTextSearch.from_theme))
126
142
 
127
143
  self._: Dict[str, gettext.NullTranslations] = {}
128
144
  for lang in self.languages:
129
145
  try:
130
146
  self._[lang] = gettext.translation(
131
- "{}_geoportal-client".format(package),
147
+ f"{package}_geoportal-client",
132
148
  options.locale_folder.format(package=package),
133
149
  [lang],
134
150
  )
135
151
  except OSError as e:
136
152
  self._[lang] = gettext.NullTranslations()
137
- print("Warning: {} (language: {})".format(e, lang))
153
+ print(f"Warning: {e} (language: {lang})")
138
154
 
139
155
  query = self.session.query(Interface)
140
156
  if options.interfaces is not None:
@@ -156,7 +172,13 @@ class Import:
156
172
  for theme in self.session.query(Theme).all():
157
173
  self._add_theme(theme, role)
158
174
 
159
- def _add_fts(self, item, interface, action, role):
175
+ def _add_fts(
176
+ self,
177
+ item: "c2cgeoportal_commons.models.main.TreeItem",
178
+ interface: "c2cgeoportal_commons.models.main.Interface",
179
+ action: str,
180
+ role: Optional["c2cgeoportal_commons.models.main.Role"],
181
+ ) -> None:
160
182
  from c2cgeoportal_commons.models.main import FullTextSearch # pylint: disable=import-outside-toplevel
161
183
 
162
184
  key = (
@@ -168,7 +190,7 @@ class Import:
168
190
  self.imported.add(key)
169
191
  for lang in self.languages:
170
192
  fts = FullTextSearch()
171
- fts.label = self._[lang].gettext(item.name)
193
+ fts.label = self._render_label(item, lang)
172
194
  fts.role = role
173
195
  fts.interface = interface
174
196
  fts.lang = lang
@@ -177,14 +199,18 @@ class Import:
177
199
  self.fts_languages[lang],
178
200
  " ".join(
179
201
  [self.fts_normalizer(self._[lang].gettext(item.name))]
180
- + [v.strip() for m in item.get_metadatas("searchAlias") for v in m.value.split(",")]
202
+ + [v.strip() for m in item.get_metadata("searchAlias") for v in m.value.split(",")]
181
203
  ),
182
204
  )
183
205
  fts.actions = [{"action": action, "data": item.name}]
184
206
  fts.from_theme = True
185
207
  self.session.add(fts)
186
208
 
187
- def _add_theme(self, theme, role=None):
209
+ def _add_theme(
210
+ self,
211
+ theme: "c2cgeoportal_commons.models.main.Theme",
212
+ role: Optional["c2cgeoportal_commons.models.main.Role"] = None,
213
+ ) -> None:
188
214
  fill = False
189
215
  for interface in self.interfaces:
190
216
  if interface in theme.interfaces:
@@ -198,13 +224,29 @@ class Import:
198
224
  if role is None or theme.id not in self.public_theme[interface.id]:
199
225
  self._add_fts(theme, interface, "add_theme", role)
200
226
 
201
- def _add_block(self, group, interface, role):
227
+ def _add_block(
228
+ self,
229
+ group: "c2cgeoportal_commons.models.main.LayerGroup",
230
+ interface: "c2cgeoportal_commons.models.main.Interface",
231
+ role: Optional["c2cgeoportal_commons.models.main.Role"],
232
+ ) -> bool:
202
233
  return self._add_group(group, interface, self.options.blocks, role)
203
234
 
204
- def _add_folder(self, group, interface, role):
235
+ def _add_folder(
236
+ self,
237
+ group: "c2cgeoportal_commons.models.main.LayerGroup",
238
+ interface: "c2cgeoportal_commons.models.main.Interface",
239
+ role: Optional["c2cgeoportal_commons.models.main.Role"],
240
+ ) -> bool:
205
241
  return self._add_group(group, interface, self.options.folders, role)
206
242
 
207
- def _add_group(self, group, interface, export, role):
243
+ def _add_group(
244
+ self,
245
+ group: "c2cgeoportal_commons.models.main.LayerGroup",
246
+ interface: "c2cgeoportal_commons.models.main.Interface",
247
+ export: bool,
248
+ role: Optional["c2cgeoportal_commons.models.main.Role"],
249
+ ) -> bool:
208
250
  from c2cgeoportal_commons.models.main import LayerGroup # pylint: disable=import-outside-toplevel
209
251
 
210
252
  fill = False
@@ -224,13 +266,20 @@ class Import:
224
266
  return fill
225
267
 
226
268
  @staticmethod
227
- def _layer_visible(layer, role):
269
+ def _layer_visible(
270
+ layer: "c2cgeoportal_commons.models.main.Layer", role: "c2cgeoportal_commons.models.main.Role"
271
+ ) -> bool:
228
272
  for restrictionarea in layer.restrictionareas:
229
273
  if role in restrictionarea.roles:
230
274
  return True
231
275
  return False
232
276
 
233
- def _add_layer(self, layer, interface, role):
277
+ def _add_layer(
278
+ self,
279
+ layer: "c2cgeoportal_commons.models.main.Layer",
280
+ interface: "c2cgeoportal_commons.models.main.Interface",
281
+ role: Optional["c2cgeoportal_commons.models.main.Role"],
282
+ ) -> bool:
234
283
  if role is None:
235
284
  fill = layer.public and interface in layer.interfaces
236
285
  else:
@@ -240,3 +289,58 @@ class Import:
240
289
  self._add_fts(layer, interface, "add_layer", role)
241
290
 
242
291
  return fill
292
+
293
+ def _render_label(
294
+ self,
295
+ item: "c2cgeoportal_commons.models.main.TreeItem",
296
+ lang: str,
297
+ ) -> str:
298
+ patterns = item.get_metadata("searchLabelPattern")
299
+ if not patterns:
300
+ return self._[lang].gettext(item.name)
301
+ pattern = patterns[0]
302
+ assert isinstance(pattern.value, str)
303
+ tree_paths = list(self._get_paths(item))
304
+ # Remove paths where the last element isn't a theme
305
+ tree_paths = [p for p in tree_paths if p[-1].item_type == "theme"]
306
+ result = None
307
+ current_result = None
308
+ if tree_paths:
309
+ for path in tree_paths:
310
+ if len(path) == 2:
311
+ current_result = pattern.value.format(
312
+ name=self._[lang].gettext(item.name),
313
+ theme=self._[lang].gettext(path[-1].name),
314
+ parent=self._[lang].gettext(path[1].name),
315
+ )
316
+ elif len(path) > 2:
317
+ current_result = pattern.value.format(
318
+ name=self._[lang].gettext(item.name),
319
+ theme=self._[lang].gettext(path[-1].name),
320
+ parent=self._[lang].gettext(path[1].name),
321
+ block=self._[lang].gettext(path[-2].name),
322
+ )
323
+ if result and current_result != result:
324
+ sys.stderr.write(
325
+ f"WARNING: the item {item.name} (id: {item.id}) has a label pattern and inconsistent "
326
+ f"multiple parents\n"
327
+ )
328
+ return self._[lang].gettext(item.name)
329
+ result = current_result
330
+ return result or pattern.value.format(
331
+ name=self._[lang].gettext(item.name),
332
+ theme=self._[lang].gettext(item.name),
333
+ )
334
+
335
+ def _get_paths(
336
+ self,
337
+ item: "c2cgeoportal_commons.models.main.TreeItem",
338
+ ) -> Iterator[List["c2cgeoportal_commons.models.main.TreeItem"]]:
339
+ if item is None:
340
+ return
341
+ if any(item.parents):
342
+ for parent in item.parents:
343
+ for path in self._get_paths(parent):
344
+ yield [item, *path]
345
+ else:
346
+ yield [item]
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- # Copyright (c) 2012-2021, Camptocamp SA
1
+ # Copyright (c) 2012-2024, Camptocamp SA
4
2
  # All rights reserved.
5
3
 
6
4
  # Redistribution and use in source and binary forms, with or without
@@ -32,41 +30,51 @@ import binascii
32
30
  import json
33
31
  import sys
34
32
  import time
33
+ from typing import cast
35
34
 
36
35
  from Crypto.Cipher import AES # nosec
36
+ from Crypto.Cipher.ChaCha20_Poly1305 import ChaCha20Poly1305Cipher # nosec
37
37
 
38
38
  from c2cgeoportal_geoportal.scripts import fill_arguments, get_appsettings
39
39
 
40
40
 
41
- def create_token(aeskey, user, password, valid):
41
+ def create_token(aeskey: str, user: str, password: str, valid: bool) -> str:
42
+ """Create the authenticated URL token."""
42
43
  auth = {"u": user, "p": password, "t": int(time.time()) + valid * 3600 * 24}
43
44
 
44
45
  if aeskey is None:
45
46
  print("urllogin is not configured")
46
47
  sys.exit(1)
47
- cipher = AES.new(aeskey.encode("ascii"), AES.MODE_EAX)
48
+ cipher = cast(ChaCha20Poly1305Cipher, AES.new(aeskey.encode("ascii"), AES.MODE_EAX))
48
49
  data = json.dumps(auth)
49
50
  mod_len = len(data) % 16
50
51
  if mod_len != 0:
51
52
  data += "".join([" " for i in range(16 - mod_len)])
52
- ciphertext, tag = cipher.encrypt_and_digest(data.encode("utf-8")) # type: ignore
53
- return binascii.hexlify(cipher.nonce + tag + ciphertext).decode("ascii") # type: ignore
53
+ ciphertext, tag = cipher.encrypt_and_digest(data.encode("utf-8"))
54
+ return binascii.hexlify(cipher.nonce + tag + ciphertext).decode("ascii")
55
+
54
56
 
57
+ def get_argparser() -> argparse.ArgumentParser:
58
+ """Get the argument parser for this script."""
55
59
 
56
- def main():
57
60
  parser = argparse.ArgumentParser(description="Generate an auth token")
58
- fill_arguments(parser)
61
+ fill_arguments(parser, use_attribute=True)
59
62
  parser.add_argument("user", help="The username")
60
63
  parser.add_argument("password", help="The password")
61
64
  parser.add_argument("valid", type=int, default=1, nargs="?", help="Is valid for, in days")
65
+ return parser
66
+
67
+
68
+ def main() -> None:
69
+ """Run the command."""
62
70
 
63
- args = parser.parse_args()
71
+ args = get_argparser().parse_args()
64
72
  settings = get_appsettings(args)
65
73
  urllogin = settings.get("urllogin", {})
66
74
  aeskey = urllogin.get("aes_key")
67
75
  auth_enc = create_token(aeskey, args.user, args.password, args.valid)
68
76
 
69
- print(("Use: auth={}".format(auth_enc)))
77
+ print(f"Use: auth={auth_enc}")
70
78
 
71
79
 
72
80
  if __name__ == "__main__":
@@ -1,86 +1,90 @@
1
- <!DOCTYPE HTML>
1
+ <!DOCTYPE html>
2
2
  <html lang="${lang}">
3
- <head>
4
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5
- <meta name="Content-Language" content="${lang}" />
6
- <title>${_('Login to Geoportal Application')}</title>
7
- <style>
8
- body {
9
- background: #444444;
10
- font-family: Helvetica, Arial, sans-serif;
11
- }
12
- * {
13
- padding: 0;
14
- margin: 0;
15
- }
16
- div#content {
17
- background: #F5F5EF;
18
- padding: 20px 30px;
19
- width: 330px;
20
- margin: 100px auto auto auto;
21
- -webkit-border-radius: 10px;
22
- border-radius: 10px;
23
- }
24
- td.field {
25
- padding-top: 20px;
26
- }
27
- td.field p {
28
- font-weight: bold;
29
- color: #444444;
30
- font-size: 80%;
31
- margin-bottom: 3px;
32
- }
33
- td.field input {
34
- -webkit-border-radius: 2px;
35
- border-radius: 2px;
36
- border: solid 1px #444444;
37
- padding: 3px 6px;
38
- font-size: 110%;
39
- width: 250px;
40
- }
41
- td.buttons {
42
- padding-top: 25px;
43
- padding-bottom: 20px;
44
- text-align: right;
45
- }
46
- td.buttons input {
47
- padding: 1px 6px;
48
- font-weight: bold;
49
- color: #444444;
50
- }
51
- </style>
52
- </head>
53
- <body>
54
- <div id="content">
55
- <form method="POST" id="loginForm" action="${request.route_url('login', _query=login_params)}">
56
- <table style="margin-left: auto; margin-right: auto;">
57
- <tbody>
58
- <tr>
59
- <td class="field"><p>
60
- <label for="email">${_('Username')}</label></p>
61
- <input id="login" name="login" type="text">
62
- </td>
63
- </tr>
64
- <tr>
65
- <td class="field"><p>
66
- <label for="password">${_('Password')}</label></p>
67
- <input id="password" name="password" type="password">
68
- </td>
69
- </tr>
70
- % if two_fa:
71
- <tr>
72
- <td class="field">
73
- <p><label for="otp">${_('Authentication code')}</label></p>
74
- <input id="otp" name="otp" type="text" autocomplete="off">
75
- </td>
76
- </tr>
77
- % endif
78
- <tr>
79
- <td class="buttons"><input tabindex="4" value="${_('Login')}" type="submit"></td>
80
- </tr>
81
- </tbody>
82
- </table>
83
- </form>
84
- </div>
85
- </body>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5
+ <meta name="Content-Language" content="${lang}" />
6
+ <title>${_('Login to Geoportal Application')}</title>
7
+ <style>
8
+ body {
9
+ background: #444444;
10
+ font-family: Helvetica, Arial, sans-serif;
11
+ }
12
+ * {
13
+ padding: 0;
14
+ margin: 0;
15
+ }
16
+ div#content {
17
+ background: #f5f5ef;
18
+ padding: 20px 30px;
19
+ width: 330px;
20
+ margin: 100px auto auto auto;
21
+ -webkit-border-radius: 10px;
22
+ border-radius: 10px;
23
+ }
24
+ td.field {
25
+ padding-top: 20px;
26
+ }
27
+ td.field p {
28
+ font-weight: bold;
29
+ color: #444444;
30
+ font-size: 80%;
31
+ margin-bottom: 3px;
32
+ }
33
+ td.field input {
34
+ -webkit-border-radius: 2px;
35
+ border-radius: 2px;
36
+ border: solid 1px #444444;
37
+ padding: 3px 6px;
38
+ font-size: 110%;
39
+ width: 250px;
40
+ }
41
+ td.buttons {
42
+ padding-top: 25px;
43
+ padding-bottom: 20px;
44
+ text-align: right;
45
+ }
46
+ td.buttons input {
47
+ padding: 1px 6px;
48
+ font-weight: bold;
49
+ color: #444444;
50
+ }
51
+ </style>
52
+ </head>
53
+ <body>
54
+ <div id="content">
55
+ <form method="POST" id="loginForm" action="${request.route_url('login', _query=login_params)}">
56
+ <table style="margin-left: auto; margin-right: auto">
57
+ <tbody>
58
+ <tr>
59
+ <td class="field">
60
+ <p>
61
+ <label for="email">${_('Username')}</label>
62
+ </p>
63
+ <input id="login" name="login" type="text" />
64
+ </td>
65
+ </tr>
66
+ <tr>
67
+ <td class="field">
68
+ <p>
69
+ <label for="password">${_('Password')}</label>
70
+ </p>
71
+ <input id="password" name="password" type="password" />
72
+ </td>
73
+ </tr>
74
+ % if two_fa:
75
+ <tr>
76
+ <td class="field">
77
+ <p><label for="otp">${_('Authentication code')}</label></p>
78
+ <input id="otp" name="otp" type="text" autocomplete="off" />
79
+ </td>
80
+ </tr>
81
+ % endif
82
+ <tr>
83
+ <td class="buttons"><input tabindex="4" value="${_('Login')}" type="submit" /></td>
84
+ </tr>
85
+ </tbody>
86
+ </table>
87
+ </form>
88
+ </div>
89
+ </body>
86
90
  </html>
@@ -1,62 +1,62 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="${lang}">
3
- <head>
4
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5
- <meta name="Content-Language" content="${lang}" />
6
- <title>${_('Login to Geoportal Application')}</title>
7
- <style>
8
- body {
9
- background: #444444;
10
- font-family: Helvetica, Arial, sans-serif;
11
- }
12
- * {
13
- padding: 0;
14
- margin: 0;
15
- }
16
- div#content {
17
- background: #f5f5ef;
18
- padding: 20px 30px;
19
- width: 330px;
20
- margin: 100px auto auto auto;
21
- -webkit-border-radius: 10px;
22
- border-radius: 10px;
23
- }
24
- td.field {
25
- padding-top: 20px;
26
- }
27
- td.field p {
28
- font-weight: bold;
29
- color: #444444;
30
- font-size: 80%;
31
- margin-bottom: 3px;
32
- }
33
- td.field input {
34
- -webkit-border-radius: 2px;
35
- border-radius: 2px;
36
- border: solid 1px #444444;
37
- padding: 3px 6px;
38
- font-size: 110%;
39
- width: 250px;
40
- }
41
- td.buttons {
42
- padding-top: 25px;
43
- padding-bottom: 20px;
44
- text-align: right;
45
- }
46
- td.buttons input {
47
- padding: 1px 6px;
48
- font-weight: bold;
49
- color: #444444;
50
- }
51
- </style>
52
- </head>
53
- <body>
54
- <div id="content">
55
- <p>
56
- ${_('The user is not correctly initialized you should login in the main application and try '
57
- 'again.')}
58
- </p>
59
- <p><a href="${request.route_url('base')}">${_('Main application')}</a></p>
60
- </div>
61
- </body>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
5
+ <meta name="Content-Language" content="${lang}" />
6
+ <title>${_('Login to Geoportal Application')}</title>
7
+ <style>
8
+ body {
9
+ background: #444444;
10
+ font-family: Helvetica, Arial, sans-serif;
11
+ }
12
+ * {
13
+ padding: 0;
14
+ margin: 0;
15
+ }
16
+ div#content {
17
+ background: #f5f5ef;
18
+ padding: 20px 30px;
19
+ width: 330px;
20
+ margin: 100px auto auto auto;
21
+ -webkit-border-radius: 10px;
22
+ border-radius: 10px;
23
+ }
24
+ td.field {
25
+ padding-top: 20px;
26
+ }
27
+ td.field p {
28
+ font-weight: bold;
29
+ color: #444444;
30
+ font-size: 80%;
31
+ margin-bottom: 3px;
32
+ }
33
+ td.field input {
34
+ -webkit-border-radius: 2px;
35
+ border-radius: 2px;
36
+ border: solid 1px #444444;
37
+ padding: 3px 6px;
38
+ font-size: 110%;
39
+ width: 250px;
40
+ }
41
+ td.buttons {
42
+ padding-top: 25px;
43
+ padding-bottom: 20px;
44
+ text-align: right;
45
+ }
46
+ td.buttons input {
47
+ padding: 1px 6px;
48
+ font-weight: bold;
49
+ color: #444444;
50
+ }
51
+ </style>
52
+ </head>
53
+ <body>
54
+ <div id="content">
55
+ <p>
56
+ ${_('The user is not correctly initialized you should login in the main application and try '
57
+ 'again.')}
58
+ </p>
59
+ <p><a href="${request.route_url('base')}">${_('Main application')}</a></p>
60
+ </div>
61
+ </body>
62
62
  </html>
@@ -1,14 +1,12 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
3
  <html xmlns="http://www.w3.org/1999/xhtml">
6
- <head>
7
- <meta charset="UTF-8">
4
+ <head>
5
+ <meta charset="UTF-8" />
8
6
  <title>${title}</title>
9
- </head>
10
- <body>
7
+ </head>
8
+ <body>
11
9
  <h1>${title}</h1>
12
10
  <p>${_('my translation test')}</p>
13
- </body>
11
+ </body>
14
12
  </html>