c2cgeoportal-geoportal 2.6.0__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.
- c2cgeoportal_geoportal/__init__.py +224 -84
- c2cgeoportal_geoportal/lib/__init__.py +64 -42
- 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 +119 -87
- 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 +104 -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 +158 -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 +66 -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 +107 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/scripts/db-restore +111 -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 +1153 -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 -15
- c2cgeoportal_geoportal/scripts/__init__.py +15 -31
- 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 +17 -9
- 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 +54 -18
- 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 +45 -28
- 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 +56 -50
- c2cgeoportal_geoportal/views/profile.py +24 -23
- c2cgeoportal_geoportal/views/proxy.py +84 -67
- 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.83.dist-info}/METADATA +24 -20
- c2cgeoportal_geoportal-2.7.1.83.dist-info/RECORD +185 -0
- {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.7.1.83.dist-info}/WHEEL +1 -1
- {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.7.1.83.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.83.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,3 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
1
|
# Copyright (c) 2011-2021, Camptocamp SA
|
4
2
|
# All rights reserved.
|
5
3
|
|
@@ -30,15 +28,22 @@
|
|
30
28
|
import importlib
|
31
29
|
import logging
|
32
30
|
import os
|
31
|
+
from functools import partial
|
32
|
+
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, cast
|
33
33
|
from urllib.parse import urlsplit
|
34
34
|
|
35
35
|
import c2cgeoform
|
36
36
|
import c2cwsgiutils
|
37
37
|
import c2cwsgiutils.db
|
38
38
|
import c2cwsgiutils.index
|
39
|
+
import pyramid.config
|
40
|
+
import pyramid.renderers
|
41
|
+
import pyramid.request
|
42
|
+
import pyramid.response
|
39
43
|
import pyramid.security
|
40
44
|
import zope.event.classhandler
|
41
45
|
from c2cgeoform import Form, translator
|
46
|
+
from c2cwsgiutils.broadcast import decorator
|
42
47
|
from c2cwsgiutils.health_check import HealthCheck
|
43
48
|
from c2cwsgiutils.metrics import MemoryMapProvider, add_provider
|
44
49
|
from dogpile.cache import register_backend
|
@@ -54,7 +59,7 @@ import c2cgeoportal_geoportal.views
|
|
54
59
|
from c2cgeoportal_commons.models import InvalidateCacheEvent
|
55
60
|
from c2cgeoportal_geoportal.lib import C2CPregenerator, caching, check_collector, checker
|
56
61
|
from c2cgeoportal_geoportal.lib.cacheversion import version_cache_buster
|
57
|
-
from c2cgeoportal_geoportal.lib.
|
62
|
+
from c2cgeoportal_geoportal.lib.common_headers import Cache, set_common_headers
|
58
63
|
from c2cgeoportal_geoportal.lib.i18n import available_locale_names
|
59
64
|
from c2cgeoportal_geoportal.lib.metrics import (
|
60
65
|
MemoryCacheSizeProvider,
|
@@ -62,7 +67,11 @@ from c2cgeoportal_geoportal.lib.metrics import (
|
|
62
67
|
TotalPythonObjectMemoryProvider,
|
63
68
|
)
|
64
69
|
from c2cgeoportal_geoportal.lib.xsd import XSD
|
65
|
-
from c2cgeoportal_geoportal.views.entry import Entry
|
70
|
+
from c2cgeoportal_geoportal.views.entry import Entry, canvas_view
|
71
|
+
|
72
|
+
if TYPE_CHECKING:
|
73
|
+
from c2cgeoportal_commons.models import static # pylint: disable=ungrouped-imports,useless-suppression
|
74
|
+
|
66
75
|
|
67
76
|
LOG = logging.getLogger(__name__)
|
68
77
|
|
@@ -72,54 +81,132 @@ GEOJSON_CONTENT_TYPE = r"Content-Type:application/geo\+json"
|
|
72
81
|
|
73
82
|
|
74
83
|
class AssetRendererFactory:
|
75
|
-
|
84
|
+
"""Get a renderer for the assets."""
|
85
|
+
|
86
|
+
def __init__(self, info: Any):
|
76
87
|
del info # unused
|
77
88
|
self.resolver = AssetResolver("c2cgeoportal_geoportal")
|
78
89
|
|
79
|
-
def __call__(self, value, system):
|
90
|
+
def __call__(self, value: Any, system: Dict[str, str]) -> bytes:
|
91
|
+
del value
|
80
92
|
asset = self.resolver.resolve(system["renderer_name"])
|
81
|
-
return asset.stream().read()
|
93
|
+
return cast(bytes, asset.stream().read())
|
82
94
|
|
83
95
|
|
84
96
|
INTERFACE_TYPE_NGEO = "ngeo"
|
97
|
+
INTERFACE_TYPE_CANVAS = "canvas"
|
85
98
|
|
86
99
|
|
87
|
-
def
|
88
|
-
|
89
|
-
|
90
|
-
del interface_type # unused
|
91
|
-
route = "/" if default else "/{}".format(interface_name)
|
92
|
-
add_interface_ngeo(
|
100
|
+
def add_interface_config(config: pyramid.config.Configurator, interface_config: Dict[str, Any]) -> None:
|
101
|
+
"""Add the interface (desktop, mobile, ...) views and routes with only the config."""
|
102
|
+
add_interface(
|
93
103
|
config,
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
104
|
+
interface_config["name"],
|
105
|
+
interface_config.get("type", INTERFACE_TYPE_NGEO),
|
106
|
+
interface_config,
|
107
|
+
default=interface_config.get("default", False),
|
98
108
|
)
|
99
109
|
|
100
110
|
|
101
|
-
def
|
111
|
+
def add_interface(
|
112
|
+
config: pyramid.config.Configurator,
|
113
|
+
interface_name: str = "desktop",
|
114
|
+
interface_type: str = INTERFACE_TYPE_NGEO,
|
115
|
+
interface_config: Optional[Dict[str, Any]] = None,
|
116
|
+
default: bool = False,
|
117
|
+
**kwargs: Any,
|
118
|
+
) -> None:
|
119
|
+
"""Add the interface (desktop, mobile, ...) views and routes."""
|
120
|
+
route = "/" if default else f"/{interface_name}"
|
121
|
+
if interface_type == INTERFACE_TYPE_NGEO:
|
122
|
+
add_interface_ngeo(
|
123
|
+
config,
|
124
|
+
route_name=interface_name,
|
125
|
+
route=route,
|
126
|
+
renderer=f"/etc/static-ngeo/{interface_name}.html",
|
127
|
+
**kwargs,
|
128
|
+
)
|
129
|
+
elif interface_type == INTERFACE_TYPE_CANVAS:
|
130
|
+
assert interface_config is not None
|
131
|
+
add_interface_canvas(
|
132
|
+
config,
|
133
|
+
route_name=interface_name,
|
134
|
+
route=route,
|
135
|
+
interface_config=interface_config,
|
136
|
+
**kwargs,
|
137
|
+
)
|
138
|
+
else:
|
139
|
+
LOG.error(
|
140
|
+
"Unknown interface type '%s', should be '%s' or '%s'.",
|
141
|
+
interface_type,
|
142
|
+
INTERFACE_TYPE_NGEO,
|
143
|
+
INTERFACE_TYPE_CANVAS,
|
144
|
+
)
|
145
|
+
|
146
|
+
|
147
|
+
def add_interface_ngeo(
|
148
|
+
config: pyramid.config.Configurator,
|
149
|
+
route_name: str,
|
150
|
+
route: str,
|
151
|
+
renderer: Optional[str] = None,
|
152
|
+
permission: Optional[str] = None,
|
153
|
+
) -> None:
|
154
|
+
"""Add the ngeo interfaces views and routes."""
|
102
155
|
|
103
156
|
config.add_route(route_name, route, request_method="GET")
|
104
|
-
config.add_view(
|
105
|
-
Entry, attr="get_ngeo_index_vars", route_name=route_name, renderer=renderer, permission=permission
|
106
|
-
)
|
107
157
|
# Permalink theme: recover the theme for generating custom viewer.js url
|
108
158
|
config.add_route(
|
109
|
-
"{}theme"
|
110
|
-
"{}{
|
159
|
+
f"{route_name}theme",
|
160
|
+
f"{route}{'' if route[-1] == '/' else '/'}theme/{{themes}}",
|
111
161
|
request_method="GET",
|
112
162
|
)
|
163
|
+
config.add_view(
|
164
|
+
Entry, attr="get_ngeo_index_vars", route_name=route_name, renderer=renderer, permission=permission
|
165
|
+
)
|
113
166
|
config.add_view(
|
114
167
|
Entry,
|
115
168
|
attr="get_ngeo_index_vars",
|
116
|
-
route_name="{}theme"
|
169
|
+
route_name=f"{route_name}theme",
|
117
170
|
renderer=renderer,
|
118
171
|
permission=permission,
|
119
172
|
)
|
120
173
|
|
121
174
|
|
122
|
-
def
|
175
|
+
def add_interface_canvas(
|
176
|
+
config: pyramid.config.Configurator,
|
177
|
+
route_name: str,
|
178
|
+
route: str,
|
179
|
+
interface_config: Dict[str, Any],
|
180
|
+
permission: Optional[str] = None,
|
181
|
+
) -> None:
|
182
|
+
"""Add the ngeo interfaces views and routes."""
|
183
|
+
|
184
|
+
renderer = f"/etc/geomapfish/interfaces/{route_name}.html.mako"
|
185
|
+
config.add_route(route_name, route, request_method="GET")
|
186
|
+
# Permalink theme: recover the theme for generating custom viewer.js URL
|
187
|
+
config.add_route(
|
188
|
+
f"{route_name}theme",
|
189
|
+
f"{route}{'' if route[-1] == '/' else '/'}theme/{{themes}}",
|
190
|
+
request_method="GET",
|
191
|
+
)
|
192
|
+
view = partial(canvas_view, interface_config=interface_config)
|
193
|
+
view.__module__ = canvas_view.__module__
|
194
|
+
config.add_view(
|
195
|
+
view,
|
196
|
+
route_name=route_name,
|
197
|
+
renderer=renderer,
|
198
|
+
permission=permission,
|
199
|
+
)
|
200
|
+
config.add_view(
|
201
|
+
view,
|
202
|
+
route_name=f"{route_name}theme",
|
203
|
+
renderer=renderer,
|
204
|
+
permission=permission,
|
205
|
+
)
|
206
|
+
|
207
|
+
|
208
|
+
def add_admin_interface(config: pyramid.config.Configurator) -> None:
|
209
|
+
"""Add the administration interface views and routes."""
|
123
210
|
if config.get_settings().get("enable_admin_interface", False):
|
124
211
|
config.add_request_method(
|
125
212
|
lambda request: c2cgeoportal_commons.models.DBSession(),
|
@@ -131,7 +218,8 @@ def add_admin_interface(config):
|
|
131
218
|
config.include("c2cgeoportal_admin")
|
132
219
|
|
133
220
|
|
134
|
-
def add_getitfixed(config):
|
221
|
+
def add_getitfixed(config: pyramid.config.Configurator) -> None:
|
222
|
+
"""Add the get it fixed views and routes."""
|
135
223
|
if config.get_settings()["getitfixed"].get("enabled", False):
|
136
224
|
for route_name, pattern in (
|
137
225
|
("getitfixed_add_ending_slash", "/getitfixed"),
|
@@ -144,8 +232,9 @@ def add_getitfixed(config):
|
|
144
232
|
Form.set_zpt_renderer(c2cgeoform.default_search_paths, translator=translator)
|
145
233
|
|
146
234
|
|
147
|
-
def locale_negotiator(request):
|
148
|
-
|
235
|
+
def locale_negotiator(request: pyramid.request.Request) -> str:
|
236
|
+
"""Get the current language."""
|
237
|
+
lang: str = request.params.get("lang")
|
149
238
|
if lang is None:
|
150
239
|
lang = request.cookies.get("_LOCALE_")
|
151
240
|
else:
|
@@ -159,30 +248,34 @@ def locale_negotiator(request):
|
|
159
248
|
return lang
|
160
249
|
|
161
250
|
|
162
|
-
def _match_url_start(reference, value):
|
163
|
-
"""
|
164
|
-
Checks that the val URL starts like the ref URL.
|
165
|
-
"""
|
251
|
+
def _match_url_start(reference: str, value: List[str]) -> bool:
|
252
|
+
"""Check that the val URL starts like the ref URL."""
|
166
253
|
reference_parts = reference.rstrip("/").split("/")
|
167
|
-
|
168
|
-
value_parts = value[0:len(reference_parts)]
|
169
|
-
# fmt: on
|
254
|
+
value_parts = value[0 : len(reference_parts)]
|
170
255
|
return reference_parts == value_parts
|
171
256
|
|
172
257
|
|
173
|
-
def
|
258
|
+
def is_valid_referrer(request: pyramid.request.Request, settings: Optional[Dict[str, Any]] = None) -> bool:
|
259
|
+
"""Check if the referrer is valid."""
|
174
260
|
if request.referer is not None:
|
175
|
-
|
261
|
+
referrer = urlsplit(request.referer)._replace(query="", fragment="").geturl().rstrip("/").split("/")
|
176
262
|
if settings is None:
|
177
263
|
settings = request.registry.settings
|
178
264
|
list_ = settings.get("authorized_referers", [])
|
179
|
-
return any(_match_url_start(e,
|
265
|
+
return any(_match_url_start(e, referrer) for e in list_)
|
180
266
|
return True
|
181
267
|
|
182
268
|
|
183
|
-
def create_get_user_from_request(
|
184
|
-
|
185
|
-
|
269
|
+
def create_get_user_from_request(
|
270
|
+
settings: Dict[str, Any]
|
271
|
+
) -> Callable[[pyramid.request.Request, Optional[str]], Optional["static.User"]]:
|
272
|
+
"""Get the get_user_from_request function."""
|
273
|
+
|
274
|
+
def get_user_from_request(
|
275
|
+
request: pyramid.request.Request, username: Optional[str] = None
|
276
|
+
) -> Optional["static.User"]:
|
277
|
+
"""
|
278
|
+
Return the User object for the request.
|
186
279
|
|
187
280
|
Return ``None`` if:
|
188
281
|
* user is anonymous
|
@@ -193,7 +286,7 @@ def create_get_user_from_request(settings):
|
|
193
286
|
from c2cgeoportal_commons.models.static import User # pylint: disable=import-outside-toplevel
|
194
287
|
|
195
288
|
if not hasattr(request, "is_valid_referer"):
|
196
|
-
request.is_valid_referer =
|
289
|
+
request.is_valid_referer = is_valid_referrer(request, settings)
|
197
290
|
if not request.is_valid_referer:
|
198
291
|
LOG.debug("Invalid referer for %s: %s", request.path_qs, repr(request.referer))
|
199
292
|
return None
|
@@ -209,13 +302,16 @@ def create_get_user_from_request(settings):
|
|
209
302
|
DBSession.query(User).filter_by(username=username).options(joinedload("roles")).first()
|
210
303
|
)
|
211
304
|
|
212
|
-
return request.user_
|
305
|
+
return cast(User, request.user_)
|
213
306
|
|
214
307
|
return get_user_from_request
|
215
308
|
|
216
309
|
|
217
|
-
def set_user_validator(
|
218
|
-
|
310
|
+
def set_user_validator(
|
311
|
+
config: pyramid.config.Configurator, user_validator: Callable[[pyramid.request.Request, str, str], str]
|
312
|
+
) -> None:
|
313
|
+
"""
|
314
|
+
Call this function to register a user validator function.
|
219
315
|
|
220
316
|
The validator function is passed three arguments: ``request``,
|
221
317
|
``username``, and ``password``. The function should return the
|
@@ -231,11 +327,12 @@ def set_user_validator(config, user_validator):
|
|
231
327
|
config.action("user_validator", register)
|
232
328
|
|
233
329
|
|
234
|
-
def default_user_validator(request, username, password):
|
330
|
+
def default_user_validator(request: pyramid.request.Request, username: str, password: str) -> Optional[str]:
|
235
331
|
"""
|
236
|
-
Validate the username/password.
|
237
|
-
|
238
|
-
Return None if we are anonymous, the string to remember
|
332
|
+
Validate the username/password.
|
333
|
+
|
334
|
+
This is c2cgeoportal's default user validator. Return None if we are anonymous, the string to remember
|
335
|
+
otherwise.
|
239
336
|
"""
|
240
337
|
del request # unused
|
241
338
|
from c2cgeoportal_commons.models import DBSession # pylint: disable=import-outside-toplevel
|
@@ -243,7 +340,7 @@ def default_user_validator(request, username, password):
|
|
243
340
|
|
244
341
|
user = DBSession.query(User).filter_by(username=username).first()
|
245
342
|
if user is None:
|
246
|
-
LOG.info('
|
343
|
+
LOG.info('Unknown user "%s" tried to log in', username)
|
247
344
|
return None
|
248
345
|
if user.deactivated:
|
249
346
|
LOG.info('Deactivated user "%s" tried to log in', username)
|
@@ -258,49 +355,52 @@ def default_user_validator(request, username, password):
|
|
258
355
|
|
259
356
|
|
260
357
|
class MapserverproxyRoutePredicate:
|
261
|
-
"""
|
262
|
-
|
263
|
-
return 404s on GetCapabilities requests."""
|
358
|
+
"""
|
359
|
+
Serve as a custom route predicate function for mapserverproxy.
|
264
360
|
|
265
|
-
|
266
|
-
|
361
|
+
If the hide_capabilities setting is set and is true then we want to return 404s on GetCapabilities
|
362
|
+
requests.
|
363
|
+
"""
|
364
|
+
|
365
|
+
def __init__(self, val: Any, config: pyramid.config.Configurator) -> None:
|
366
|
+
del val, config
|
267
367
|
|
268
|
-
def __call__(self, context, request):
|
368
|
+
def __call__(self, context: Any, request: pyramid.request.Request) -> bool:
|
369
|
+
del context
|
269
370
|
hide_capabilities = request.registry.settings.get("hide_capabilities")
|
270
371
|
if not hide_capabilities:
|
271
372
|
return True
|
272
|
-
params =
|
373
|
+
params = {k.lower(): v.lower() for k, v in request.params.items()}
|
273
374
|
return "request" not in params or params["request"] not in ("getcapabilities", "capabilities")
|
274
375
|
|
275
376
|
@staticmethod
|
276
|
-
def text():
|
377
|
+
def text() -> str:
|
277
378
|
return "mapserverproxy"
|
278
379
|
|
279
380
|
phash = text
|
280
381
|
|
281
382
|
|
282
|
-
def add_cors_route(config, pattern, service):
|
283
|
-
"""
|
284
|
-
Add the OPTIONS route and view need for services supporting CORS.
|
285
|
-
"""
|
383
|
+
def add_cors_route(config: pyramid.config.Configurator, pattern: str, service: str) -> None:
|
384
|
+
"""Add the OPTIONS route and view need for services supporting CORS."""
|
286
385
|
|
287
|
-
def view(request
|
288
|
-
return set_common_headers(request, service,
|
386
|
+
def view(request: pyramid.request.Request) -> pyramid.response.Response:
|
387
|
+
return set_common_headers(request, service, Cache.PRIVATE_NO)
|
289
388
|
|
290
389
|
name = pattern + "_options"
|
291
390
|
config.add_route(name, pattern, request_method="OPTIONS")
|
292
391
|
config.add_view(view, route_name=name)
|
293
392
|
|
294
393
|
|
295
|
-
def error_handler(
|
296
|
-
|
297
|
-
|
298
|
-
"""
|
394
|
+
def error_handler(
|
395
|
+
http_exception: HTTPException, request: pyramid.request.Request
|
396
|
+
) -> pyramid.response.Response:
|
397
|
+
"""View callable for handling all the exceptions that are not already handled."""
|
299
398
|
LOG.warning("%s returned status code %s", request.url, http_exception.status_code)
|
300
|
-
return
|
399
|
+
return set_common_headers(request, "error", Cache.PRIVATE_NO, http_exception)
|
301
400
|
|
302
401
|
|
303
|
-
def call_hook(settings, name, *args, **kwargs):
|
402
|
+
def call_hook(settings: pyramid.config.Configurator, name: str, *args: Any, **kwargs: Any) -> None:
|
403
|
+
"""Call the hook defined in the settings."""
|
304
404
|
hooks = settings.get("hooks", {})
|
305
405
|
hook = hooks.get(name)
|
306
406
|
if hook is None:
|
@@ -311,11 +411,8 @@ def call_hook(settings, name, *args, **kwargs):
|
|
311
411
|
function_(*args, **kwargs)
|
312
412
|
|
313
413
|
|
314
|
-
def includeme(config: pyramid.config.Configurator):
|
315
|
-
"""
|
316
|
-
This function returns a Pyramid WSGI application.
|
317
|
-
"""
|
318
|
-
|
414
|
+
def includeme(config: pyramid.config.Configurator) -> None:
|
415
|
+
"""Get the Pyramid WSGI application."""
|
319
416
|
settings = config.get_settings()
|
320
417
|
|
321
418
|
if "available_locale_names" not in settings:
|
@@ -327,7 +424,7 @@ def includeme(config: pyramid.config.Configurator):
|
|
327
424
|
config.add_request_method(get_user_from_request, name="user", property=True)
|
328
425
|
config.add_request_method(get_user_from_request, name="get_user")
|
329
426
|
# Be able for an organization to override the method to use alternate:
|
330
|
-
# - Organization roles name for the standard roles 'anonymous', '
|
427
|
+
# - Organization roles name for the standard roles 'anonymous', 'registered' and 'intranet'.
|
331
428
|
config.add_request_method(lambda request, role_type: role_type, name="get_organization_role")
|
332
429
|
# - Organization print URL
|
333
430
|
config.add_request_method(
|
@@ -339,6 +436,7 @@ def includeme(config: pyramid.config.Configurator):
|
|
339
436
|
# Configure 'locale' dir as the translation dir for c2cgeoportal app
|
340
437
|
config.add_translation_dirs("c2cgeoportal_geoportal:locale/")
|
341
438
|
|
439
|
+
config.include("pyramid_mako")
|
342
440
|
config.include("c2cwsgiutils.pyramid.includeme")
|
343
441
|
health_check = HealthCheck(config)
|
344
442
|
config.registry["health_check"] = health_check
|
@@ -356,7 +454,7 @@ def includeme(config: pyramid.config.Configurator):
|
|
356
454
|
add_provider(TotalPythonObjectMemoryProvider())
|
357
455
|
|
358
456
|
# Initialise DBSessions
|
359
|
-
|
457
|
+
init_db_sessions(settings, config, health_check)
|
360
458
|
|
361
459
|
checker.init(config, health_check)
|
362
460
|
check_collector.init(config, health_check)
|
@@ -370,8 +468,8 @@ def includeme(config: pyramid.config.Configurator):
|
|
370
468
|
for name, cache_config in settings["cache"].items():
|
371
469
|
caching.init_region(cache_config, name)
|
372
470
|
|
373
|
-
@zope.event.classhandler.handler(InvalidateCacheEvent)
|
374
|
-
def handle(event: InvalidateCacheEvent)
|
471
|
+
@zope.event.classhandler.handler(InvalidateCacheEvent) # type: ignore
|
472
|
+
def handle(event: InvalidateCacheEvent) -> None:
|
375
473
|
del event
|
376
474
|
caching.invalidate_region()
|
377
475
|
if caching.MEMORY_CACHE_DICT:
|
@@ -380,7 +478,7 @@ def includeme(config: pyramid.config.Configurator):
|
|
380
478
|
|
381
479
|
# Register a tween to get back the cache buster path.
|
382
480
|
if "cache_path" not in config.get_settings():
|
383
|
-
config.get_settings()["cache_path"] = ["static"]
|
481
|
+
config.get_settings()["cache_path"] = ["static", "static-geomapfish"]
|
384
482
|
config.add_tween("c2cgeoportal_geoportal.lib.cacheversion.CachebusterTween")
|
385
483
|
config.add_tween("c2cgeoportal_geoportal.lib.headers.HeadersTween")
|
386
484
|
|
@@ -420,6 +518,22 @@ def includeme(config: pyramid.config.Configurator):
|
|
420
518
|
pregenerator=C2CPregenerator(role=True),
|
421
519
|
request_method="POST",
|
422
520
|
)
|
521
|
+
# The tow next views are used to serve the application on the URL /mapserv_proxy/<ogc server name>
|
522
|
+
# instead of /mapserv_proxy?ogcserver=<ogc server name>, required for QGIS server landing page
|
523
|
+
config.add_route(
|
524
|
+
"mapserverproxy_get_path",
|
525
|
+
"/mapserv_proxy/{ogcserver}/*path",
|
526
|
+
mapserverproxy=True,
|
527
|
+
pregenerator=C2CPregenerator(role=True),
|
528
|
+
request_method="GET",
|
529
|
+
)
|
530
|
+
config.add_route(
|
531
|
+
"mapserverproxy_post_path",
|
532
|
+
"/mapserv_proxy/{ogcserver}/*path",
|
533
|
+
mapserverproxy=True,
|
534
|
+
pregenerator=C2CPregenerator(role=True),
|
535
|
+
request_method="POST",
|
536
|
+
)
|
423
537
|
add_cors_route(config, "/mapserv_proxy", "mapserver")
|
424
538
|
|
425
539
|
# Add route to the tinyows proxy
|
@@ -444,14 +558,15 @@ def includeme(config: pyramid.config.Configurator):
|
|
444
558
|
config.add_renderer(".css", AssetRendererFactory)
|
445
559
|
config.add_renderer(".ico", AssetRendererFactory)
|
446
560
|
config.add_route("localejson", "/locale.json", request_method="GET")
|
561
|
+
config.add_route("localepot", "/locale.pot", request_method="GET")
|
447
562
|
|
448
|
-
def add_static_route(name: str, attr: str, path: str, renderer: str):
|
563
|
+
def add_static_route(name: str, attr: str, path: str, renderer: str) -> None:
|
449
564
|
config.add_route(name, path, request_method="GET")
|
450
565
|
config.add_view(Entry, attr=attr, route_name=name, renderer=renderer)
|
451
566
|
|
452
567
|
add_static_route("favicon", "favicon", "/favicon.ico", "/etc/geomapfish/static/images/favicon.ico")
|
453
568
|
add_static_route("robot.txt", "robot_txt", "/robot.txt", "/etc/geomapfish/static/robot.txt")
|
454
|
-
|
569
|
+
config.add_route("apijs", "/api.js", request_method="GET")
|
455
570
|
add_static_route("apijsmap", "apijsmap", "/api.js.map", "/etc/static-ngeo/api.js.map")
|
456
571
|
add_static_route("apicss", "apicss", "/api.css", "/etc/static-ngeo/api.css")
|
457
572
|
add_static_route("apihelp", "apihelp", "/apihelp/index.html", "/etc/geomapfish/static/apihelp/index.html")
|
@@ -491,6 +606,13 @@ def includeme(config: pyramid.config.Configurator):
|
|
491
606
|
add_cors_route(config, "/profile.json", "profile")
|
492
607
|
config.add_route("profile.json", "/profile.json", request_method="POST")
|
493
608
|
|
609
|
+
# Access to vector tiles
|
610
|
+
add_cors_route(config, "/vector_tiles", "vector_tiles")
|
611
|
+
config.add_route("vector_tiles", "/vector_tiles/{layer_name}/{z}/{x}/{y}.pbf", request_method="GET")
|
612
|
+
# There is no view corresponding to that route, it is to be used from
|
613
|
+
# mako templates to get the root of the "vector_tiles" web service
|
614
|
+
config.add_route("vector_tiles_root", "/vector_tiles", request_method="HEAD")
|
615
|
+
|
494
616
|
# Shortener
|
495
617
|
add_cors_route(config, "/short/create", "shortener")
|
496
618
|
config.add_route("shortener_create", "/short/create", request_method="POST")
|
@@ -571,6 +693,21 @@ def includeme(config: pyramid.config.Configurator):
|
|
571
693
|
cache_max_age=int(config.get_settings()["default_max_age"]),
|
572
694
|
)
|
573
695
|
|
696
|
+
# Add the c2cgeoportal static view with cache buster
|
697
|
+
config.add_static_view(
|
698
|
+
name="static-geomapfish",
|
699
|
+
path="c2cgeoportal_geoportal:static",
|
700
|
+
cache_max_age=int(config.get_settings()["default_max_age"]),
|
701
|
+
)
|
702
|
+
config.add_cache_buster("c2cgeoportal_geoportal:static", version_cache_buster)
|
703
|
+
|
704
|
+
# Add the project static view without cache buster
|
705
|
+
config.add_static_view(
|
706
|
+
name="static-ngeo-dist",
|
707
|
+
path="/opt/c2cgeoportal/geoportal/node_modules/ngeo/dist",
|
708
|
+
cache_max_age=int(config.get_settings()["default_max_age"]),
|
709
|
+
)
|
710
|
+
|
574
711
|
# Handles the other HTTP errors raised by the views. Without that,
|
575
712
|
# the client receives a status=200 without content.
|
576
713
|
config.add_view(error_handler, context=HTTPException)
|
@@ -603,7 +740,10 @@ def includeme(config: pyramid.config.Configurator):
|
|
603
740
|
c2cwsgiutils.index.additional_noauth.append("</div></div><hr>")
|
604
741
|
|
605
742
|
|
606
|
-
def
|
743
|
+
def init_db_sessions(
|
744
|
+
settings: Dict[str, Any], config: Configurator, health_check: Optional[HealthCheck] = None
|
745
|
+
) -> None:
|
746
|
+
"""Initialize the database sessions."""
|
607
747
|
db_chooser = settings.get("db_chooser", {})
|
608
748
|
master_paths = [i.replace("//", "/") for i in db_chooser.get("master", [])]
|
609
749
|
slave_paths = [i.replace("//", "/") for i in db_chooser.get("slave", [])]
|
@@ -644,7 +784,7 @@ def init_dbsessions(settings: dict, config: Configurator, health_check: HealthCh
|
|
644
784
|
version_schema=settings["schema_static"],
|
645
785
|
level=1,
|
646
786
|
)
|
647
|
-
else:
|
787
|
+
else:
|
648
788
|
|
649
789
|
def check(session_: Session) -> None:
|
650
790
|
session_.execute("SELECT 1")
|