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.
- c2cgeoportal_geoportal/__init__.py +245 -95
- c2cgeoportal_geoportal/lib/__init__.py +67 -43
- c2cgeoportal_geoportal/lib/authentication.py +50 -26
- c2cgeoportal_geoportal/lib/bashcolor.py +17 -13
- c2cgeoportal_geoportal/lib/cacheversion.py +16 -8
- c2cgeoportal_geoportal/lib/caching.py +65 -193
- c2cgeoportal_geoportal/lib/check_collector.py +17 -10
- c2cgeoportal_geoportal/lib/checker.py +67 -65
- c2cgeoportal_geoportal/lib/common_headers.py +167 -0
- c2cgeoportal_geoportal/lib/dbreflection.py +61 -46
- c2cgeoportal_geoportal/lib/filter_capabilities.py +126 -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 +363 -240
- c2cgeoportal_geoportal/lib/loader.py +11 -16
- c2cgeoportal_geoportal/lib/metrics.py +28 -17
- c2cgeoportal_geoportal/lib/oauth2.py +392 -206
- c2cgeoportal_geoportal/lib/wmstparsing.py +105 -84
- 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} +22 -15
- 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 +100 -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/{create/geoportal/setup.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/setup.py} +6 -7
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/tsconfig.json +8 -0
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/webpack.api.js +77 -0
- c2cgeoportal_geoportal/scaffolds/{create/geoportal/webpack.apps.js_tmpl → advance_create/{{cookiecutter.project}}/geoportal/webpack.apps.js} +29 -28
- c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/webpack.commons.js +4 -7
- c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/webpack.config.js +1 -1
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py +42 -0
- 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 -27
- 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 +57 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/rebuild.yaml +46 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/.github/workflows/update_l10n.yaml +66 -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/{{cookiecutter.project}}/Dockerfile +76 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/Makefile +70 -0
- c2cgeoportal_geoportal/scaffolds/create/{README.rst_tmpl → {{cookiecutter.project}}/README.rst} +4 -4
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/build +186 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/config.yaml +22 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/docker-compose-check +25 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/requirements.txt +1 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-db.yaml +26 -0
- c2cgeoportal_geoportal/scaffolds/create/{docker-compose-lib.yaml → {{cookiecutter.project}}/docker-compose-lib.yaml} +165 -22
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-qgis.yaml +23 -0
- 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} +20 -15
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.default +101 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.project +69 -0
- c2cgeoportal_geoportal/scaffolds/create/{geoportal/vars.yaml_tmpl → {{cookiecutter.project}}/geoportal/vars.yaml} +126 -36
- 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 +3 -3
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/demo.map.tmpl +224 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/mapserver/mapserver.conf +15 -0
- c2cgeoportal_geoportal/scaffolds/create/{mapserver/mapserver.map.tmpl_tmpl → {{cookiecutter.project}}/mapserver/mapserver.map.tmpl} +9 -18
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Landscape.jrxml +13 -8
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Portrait.jrxml +13 -8
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Landscape.jrxml +13 -8
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Portrait.jrxml +13 -8
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/config.yaml.tmpl +11 -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/{pyproject.toml → {{cookiecutter.project}}/pyproject.toml} +4 -0
- c2cgeoportal_geoportal/scaffolds/create/{qgisserver/pg_service.conf.tmpl_tmpl → {{cookiecutter.project}}/qgisserver/pg_service.conf.tmpl} +2 -2
- c2cgeoportal_geoportal/scaffolds/create/{run_alembic.sh → {{cookiecutter.project}}/run_alembic.sh} +3 -5
- 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 +5 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tests/__init__.py +0 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/tests/test_app.py +38 -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/{{cookiecutter.project}}/.upgrade.yaml +61 -0
- c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_CHANGELOG.txt +273 -0
- c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_create_template/tests/test_testapp.py +48 -0
- c2cgeoportal_geoportal/scaffolds/update/{geoportal → {{cookiecutter.project}}/geoportal}/CONST_config-schema.yaml +64 -17
- c2cgeoportal_geoportal/scaffolds/update/{geoportal/CONST_vars.yaml_tmpl → {{cookiecutter.project}}/geoportal/CONST_vars.yaml} +396 -19
- c2cgeoportal_geoportal/scripts/__init__.py +16 -30
- c2cgeoportal_geoportal/scripts/c2cupgrade.py +272 -234
- c2cgeoportal_geoportal/scripts/create_demo_theme.py +3 -6
- c2cgeoportal_geoportal/scripts/manage_users.py +34 -39
- c2cgeoportal_geoportal/scripts/pcreate.py +310 -0
- c2cgeoportal_geoportal/scripts/theme2fts.py +128 -24
- 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 -6
- c2cgeoportal_geoportal/views/dev.py +9 -7
- c2cgeoportal_geoportal/views/dynamic.py +56 -19
- c2cgeoportal_geoportal/views/entry.py +85 -24
- c2cgeoportal_geoportal/views/fulltextsearch.py +29 -23
- c2cgeoportal_geoportal/views/geometry_processing.py +17 -9
- c2cgeoportal_geoportal/views/i18n.py +91 -9
- c2cgeoportal_geoportal/views/layers.py +166 -133
- c2cgeoportal_geoportal/views/login.py +161 -93
- c2cgeoportal_geoportal/views/mapserverproxy.py +47 -31
- c2cgeoportal_geoportal/views/memory.py +12 -12
- c2cgeoportal_geoportal/views/ogcproxy.py +52 -30
- c2cgeoportal_geoportal/views/pdfreport.py +30 -26
- c2cgeoportal_geoportal/views/printproxy.py +60 -52
- c2cgeoportal_geoportal/views/profile.py +24 -23
- c2cgeoportal_geoportal/views/proxy.py +88 -72
- c2cgeoportal_geoportal/views/raster.py +37 -26
- c2cgeoportal_geoportal/views/resourceproxy.py +13 -11
- c2cgeoportal_geoportal/views/shortener.py +27 -25
- c2cgeoportal_geoportal/views/theme.py +472 -332
- c2cgeoportal_geoportal/views/tinyowsproxy.py +42 -44
- c2cgeoportal_geoportal/views/vector_tiles.py +80 -0
- {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.8.1.180.dist-info}/METADATA +19 -8
- c2cgeoportal_geoportal-2.8.1.180.dist-info/RECORD +191 -0
- {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.8.1.180.dist-info}/WHEEL +1 -1
- {c2cgeoportal_geoportal-2.6.0.dist-info → c2cgeoportal_geoportal-2.8.1.180.dist-info}/entry_points.txt +3 -0
- tests/__init__.py +10 -5
- tests/test_cachebuster.py +3 -5
- tests/test_caching.py +18 -26
- tests/test_checker.py +1 -3
- tests/test_decimaljson.py +5 -5
- tests/test_headerstween.py +1 -3
- tests/test_i18n.py +2 -2
- tests/test_init.py +16 -20
- tests/test_locale_negociator.py +4 -6
- tests/test_mapserverproxy_route_predicate.py +1 -4
- tests/test_raster.py +15 -17
- tests/test_wmstparsing.py +10 -12
- tests/xmlstr.py +1 -3
- 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/Dockerfile_tmpl +0 -67
- c2cgeoportal_geoportal/scaffolds/create/Makefile +0 -3
- c2cgeoportal_geoportal/scaffolds/create/build_tmpl +0 -167
- c2cgeoportal_geoportal/scaffolds/create/ci/config.yaml_tmpl +0 -23
- 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/env.default_tmpl +0 -67
- c2cgeoportal_geoportal/scaffolds/create/env.project_tmpl +0 -48
- 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/__init__.py_tmpl +0 -58
- 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/tools/extract-messages.js +0 -39
- 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/+dot+upgrade.yaml_tmpl +0 -181
- 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 → advance_create/{{cookiecutter.project}}}/geoportal/requirements.txt +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-2.6.0.dist-info → c2cgeoportal_geoportal-2.8.1.180.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,4 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
# Copyright (c) 2012-2020, Camptocamp SA
|
1
|
+
# Copyright (c) 2012-2023, Camptocamp SA
|
4
2
|
# All rights reserved.
|
5
3
|
|
6
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -30,89 +28,94 @@
|
|
30
28
|
|
31
29
|
import inspect
|
32
30
|
import logging
|
33
|
-
from typing import Any, Dict, List
|
31
|
+
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional
|
34
32
|
|
35
|
-
|
33
|
+
import pyramid.interfaces
|
34
|
+
import sqlalchemy.ext.declarative
|
35
|
+
import zope.interface
|
36
|
+
from dogpile.cache.api import NO_VALUE, CacheBackend
|
37
|
+
from dogpile.cache.backends.memory import MemoryBackend
|
36
38
|
from dogpile.cache.backends.redis import RedisBackend, RedisSentinelBackend
|
37
|
-
from dogpile.cache.region import make_region
|
39
|
+
from dogpile.cache.region import CacheRegion, make_region
|
38
40
|
from dogpile.cache.util import sha1_mangle_key
|
39
|
-
from pyramid.request import Request
|
40
41
|
from sqlalchemy.orm.util import identity_key
|
41
42
|
|
42
43
|
from c2cgeoportal_commons.models import Base
|
43
44
|
|
45
|
+
if TYPE_CHECKING:
|
46
|
+
from dogpile.cache.api import SerializedReturnType
|
47
|
+
else:
|
48
|
+
SerializedReturnType = Any
|
49
|
+
|
44
50
|
LOG = logging.getLogger(__name__)
|
45
51
|
_REGION: Dict[str, Any] = {}
|
46
52
|
MEMORY_CACHE_DICT: Dict[str, Any] = {}
|
47
53
|
|
48
54
|
|
49
|
-
def map_dbobject(
|
50
|
-
|
55
|
+
def map_dbobject(
|
56
|
+
item: sqlalchemy.ext.declarative.ConcreteBase,
|
57
|
+
) -> sqlalchemy.ext.declarative.ConcreteBase:
|
58
|
+
"""Get an cache identity key for the cache."""
|
51
59
|
return identity_key(item) if isinstance(item, Base) else item
|
52
60
|
|
53
61
|
|
54
|
-
def keygen_function(namespace, function):
|
62
|
+
def keygen_function(namespace: Any, function: Callable[..., Any]) -> Callable[..., str]:
|
55
63
|
"""
|
56
|
-
Return a function that generates a string
|
57
|
-
|
58
|
-
arguments to the returned function itself.
|
64
|
+
Return a function that generates a string key.
|
65
|
+
|
66
|
+
Based on a given function as well as arguments to the returned function itself.
|
59
67
|
|
60
|
-
This is used by :meth:`.CacheRegion.cache_on_arguments`
|
61
|
-
to generate a cache key from a decorated function.
|
68
|
+
This is used by :meth:`.CacheRegion.cache_on_arguments` to generate a cache key from a decorated function.
|
62
69
|
"""
|
63
70
|
|
64
71
|
if namespace is None:
|
65
72
|
namespace = (function.__module__, function.__name__)
|
66
|
-
else:
|
73
|
+
else:
|
67
74
|
namespace = (function.__module__, function.__name__, namespace)
|
68
75
|
|
69
76
|
args = inspect.getfullargspec(function)
|
70
77
|
ignore_first_argument = args[0] and args[0][0] in ("self", "cls")
|
71
78
|
|
72
|
-
def generate_key(*args, **kw):
|
73
|
-
if kw:
|
79
|
+
def generate_key(*args: Any, **kw: Any) -> str:
|
80
|
+
if kw:
|
74
81
|
raise ValueError("key creation function does not accept keyword arguments.")
|
75
82
|
parts: List[str] = []
|
76
83
|
parts.extend(namespace)
|
77
84
|
if ignore_first_argument:
|
78
85
|
args = args[1:]
|
79
|
-
new_args: List[str] = [
|
86
|
+
new_args: List[str] = [
|
87
|
+
arg for arg in args if pyramid.interfaces.IRequest not in zope.interface.implementedBy(type(arg))
|
88
|
+
]
|
80
89
|
parts.extend(map(str, map(map_dbobject, new_args)))
|
81
90
|
return "|".join(parts)
|
82
91
|
|
83
92
|
return generate_key
|
84
93
|
|
85
94
|
|
86
|
-
def init_region(conf, region):
|
87
|
-
"""
|
88
|
-
Initialize the caching module.
|
89
|
-
"""
|
95
|
+
def init_region(conf: Dict[str, Any], region: str) -> CacheRegion:
|
96
|
+
"""Initialize the caching module."""
|
90
97
|
cache_region = get_region(region)
|
91
98
|
_configure_region(conf, cache_region)
|
92
99
|
return cache_region
|
93
100
|
|
94
101
|
|
95
|
-
def _configure_region(conf, cache_region):
|
96
|
-
|
97
|
-
kwargs = {"replace_existing_backend": True}
|
102
|
+
def _configure_region(conf: Dict[str, Any], cache_region: CacheRegion) -> None:
|
103
|
+
kwargs: Dict[str, Any] = {"replace_existing_backend": True}
|
98
104
|
backend = conf["backend"]
|
99
105
|
kwargs.update({k: conf[k] for k in conf if k != "backend"})
|
100
|
-
kwargs.setdefault("arguments", {})
|
101
|
-
kwargs["arguments"]["cache_dict"] = MEMORY_CACHE_DICT # type: ignore
|
106
|
+
kwargs.setdefault("arguments", {}).setdefault("cache_dict", MEMORY_CACHE_DICT)
|
102
107
|
cache_region.configure(backend, **kwargs)
|
103
108
|
|
104
109
|
|
105
|
-
def get_region(region):
|
106
|
-
"""
|
107
|
-
Return a cache region.
|
108
|
-
"""
|
109
|
-
global _REGION
|
110
|
+
def get_region(region: str) -> CacheRegion:
|
111
|
+
"""Return a cache region."""
|
110
112
|
if region not in _REGION:
|
111
113
|
_REGION[region] = make_region(function_key_generator=keygen_function)
|
112
114
|
return _REGION[region]
|
113
115
|
|
114
116
|
|
115
|
-
def invalidate_region(region=None):
|
117
|
+
def invalidate_region(region: Optional[str] = None) -> None:
|
118
|
+
"""Invalidate a cache region."""
|
116
119
|
if region is None:
|
117
120
|
for cache_region in _REGION.values():
|
118
121
|
cache_region.invalidate()
|
@@ -120,180 +123,49 @@ def invalidate_region(region=None):
|
|
120
123
|
get_region(region).invalidate()
|
121
124
|
|
122
125
|
|
123
|
-
class HybridRedisBackend(
|
124
|
-
"""
|
125
|
-
A memory and redis backend
|
126
|
-
"""
|
126
|
+
class HybridRedisBackend(CacheBackend): # type: ignore
|
127
|
+
"""A Dogpile cache backend with a memory cache backend in front of a Redis backend for performance."""
|
127
128
|
|
128
|
-
def __init__(self, arguments):
|
129
|
-
self._cache = arguments.pop("cache_dict", {})
|
129
|
+
def __init__(self, arguments: Dict[str, Any]):
|
130
130
|
self._use_memory_cache = not arguments.pop("disable_memory_cache", False)
|
131
|
+
self._memory = MemoryBackend({"cache_dict": arguments.pop("cache_dict", {})})
|
132
|
+
self._redis = RedisBackend(arguments)
|
131
133
|
|
132
|
-
|
133
|
-
|
134
|
-
def get(self, key):
|
135
|
-
value = self._cache.get(key, NO_VALUE)
|
134
|
+
def get(self, key: str) -> SerializedReturnType:
|
135
|
+
value = self._memory.get(key)
|
136
136
|
if value == NO_VALUE:
|
137
|
-
|
138
|
-
|
139
|
-
|
137
|
+
val = self._redis.get_serialized(sha1_mangle_key(key.encode()))
|
138
|
+
if val in (None, NO_VALUE):
|
139
|
+
return NO_VALUE
|
140
|
+
value = self._redis.deserializer(val)
|
141
|
+
if value != NO_VALUE and self._use_memory_cache:
|
142
|
+
self._memory.set(key, value)
|
140
143
|
return value
|
141
144
|
|
142
|
-
def get_multi(self, keys):
|
145
|
+
def get_multi(self, keys: List[str]) -> List[SerializedReturnType]:
|
143
146
|
return [self.get(key) for key in keys]
|
144
147
|
|
145
|
-
def set(self, key, value):
|
148
|
+
def set(self, key: str, value: SerializedReturnType) -> None:
|
146
149
|
if self._use_memory_cache:
|
147
|
-
self.
|
148
|
-
|
150
|
+
self._memory.set(key, value)
|
151
|
+
self._redis.set_serialized(sha1_mangle_key(key.encode()), self._redis.serializer(value))
|
149
152
|
|
150
|
-
def set_multi(self, mapping):
|
153
|
+
def set_multi(self, mapping: Dict[str, SerializedReturnType]) -> None:
|
151
154
|
for key, value in mapping.items():
|
152
155
|
self.set(key, value)
|
153
156
|
|
154
|
-
def delete(self, key):
|
155
|
-
self.
|
156
|
-
|
157
|
+
def delete(self, key: str) -> None:
|
158
|
+
self._memory.delete(key)
|
159
|
+
self._redis.delete(key)
|
157
160
|
|
161
|
+
def delete_multi(self, keys: List[str]) -> None:
|
162
|
+
self._memory.delete_multi(keys)
|
163
|
+
self._redis.delete_multi(keys)
|
158
164
|
|
159
|
-
class HybridRedisSentinelBackend(RedisSentinelBackend):
|
160
|
-
"""
|
161
|
-
A memory and redis sentinel backend
|
162
|
-
"""
|
163
165
|
|
164
|
-
|
165
|
-
|
166
|
-
self._use_memory_cache = not arguments.pop("disable_memory_cache", False)
|
166
|
+
class HybridRedisSentinelBackend(HybridRedisBackend):
|
167
|
+
"""Same as HybridRedisBackend but using the Redis Sentinel."""
|
167
168
|
|
169
|
+
def __init__(self, arguments: Dict[str, Any]):
|
168
170
|
super().__init__(arguments)
|
169
|
-
|
170
|
-
def get(self, key):
|
171
|
-
value = self._cache.get(key, NO_VALUE)
|
172
|
-
if value == NO_VALUE:
|
173
|
-
value = super().get(sha1_mangle_key(key.encode()))
|
174
|
-
if value != NO_VALUE and self._use_memory_cache:
|
175
|
-
self._cache[key] = value
|
176
|
-
return value
|
177
|
-
|
178
|
-
def get_multi(self, keys):
|
179
|
-
return [self.get(key) for key in keys]
|
180
|
-
|
181
|
-
def set(self, key, value):
|
182
|
-
if self._use_memory_cache:
|
183
|
-
self._cache[key] = value
|
184
|
-
super().set(sha1_mangle_key(key.encode()), value)
|
185
|
-
|
186
|
-
def set_multi(self, mapping):
|
187
|
-
for key, value in mapping.items():
|
188
|
-
self.set(key, value)
|
189
|
-
|
190
|
-
def delete(self, key):
|
191
|
-
self._cache.pop(key, None)
|
192
|
-
super().delete(key)
|
193
|
-
|
194
|
-
|
195
|
-
NO_CACHE = 0
|
196
|
-
PUBLIC_CACHE = 1
|
197
|
-
PRIVATE_CACHE = 2
|
198
|
-
|
199
|
-
CORS_METHODS = "HEAD, GET, POST, PUT, DELETE"
|
200
|
-
|
201
|
-
|
202
|
-
def _set_cors_headers(request, response, service_name, service_headers_settings, credentials):
|
203
|
-
"""
|
204
|
-
Handle CORS requests, as specified in https://www.w3.org/TR/cors/
|
205
|
-
"""
|
206
|
-
response.vary = (response.vary or ()) + ("Origin",)
|
207
|
-
|
208
|
-
if "Origin" not in request.headers:
|
209
|
-
return # Not a CORS request if this header is missing
|
210
|
-
origin = request.headers["Origin"]
|
211
|
-
|
212
|
-
if request.method == "OPTIONS" and "Access-Control-Request-Method" not in request.headers:
|
213
|
-
LOG.warning("CORS preflight query missing the Access-Control-Request-Method header")
|
214
|
-
return
|
215
|
-
|
216
|
-
allowed_origins = service_headers_settings.get("access_control_allow_origin", [])
|
217
|
-
if origin not in allowed_origins:
|
218
|
-
if "*" in allowed_origins:
|
219
|
-
origin = "*"
|
220
|
-
credentials = False # Force no credentials
|
221
|
-
else:
|
222
|
-
LOG.warning("CORS query not allowed for origin=%s, service=%s", origin, service_name)
|
223
|
-
return
|
224
|
-
|
225
|
-
response.headers.update(
|
226
|
-
{"Access-Control-Allow-Origin": origin, "Access-Control-Allow-Methods": CORS_METHODS}
|
227
|
-
)
|
228
|
-
|
229
|
-
max_age = service_headers_settings.get("access_control_max_age", 3600)
|
230
|
-
response.headers["Access-Control-Max-Age"] = str(max_age)
|
231
|
-
|
232
|
-
if credentials:
|
233
|
-
response.headers["Access-Control-Allow-Credentials"] = "true"
|
234
|
-
|
235
|
-
if request.method != "OPTIONS":
|
236
|
-
return
|
237
|
-
|
238
|
-
response.cache_control.max_age = max_age
|
239
|
-
|
240
|
-
if not service_headers_settings or "access_control_allow_origin" not in service_headers_settings:
|
241
|
-
LOG.warning("CORS query not configured for service=%s", service_name)
|
242
|
-
return
|
243
|
-
|
244
|
-
requested_headers = request.headers.get("Access-Control-Request-Headers", False)
|
245
|
-
if requested_headers:
|
246
|
-
# For the moment, we allow all requested headers
|
247
|
-
response.headers["Access-Control-Allow-Headers"] = requested_headers
|
248
|
-
|
249
|
-
# If we start using headers in responses, we'll have to add
|
250
|
-
# Access-Control-Expose-Headers
|
251
|
-
|
252
|
-
|
253
|
-
def _set_common_headers(request, response, service_headers_settings, cache, content_type):
|
254
|
-
"""
|
255
|
-
Set the common headers
|
256
|
-
"""
|
257
|
-
|
258
|
-
response.headers.update(service_headers_settings.get("headers", {}))
|
259
|
-
|
260
|
-
if cache == NO_CACHE:
|
261
|
-
response.cache_control.no_cache = True
|
262
|
-
response.cache_control.max_age = 0
|
263
|
-
elif cache == PUBLIC_CACHE:
|
264
|
-
response.cache_control.public = True
|
265
|
-
elif cache == PRIVATE_CACHE:
|
266
|
-
if request.user is not None:
|
267
|
-
response.cache_control.private = True
|
268
|
-
else:
|
269
|
-
response.cache_control.public = True
|
270
|
-
else: # pragma: no cover
|
271
|
-
raise Exception("Invalid cache type")
|
272
|
-
|
273
|
-
if cache != NO_CACHE:
|
274
|
-
max_age = service_headers_settings.get("cache_control_max_age", 3600)
|
275
|
-
|
276
|
-
response.cache_control.max_age = max_age
|
277
|
-
if max_age == 0:
|
278
|
-
response.cache_control.no_cache = True
|
279
|
-
|
280
|
-
if content_type is not None:
|
281
|
-
response.content_type = content_type
|
282
|
-
|
283
|
-
return response
|
284
|
-
|
285
|
-
|
286
|
-
def set_common_headers(request, service_name, cache, response=None, credentials=True, content_type=None):
|
287
|
-
"""
|
288
|
-
Set the common headers
|
289
|
-
"""
|
290
|
-
if response is None:
|
291
|
-
response = request.response
|
292
|
-
|
293
|
-
headers_settings = request.registry.settings.get("headers", {})
|
294
|
-
service_headers_settings = headers_settings.get(service_name, {})
|
295
|
-
|
296
|
-
_set_cors_headers(request, response, service_name, service_headers_settings, credentials)
|
297
|
-
if request.method == "OPTIONS":
|
298
|
-
return response
|
299
|
-
return _set_common_headers(request, response, service_headers_settings, cache, content_type)
|
171
|
+
self._redis = RedisSentinelBackend(arguments)
|
@@ -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
|
@@ -27,8 +25,11 @@
|
|
27
25
|
# of the authors and should not be interpreted as representing official policies,
|
28
26
|
# either expressed or implied, of the FreeBSD Project.
|
29
27
|
import logging
|
30
|
-
from typing import Any
|
28
|
+
from typing import Any, Dict, Optional, cast
|
31
29
|
|
30
|
+
import c2cwsgiutils.health_check
|
31
|
+
import pyramid.config
|
32
|
+
import pyramid.request
|
32
33
|
import requests
|
33
34
|
|
34
35
|
from c2cgeoportal_geoportal.lib.checker import build_url
|
@@ -36,7 +37,12 @@ from c2cgeoportal_geoportal.lib.checker import build_url
|
|
36
37
|
LOG = logging.getLogger(__name__)
|
37
38
|
|
38
39
|
|
39
|
-
def init(config, health_check):
|
40
|
+
def init(config: pyramid.config.Configurator, health_check: c2cwsgiutils.health_check.HealthCheck) -> None:
|
41
|
+
"""
|
42
|
+
Initialize the check collector.
|
43
|
+
|
44
|
+
Add him in the c2cwsgichecks.
|
45
|
+
"""
|
40
46
|
global_settings = config.get_settings()
|
41
47
|
if "check_collector" not in global_settings:
|
42
48
|
return
|
@@ -48,25 +54,26 @@ def init(config, health_check):
|
|
48
54
|
for host in settings["hosts"]:
|
49
55
|
|
50
56
|
class Check:
|
51
|
-
def __init__(self, host):
|
57
|
+
def __init__(self, host: Dict[str, Any]):
|
52
58
|
self.host = host
|
53
59
|
|
54
|
-
def __call__(self, request) -> Any:
|
60
|
+
def __call__(self, request: pyramid.request.Request) -> Optional[Dict[str, Any]]:
|
55
61
|
params = request.params
|
56
62
|
display = self.host["display"]
|
57
63
|
if "host" not in params or display == params["host"]:
|
58
64
|
url_headers = build_url(
|
59
65
|
"check_collector",
|
60
|
-
"
|
66
|
+
f"{self.host['url'].rstrip('/')}/{c2c_base.strip('/')}/health_check",
|
61
67
|
request,
|
62
68
|
)
|
63
69
|
r = requests.get(
|
64
70
|
params={"max_level": str(self.host.get("max_level", max_level))},
|
65
71
|
timeout=120,
|
66
|
-
**url_headers,
|
72
|
+
**url_headers, # type: ignore
|
67
73
|
)
|
68
74
|
r.raise_for_status()
|
69
|
-
return r.json()
|
75
|
+
return cast(Dict[str, Any], r.json())
|
76
|
+
return None
|
70
77
|
|
71
78
|
health_check.add_custom_check(
|
72
79
|
name="check_collector_" + host["display"], check_cb=Check(host), level=settings["level"]
|