c2cgeoportal-geoportal 2.6.0__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.
- c2cgeoportal_geoportal/__init__.py +224 -84
- c2cgeoportal_geoportal/lib/__init__.py +67 -43
- c2cgeoportal_geoportal/lib/authentication.py +50 -22
- c2cgeoportal_geoportal/lib/bashcolor.py +17 -13
- c2cgeoportal_geoportal/lib/cacheversion.py +16 -8
- c2cgeoportal_geoportal/lib/caching.py +61 -191
- c2cgeoportal_geoportal/lib/check_collector.py +17 -10
- c2cgeoportal_geoportal/lib/checker.py +61 -63
- c2cgeoportal_geoportal/lib/common_headers.py +170 -0
- c2cgeoportal_geoportal/lib/dbreflection.py +54 -39
- c2cgeoportal_geoportal/lib/filter_capabilities.py +122 -88
- c2cgeoportal_geoportal/lib/fulltextsearch.py +6 -5
- c2cgeoportal_geoportal/lib/functionality.py +20 -17
- c2cgeoportal_geoportal/lib/headers.py +14 -5
- c2cgeoportal_geoportal/lib/i18n.py +4 -4
- c2cgeoportal_geoportal/lib/layers.py +30 -11
- c2cgeoportal_geoportal/lib/lingua_extractor.py +361 -237
- c2cgeoportal_geoportal/lib/loader.py +10 -15
- c2cgeoportal_geoportal/lib/metrics.py +28 -17
- c2cgeoportal_geoportal/lib/oauth2.py +214 -145
- c2cgeoportal_geoportal/lib/wmstparsing.py +115 -90
- c2cgeoportal_geoportal/lib/xsd.py +26 -16
- c2cgeoportal_geoportal/resources.py +15 -9
- c2cgeoportal_geoportal/scaffolds/advance_create/ci/config.yaml +26 -0
- c2cgeoportal_geoportal/scaffolds/advance_create/cookiecutter.json +18 -0
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.dockerignore +6 -0
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.eslintrc.yaml +19 -0
- c2cgeoportal_geoportal/scaffolds/{create/geoportal/+dot+prospector.yaml → advance_create/{{cookiecutter.project}}/geoportal/.prospector.yaml} +8 -2
- c2cgeoportal_geoportal/scaffolds/{create/geoportal/Dockerfile_tmpl → advance_create/{{cookiecutter.project}}/geoportal/Dockerfile} +18 -9
- c2cgeoportal_geoportal/scaffolds/{create/geoportal/alembic.yaml_tmpl → advance_create/{{cookiecutter.project}}/geoportal/alembic.yaml} +1 -1
- c2cgeoportal_geoportal/scaffolds/{create/geoportal/development.ini_tmpl → advance_create/{{cookiecutter.project}}/geoportal/development.ini} +34 -15
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/gunicorn.conf.py +102 -0
- c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/lingua-client.cfg +1 -0
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/production.ini +38 -0
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/requirements.txt +2 -0
- c2cgeoportal_geoportal/scaffolds/{create/geoportal/setup.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/setup.py} +6 -7
- c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/tools/extract-messages.js +8 -6
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/tsconfig.json +8 -0
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.api.js +75 -0
- c2cgeoportal_geoportal/scaffolds/{create/geoportal/webpack.apps.js_tmpl → advance_create/{{cookiecutter.project}}/geoportal/webpack.apps.js} +31 -28
- c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/webpack.commons.js +3 -7
- c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/webpack.config.js +1 -1
- c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal/__init__.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py} +11 -22
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/authentication.py +10 -0
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/dev.py +14 -0
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/models.py +8 -0
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/multi_organization.py +7 -0
- c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/resources.py +4 -3
- 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
- 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
- c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal/subscribers.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/subscribers.py} +1 -3
- c2cgeoportal_geoportal/scaffolds/advance_update/cookiecutter.json +18 -0
- c2cgeoportal_geoportal/scaffolds/{update/geoportal/CONST_Makefile_tmpl → advance_update/{{cookiecutter.project}}/geoportal/CONST_Makefile} +3 -7
- c2cgeoportal_geoportal/scaffolds/create/cookiecutter.json +18 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.dockerignore +14 -0
- c2cgeoportal_geoportal/scaffolds/create/{+dot+editorconfig → {{cookiecutter.project}}/.editorconfig} +2 -5
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/main.yaml +43 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/rebuild.yaml +46 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/update_l10n.yaml +65 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.gitignore +16 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierignore +1 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.prettierrc.yaml +2 -0
- c2cgeoportal_geoportal/scaffolds/create/{Dockerfile_tmpl → {{cookiecutter.project}}/Dockerfile} +20 -11
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Makefile +14 -0
- c2cgeoportal_geoportal/scaffolds/create/{README.rst_tmpl → {{cookiecutter.project}}/README.rst} +4 -4
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/build +162 -0
- c2cgeoportal_geoportal/scaffolds/create/{ci/config.yaml_tmpl → {{cookiecutter.project}}/ci/config.yaml} +7 -5
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/requirements.txt +1 -0
- c2cgeoportal_geoportal/scaffolds/create/{docker-compose-lib.yaml → {{cookiecutter.project}}/docker-compose-lib.yaml} +133 -17
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose.override.sample.yaml +67 -0
- c2cgeoportal_geoportal/scaffolds/create/{docker-compose.yaml → {{cookiecutter.project}}/docker-compose.yaml} +17 -12
- c2cgeoportal_geoportal/scaffolds/create/{env.default_tmpl → {{cookiecutter.project}}/env.default} +29 -14
- c2cgeoportal_geoportal/scaffolds/create/{env.project_tmpl → {{cookiecutter.project}}/env.project} +16 -4
- c2cgeoportal_geoportal/scaffolds/create/{geoportal/vars.yaml_tmpl → {{cookiecutter.project}}/geoportal/vars.yaml} +93 -27
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/mobile.css +0 -0
- c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/data/Readme.txt +1 -1
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/demo.map.tmpl +224 -0
- c2cgeoportal_geoportal/scaffolds/create/{mapserver/mapserver.map.tmpl_tmpl → {{cookiecutter.project}}/mapserver/mapserver.map.tmpl} +7 -15
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Landscape.jrxml +8 -8
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Portrait.jrxml +8 -8
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Landscape.jrxml +8 -8
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Portrait.jrxml +8 -8
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/config.yaml.tmpl +5 -4
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/localisation.properties +4 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/localisation_fr.properties +4 -0
- c2cgeoportal_geoportal/scaffolds/create/{project.yaml_tmpl → {{cookiecutter.project}}/project.yaml} +6 -6
- c2cgeoportal_geoportal/scaffolds/create/{qgisserver/pg_service.conf.tmpl_tmpl → {{cookiecutter.project}}/qgisserver/pg_service.conf.tmpl} +2 -2
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-backup +110 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-restore +114 -0
- c2cgeoportal_geoportal/scaffolds/create/{setup.cfg_tmpl → {{cookiecutter.project}}/setup.cfg} +1 -1
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/spell-ignore-words.txt +3 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tilegeneration/config.yaml.tmpl +195 -0
- c2cgeoportal_geoportal/scaffolds/update/cookiecutter.json +18 -0
- c2cgeoportal_geoportal/scaffolds/update/{+dot+upgrade.yaml_tmpl → {{cookiecutter.project}}/.upgrade.yaml} +49 -39
- c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_CHANGELOG.txt +1160 -0
- c2cgeoportal_geoportal/scaffolds/update/{geoportal → {{cookiecutter.project}}/geoportal}/CONST_config-schema.yaml +47 -2
- c2cgeoportal_geoportal/scaffolds/update/{geoportal/CONST_vars.yaml_tmpl → {{cookiecutter.project}}/geoportal/CONST_vars.yaml} +350 -17
- c2cgeoportal_geoportal/scripts/__init__.py +16 -30
- c2cgeoportal_geoportal/scripts/c2cupgrade.py +271 -232
- c2cgeoportal_geoportal/scripts/create_demo_theme.py +3 -6
- c2cgeoportal_geoportal/scripts/manage_users.py +34 -39
- c2cgeoportal_geoportal/scripts/pcreate.py +312 -0
- c2cgeoportal_geoportal/scripts/theme2fts.py +72 -23
- c2cgeoportal_geoportal/scripts/urllogin.py +19 -11
- c2cgeoportal_geoportal/templates/login.html +88 -84
- c2cgeoportal_geoportal/templates/notlogin.html +59 -59
- c2cgeoportal_geoportal/templates/testi18n.html +6 -8
- c2cgeoportal_geoportal/views/__init__.py +23 -4
- c2cgeoportal_geoportal/views/dev.py +9 -7
- c2cgeoportal_geoportal/views/dynamic.py +56 -19
- c2cgeoportal_geoportal/views/entry.py +93 -24
- c2cgeoportal_geoportal/views/fulltextsearch.py +28 -22
- c2cgeoportal_geoportal/views/geometry_processing.py +15 -7
- c2cgeoportal_geoportal/views/i18n.py +91 -9
- c2cgeoportal_geoportal/views/layers.py +160 -126
- c2cgeoportal_geoportal/views/login.py +106 -93
- c2cgeoportal_geoportal/views/mapserverproxy.py +46 -29
- c2cgeoportal_geoportal/views/memory.py +12 -12
- c2cgeoportal_geoportal/views/ogcproxy.py +48 -30
- c2cgeoportal_geoportal/views/pdfreport.py +26 -22
- c2cgeoportal_geoportal/views/printproxy.py +60 -52
- c2cgeoportal_geoportal/views/profile.py +24 -23
- c2cgeoportal_geoportal/views/proxy.py +87 -69
- c2cgeoportal_geoportal/views/raster.py +35 -24
- c2cgeoportal_geoportal/views/resourceproxy.py +13 -11
- c2cgeoportal_geoportal/views/shortener.py +27 -24
- c2cgeoportal_geoportal/views/theme.py +427 -321
- c2cgeoportal_geoportal/views/tinyowsproxy.py +46 -39
- c2cgeoportal_geoportal/views/vector_tiles.py +80 -0
- {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.7.1.156.dist-info}/METADATA +25 -20
- c2cgeoportal_geoportal-2.7.1.156.dist-info/RECORD +185 -0
- {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.7.1.156.dist-info}/WHEEL +1 -1
- {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.7.1.156.dist-info}/entry_points.txt +3 -1
- tests/__init__.py +7 -3
- tests/test_cachebuster.py +0 -2
- tests/test_caching.py +17 -25
- tests/test_checker.py +0 -2
- tests/test_decimaljson.py +4 -4
- tests/test_headerstween.py +0 -2
- tests/test_i18n.py +1 -1
- tests/test_init.py +4 -7
- tests/test_locale_negociator.py +0 -2
- tests/test_mapserverproxy_route_predicate.py +0 -2
- tests/test_raster.py +0 -2
- tests/test_wmstparsing.py +0 -2
- c2cgeoportal_geoportal/scaffolds/__init__.py +0 -227
- c2cgeoportal_geoportal/scaffolds/create/+dot+dockerignore_tmpl +0 -12
- c2cgeoportal_geoportal/scaffolds/create/+dot+github/workflows/main.yaml_tmpl +0 -89
- c2cgeoportal_geoportal/scaffolds/create/+dot+github/workflows/rebuild.yaml_tmpl +0 -78
- c2cgeoportal_geoportal/scaffolds/create/+dot+gitignore_tmpl +0 -16
- c2cgeoportal_geoportal/scaffolds/create/Makefile +0 -3
- c2cgeoportal_geoportal/scaffolds/create/build_tmpl +0 -167
- c2cgeoportal_geoportal/scaffolds/create/ci/requirements.txt +0 -1
- c2cgeoportal_geoportal/scaffolds/create/ci/trigger +0 -68
- c2cgeoportal_geoportal/scaffolds/create/docker-compose.override.sample.yaml +0 -54
- c2cgeoportal_geoportal/scaffolds/create/geoportal/+dot+dockerignore_tmpl +0 -6
- c2cgeoportal_geoportal/scaffolds/create/geoportal/+dot+eslintrc_tmpl +0 -15
- c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/models.py_tmpl +0 -10
- c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static/robot.txt +0 -3
- c2cgeoportal_geoportal/scaffolds/create/geoportal/production.ini_tmpl +0 -106
- c2cgeoportal_geoportal/scaffolds/create/geoportal/requirements.txt +0 -2
- c2cgeoportal_geoportal/scaffolds/create/geoportal/tsconfig.json_tmpl +0 -9
- c2cgeoportal_geoportal/scaffolds/create/geoportal/webpack.api.js_tmpl +0 -72
- c2cgeoportal_geoportal/scaffolds/create/mapserver/demo.map.tmpl_tmpl +0 -262
- c2cgeoportal_geoportal/scaffolds/create/mapserver/tinyows.xml +0 -36
- c2cgeoportal_geoportal/scaffolds/create/print/print-apps/+package+/config.yaml +0 -168
- c2cgeoportal_geoportal/scaffolds/create/qgisserver/geomapfish.yaml.tmpl_tmpl +0 -16
- c2cgeoportal_geoportal/scaffolds/create/spell-ignore-words.txt +0 -1
- c2cgeoportal_geoportal/scaffolds/create/tilegeneration/config.yaml.tmpl_tmpl +0 -185
- c2cgeoportal_geoportal/scaffolds/create/yamllint.yaml +0 -11
- c2cgeoportal_geoportal/scaffolds/update/CONST_CHANGELOG.txt_tmpl +0 -454
- c2cgeoportal_geoportal/templates/dynamic.js +0 -21
- c2cgeoportal_geoportal-2.6.0.dist-info/RECORD +0 -173
- /c2cgeoportal_geoportal/{scaffolds/create/geoportal/+package+_geoportal/static/css/desktop.css → py.typed} +0 -0
- /c2cgeoportal_geoportal/scaffolds/{create/geoportal/Makefile_tmpl → advance_create/{{cookiecutter.project}}/geoportal/Makefile} +0 -0
- /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/alembic.ini +0 -0
- /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/language_mapping +0 -0
- /c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/lingua-server.cfg +0 -0
- /c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/views/__init__.py +0 -0
- /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
- /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal/static/css/iframe_api.css → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/desktop.css} +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal/static/css/mobile.css → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/iframe_api.css} +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/banner_left.png +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/banner_right.png +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/blank.png +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker-blue.png +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker-gold.png +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker-green.png +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/images/markers/marker.png +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{geoportal/+package+_geoportal → {{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal}/static/robot.txt.tmpl +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/data/TM_EUROPE_BORDERS-0.3.sql +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arial.ttf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arialbd.ttf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Arialbi.ttf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Ariali.ttf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Bold.ttf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-BoldItalic.ttf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Italic.ttf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/NotoSans-Regular.ttf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdana.ttf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanab.ttf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanai.ttf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts/Verdanaz.ttf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/fonts.conf +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{mapserver → {{cookiecutter.project}}/mapserver}/tinyows.xml.tmpl +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/legend.jrxml +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/logo.png +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/north.svg +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/results.jrxml +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{pyproject.toml → {{cookiecutter.project}}/pyproject.toml} +0 -0
- /c2cgeoportal_geoportal/scaffolds/create/{run_alembic.sh → {{cookiecutter.project}}/run_alembic.sh} +0 -0
- {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.7.1.156.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,4 @@
|
|
1
|
-
#
|
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"))
|
53
|
-
return binascii.hexlify(cipher.nonce + tag + ciphertext).decode("ascii")
|
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 =
|
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(
|
77
|
+
print(f"Use: auth={auth_enc}")
|
70
78
|
|
71
79
|
|
72
80
|
if __name__ == "__main__":
|
@@ -1,86 +1,90 @@
|
|
1
|
-
<!DOCTYPE
|
1
|
+
<!DOCTYPE html>
|
2
2
|
<html lang="${lang}">
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
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
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
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>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
# Copyright (c) 2011-
|
3
|
+
# Copyright (c) 2011-2021, Camptocamp SA
|
4
4
|
# All rights reserved.
|
5
5
|
|
6
6
|
# Redistribution and use in source and binary forms, with or without
|
@@ -27,17 +27,36 @@
|
|
27
27
|
# of the authors and should not be interpreted as representing official policies,
|
28
28
|
# either expressed or implied, of the FreeBSD Project.
|
29
29
|
|
30
|
+
from typing import Dict, List
|
30
31
|
|
32
|
+
import pyramid.config
|
33
|
+
import pyramid.request
|
31
34
|
from pyramid.httpexceptions import HTTPFound
|
32
35
|
|
33
36
|
|
34
|
-
def add_ending_slash(request):
|
37
|
+
def add_ending_slash(request: pyramid.request.Request) -> HTTPFound:
|
38
|
+
"""Add an ending slash view."""
|
35
39
|
return HTTPFound(location=request.path + "/")
|
36
40
|
|
37
41
|
|
38
|
-
def add_redirect(config, name, from_, to):
|
39
|
-
|
42
|
+
def add_redirect(config: pyramid.config.Configurator, name: str, from_: str, to: str) -> None:
|
43
|
+
"""Add a redirect view."""
|
44
|
+
|
45
|
+
def redirect_view(request: pyramid.request.Request) -> HTTPFound:
|
40
46
|
return HTTPFound(location=request.route_url(to))
|
41
47
|
|
42
48
|
config.add_route(name, from_, request_method="GET")
|
43
49
|
config.add_view(redirect_view, route_name=name)
|
50
|
+
|
51
|
+
|
52
|
+
def restrict_headers(headers: Dict[str, str], whitelist: List[str], blacklist: List[str]) -> Dict[str, str]:
|
53
|
+
"""
|
54
|
+
Filter headers with a whitelist then a blacklist.
|
55
|
+
|
56
|
+
Some default pyramid headers will be added back by pyramid.
|
57
|
+
"""
|
58
|
+
if len(whitelist) > 0:
|
59
|
+
headers = {key: value for key, value in headers.items() if key in whitelist}
|
60
|
+
|
61
|
+
headers = {key: value for key, value in headers.items() if key not in blacklist}
|
62
|
+
return headers
|
@@ -1,6 +1,4 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
# Copyright (c) 2011-2020, Camptocamp SA
|
1
|
+
# Copyright (c) 2011-2021, Camptocamp SA
|
4
2
|
# All rights reserved.
|
5
3
|
|
6
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -31,25 +29,29 @@
|
|
31
29
|
import logging
|
32
30
|
import re
|
33
31
|
|
32
|
+
import pyramid.request
|
33
|
+
import pyramid.response
|
34
34
|
from pyramid.httpexceptions import HTTPFound
|
35
35
|
from pyramid.view import view_config
|
36
36
|
|
37
|
+
from c2cgeoportal_commons.lib.url import Url
|
37
38
|
from c2cgeoportal_geoportal.views.proxy import Proxy
|
38
39
|
|
39
40
|
logger = logging.getLogger(__name__)
|
40
41
|
|
41
42
|
|
42
43
|
class Dev(Proxy):
|
44
|
+
"""All the development views."""
|
43
45
|
|
44
46
|
THEME_RE = re.compile(r"/theme/.*$")
|
45
47
|
|
46
|
-
def __init__(self, request):
|
48
|
+
def __init__(self, request: pyramid.request.Request):
|
47
49
|
super().__init__(request)
|
48
50
|
self.dev_url = self.request.registry.settings["devserver_url"]
|
49
51
|
|
50
|
-
@view_config(route_name="dev")
|
51
|
-
def dev(self):
|
52
|
+
@view_config(route_name="dev") # type: ignore
|
53
|
+
def dev(self) -> pyramid.response.Response:
|
52
54
|
path = self.THEME_RE.sub("", self.request.path_info)
|
53
55
|
if self.request.path.endswith("/dynamic.js"):
|
54
56
|
return HTTPFound(location=self.request.route_url("dynamic", _query=self.request.params))
|
55
|
-
return self._proxy_response("dev", "{
|
57
|
+
return self._proxy_response("dev", Url(f"{self.dev_url.rstrip('/')}/{path.lstrip('/')}"))
|
@@ -1,6 +1,4 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
# Copyright (c) 2018-2021, Camptocamp SA
|
1
|
+
# Copyright (c) 2018-2025, Camptocamp SA
|
4
2
|
# All rights reserved.
|
5
3
|
|
6
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -30,8 +28,9 @@
|
|
30
28
|
|
31
29
|
import re
|
32
30
|
import urllib.parse
|
33
|
-
from typing import Dict, List, Union
|
31
|
+
from typing import Any, Dict, List, Union, cast
|
34
32
|
|
33
|
+
import pyramid.request
|
35
34
|
from pyramid.httpexceptions import HTTPNotFound
|
36
35
|
from pyramid.view import view_config
|
37
36
|
from sqlalchemy import func
|
@@ -39,22 +38,25 @@ from sqlalchemy import func
|
|
39
38
|
from c2cgeoportal_commons import models
|
40
39
|
from c2cgeoportal_commons.models import main
|
41
40
|
from c2cgeoportal_geoportal.lib.cacheversion import get_cache_version
|
42
|
-
from c2cgeoportal_geoportal.lib.caching import
|
41
|
+
from c2cgeoportal_geoportal.lib.caching import get_region
|
42
|
+
from c2cgeoportal_geoportal.lib.common_headers import Cache, set_common_headers
|
43
43
|
|
44
44
|
CACHE_REGION = get_region("std")
|
45
45
|
|
46
46
|
|
47
47
|
class DynamicView:
|
48
|
-
|
48
|
+
"""The dynamic vies that provide the configuration of the client application."""
|
49
|
+
|
50
|
+
def __init__(self, request: pyramid.request.Request):
|
49
51
|
self.request = request
|
50
52
|
self.settings = request.registry.settings
|
51
53
|
self.interfaces_config = self.settings["interfaces_config"]
|
52
54
|
|
53
|
-
def get(self, value, interface):
|
54
|
-
return self.interfaces_config.get(interface, {}).get(value, {})
|
55
|
+
def get(self, value: Dict[str, Any], interface: str) -> Dict[str, Any]:
|
56
|
+
return cast(Dict[str, Any], self.interfaces_config.get(interface, {}).get(value, {}))
|
55
57
|
|
56
|
-
@CACHE_REGION.cache_on_arguments()
|
57
|
-
def _fulltextsearch_groups(self): # pylint: disable=no-self-use
|
58
|
+
@CACHE_REGION.cache_on_arguments() # type: ignore
|
59
|
+
def _fulltextsearch_groups(self) -> List[str]: # pylint: disable=no-self-use
|
58
60
|
return [
|
59
61
|
group[0]
|
60
62
|
for group in models.DBSession.query(func.distinct(main.FullTextSearch.layer_name))
|
@@ -62,11 +64,30 @@ class DynamicView:
|
|
62
64
|
.all()
|
63
65
|
]
|
64
66
|
|
65
|
-
def _interface(
|
67
|
+
def _interface(
|
68
|
+
self,
|
69
|
+
interface_config: Dict[str, Any],
|
70
|
+
interface_name: str,
|
71
|
+
original_interface_name: str,
|
72
|
+
dynamic: Dict[str, Any],
|
73
|
+
) -> Dict[str, Any]:
|
74
|
+
"""
|
75
|
+
Get the interface configuration.
|
76
|
+
|
77
|
+
Arguments:
|
78
|
+
|
79
|
+
interface_config: Current interface configuration
|
80
|
+
interface_name: Interface name (we use in the configuration)
|
81
|
+
original_interface_name: Original interface name (directly for the query string)
|
82
|
+
dynamic: The values that's dynamically generated
|
83
|
+
"""
|
66
84
|
|
67
85
|
if "extends" in interface_config:
|
68
86
|
constants = self._interface(
|
69
|
-
self.interfaces_config[interface_config["extends"]],
|
87
|
+
self.interfaces_config[interface_config["extends"]],
|
88
|
+
interface_name,
|
89
|
+
original_interface_name,
|
90
|
+
dynamic,
|
70
91
|
)
|
71
92
|
else:
|
72
93
|
constants = {}
|
@@ -87,7 +108,7 @@ class DynamicView:
|
|
87
108
|
)
|
88
109
|
|
89
110
|
for constant, config in interface_config.get("routes", {}).items():
|
90
|
-
route_name =
|
111
|
+
route_name = original_interface_name if config.get("currentInterface", False) else config["name"]
|
91
112
|
params: Dict[str, str] = {}
|
92
113
|
params.update(config.get("params", {}))
|
93
114
|
for name, dyn in config.get("dynamic_params", {}).items():
|
@@ -98,14 +119,29 @@ class DynamicView:
|
|
98
119
|
|
99
120
|
return constants
|
100
121
|
|
101
|
-
@view_config(route_name="dynamic", renderer="json")
|
102
|
-
def dynamic(self):
|
103
|
-
|
122
|
+
@view_config(route_name="dynamic", renderer="json") # type: ignore
|
123
|
+
def dynamic(self) -> Dict[str, Any]:
|
124
|
+
self.request.response.headers["Vary"] = "Host"
|
125
|
+
original_interface_name = self.request.params.get("interface")
|
126
|
+
interface_name = self.request.get_organization_interface(original_interface_name)
|
104
127
|
|
105
128
|
if interface_name not in self.interfaces_config:
|
106
129
|
raise HTTPNotFound("Interface {} doesn't exists in the 'interfaces_config'.")
|
107
130
|
|
108
131
|
interface_config = self.interfaces_config[interface_name]
|
132
|
+
lang_urls_suffix = interface_config.get("lang_urls_suffix", "")
|
133
|
+
|
134
|
+
i18next_configuration = self.settings.get("i18next", {})
|
135
|
+
i18next_configuration.setdefault("backend", {})
|
136
|
+
if "loadPath" not in i18next_configuration["backend"]:
|
137
|
+
path: List[str] = [
|
138
|
+
self.request.route_url("base").rstrip("/"),
|
139
|
+
"static-{{ns}}",
|
140
|
+
get_cache_version(),
|
141
|
+
"locales",
|
142
|
+
"{{lng}}.json",
|
143
|
+
]
|
144
|
+
i18next_configuration["backend"]["loadPath"] = "/".join(path)
|
109
145
|
|
110
146
|
dynamic = {
|
111
147
|
"interface": interface_name,
|
@@ -113,14 +149,15 @@ class DynamicView:
|
|
113
149
|
"two_factor": self.request.registry.settings.get("authentication", {}).get("two_factor", False),
|
114
150
|
"lang_urls": {
|
115
151
|
lang: self.request.static_url(
|
116
|
-
"/etc/geomapfish/static/{lang}.json"
|
152
|
+
f"/etc/geomapfish/static/{lang}{lang_urls_suffix}.json",
|
117
153
|
)
|
118
154
|
for lang in self.request.registry.settings["available_locale_names"]
|
119
155
|
},
|
156
|
+
"i18next_configuration": i18next_configuration,
|
120
157
|
"fulltextsearch_groups": self._fulltextsearch_groups(),
|
121
158
|
}
|
122
159
|
|
123
|
-
constants = self._interface(interface_config, interface_name, dynamic)
|
160
|
+
constants = self._interface(interface_config, interface_name, original_interface_name, dynamic)
|
124
161
|
|
125
162
|
do_redirect = False
|
126
163
|
url = None
|
@@ -159,5 +196,5 @@ class DynamicView:
|
|
159
196
|
else:
|
160
197
|
constants["redirectUrl"] = no_redirect_url
|
161
198
|
|
162
|
-
set_common_headers(self.request, "dynamic",
|
199
|
+
set_common_headers(self.request, "dynamic", Cache.PUBLIC_NO)
|
163
200
|
return {"constants": constants, "doRedirect": do_redirect, "redirectUrl": url}
|