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) 2013-2020, Camptocamp SA
|
1
|
+
# Copyright (c) 2013-2023, Camptocamp SA
|
4
2
|
# All rights reserved.
|
5
3
|
|
6
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -29,12 +27,15 @@
|
|
29
27
|
|
30
28
|
|
31
29
|
import datetime
|
32
|
-
from typing import Optional,
|
30
|
+
from typing import Any, Dict, List, Optional, Set, Tuple, Union
|
33
31
|
|
34
32
|
import isodate
|
35
33
|
|
34
|
+
TimeExtent = Union["TimeExtentValue", "TimeExtentInterval"]
|
35
|
+
|
36
36
|
|
37
|
-
def min_none(a, b):
|
37
|
+
def min_none(a: Optional[datetime.datetime], b: Optional[datetime.datetime]) -> Optional[datetime.datetime]:
|
38
|
+
"""Return the min value, support non in input."""
|
38
39
|
if a is None:
|
39
40
|
return b
|
40
41
|
if b is None:
|
@@ -42,7 +43,8 @@ def min_none(a, b):
|
|
42
43
|
return min(a, b)
|
43
44
|
|
44
45
|
|
45
|
-
def max_none(a, b):
|
46
|
+
def max_none(a: Optional[datetime.datetime], b: Optional[datetime.datetime]) -> Optional[datetime.datetime]:
|
47
|
+
"""Return the max value, support non in input."""
|
46
48
|
if a is None:
|
47
49
|
return b
|
48
50
|
if b is None:
|
@@ -52,21 +54,22 @@ def max_none(a, b):
|
|
52
54
|
|
53
55
|
class TimeInformation:
|
54
56
|
"""
|
57
|
+
Collect the WMS time information.
|
58
|
+
|
55
59
|
Arguments:
|
56
60
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
* ``widget`` The layer mode ("slider" (default) or "datepicker")
|
61
|
+
extent: A time extent instance (``TimeExtentValue`` or ``TimeExtentInterval``)
|
62
|
+
mode: The layer mode ("single", "range" or "disabled")
|
63
|
+
widget: The layer mode ("slider" (default) or "datepicker")
|
61
64
|
"""
|
62
65
|
|
63
|
-
def __init__(self):
|
64
|
-
self.extent: Optional[
|
65
|
-
self.mode = None
|
66
|
-
self.widget = None
|
67
|
-
self.layer = None
|
66
|
+
def __init__(self) -> None:
|
67
|
+
self.extent: Optional[TimeExtent] = None
|
68
|
+
self.mode: Optional[str] = None
|
69
|
+
self.widget: Optional[str] = None
|
70
|
+
self.layer: Optional[Dict[str, Any]] = None
|
68
71
|
|
69
|
-
def merge(self, layer, extent, mode, widget):
|
72
|
+
def merge(self, layer: Dict[str, Any], extent: TimeExtent, mode: str, widget: str) -> None:
|
70
73
|
layer_apply = self.layer == layer or (not self.has_time() and extent is not None)
|
71
74
|
|
72
75
|
self.merge_extent(extent)
|
@@ -80,35 +83,37 @@ class TimeInformation:
|
|
80
83
|
del self.layer["time"]
|
81
84
|
self.layer = None
|
82
85
|
|
83
|
-
def merge_extent(self, extent):
|
86
|
+
def merge_extent(self, extent: TimeExtent) -> None:
|
84
87
|
if self.extent is not None:
|
85
88
|
self.extent.merge(extent)
|
86
89
|
else:
|
87
90
|
self.extent = extent
|
88
91
|
|
89
|
-
def merge_mode(self, mode):
|
92
|
+
def merge_mode(self, mode: str) -> None:
|
90
93
|
if mode != "disabled":
|
91
94
|
if self.mode is not None:
|
92
95
|
if self.mode != mode:
|
93
|
-
raise ValueError("Could not mix time mode '{
|
96
|
+
raise ValueError(f"Could not mix time mode '{mode!s}' and '{self.mode!s}'")
|
94
97
|
else:
|
95
98
|
self.mode = mode
|
96
99
|
|
97
|
-
def merge_widget(self, widget):
|
100
|
+
def merge_widget(self, widget: Optional[str]) -> None:
|
98
101
|
widget = "slider" if not widget else widget
|
102
|
+
assert widget is not None
|
99
103
|
|
100
104
|
if self.widget is not None:
|
101
105
|
if self.widget != widget:
|
102
|
-
raise ValueError("Could not mix time widget '{
|
106
|
+
raise ValueError(f"Could not mix time widget '{widget!s}' and '{self.widget!s}'")
|
103
107
|
else:
|
104
108
|
self.widget = widget
|
105
109
|
|
106
|
-
def has_time(self):
|
110
|
+
def has_time(self) -> bool:
|
107
111
|
return self.extent is not None
|
108
112
|
|
109
|
-
def to_dict(self):
|
113
|
+
def to_dict(self) -> Optional[Dict[str, Any]]:
|
110
114
|
if self.has_time():
|
111
|
-
|
115
|
+
assert self.extent is not None
|
116
|
+
time = self.extent.to_dict()
|
112
117
|
time["mode"] = self.mode
|
113
118
|
time["widget"] = self.widget
|
114
119
|
return time
|
@@ -116,34 +121,38 @@ class TimeInformation:
|
|
116
121
|
|
117
122
|
|
118
123
|
class TimeExtentValue:
|
119
|
-
"""
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
+
"""Represents time as a list of values."""
|
125
|
+
|
126
|
+
def __init__(
|
127
|
+
self,
|
128
|
+
values: Set[datetime.datetime],
|
129
|
+
resolution: str,
|
130
|
+
min_def_value: Optional[datetime.datetime],
|
131
|
+
max_def_value: Optional[datetime.datetime],
|
132
|
+
):
|
124
133
|
"""
|
134
|
+
Initialize.
|
135
|
+
|
125
136
|
Arguments:
|
126
137
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
138
|
+
values: A set() of datetime
|
139
|
+
resolution: The resolution from the mapfile time definition
|
140
|
+
min_def_value: the minimum default value as a datetime
|
141
|
+
max_def_value: the maximum default value as a datetime
|
131
142
|
"""
|
132
143
|
self.values = values
|
133
144
|
self.resolution = resolution
|
134
145
|
self.min_def_value = min_def_value
|
135
146
|
self.max_def_value = max_def_value
|
136
147
|
|
137
|
-
def merge(self, extent):
|
148
|
+
def merge(self, extent: TimeExtent) -> None:
|
138
149
|
if not isinstance(extent, TimeExtentValue):
|
139
|
-
raise ValueError(
|
140
|
-
"Could not mix time defined as a list of " "values with other type of definition"
|
141
|
-
)
|
150
|
+
raise ValueError("Could not mix time defined as a list of values with other type of definition")
|
142
151
|
self.values.update(extent.values)
|
143
152
|
self.min_def_value = min_none(self.min_def_value, extent.min_def_value)
|
144
153
|
self.max_def_value = max_none(self.max_def_value, extent.max_def_value)
|
145
154
|
|
146
|
-
def to_dict(self):
|
155
|
+
def to_dict(self) -> Dict[str, Any]:
|
147
156
|
values = sorted(self.values)
|
148
157
|
min_def_value = _format_date(self.min_def_value) if self.min_def_value else None
|
149
158
|
max_def_value = _format_date(self.max_def_value) if self.max_def_value else None
|
@@ -159,20 +168,28 @@ class TimeExtentValue:
|
|
159
168
|
|
160
169
|
|
161
170
|
class TimeExtentInterval:
|
162
|
-
"""
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
171
|
+
"""Represents time with the help of a start, an end and an interval."""
|
172
|
+
|
173
|
+
def __init__(
|
174
|
+
self,
|
175
|
+
start: datetime.datetime,
|
176
|
+
end: datetime.datetime,
|
177
|
+
interval: Tuple[int, int, int, int],
|
178
|
+
resolution: str,
|
179
|
+
min_def_value: Optional[datetime.datetime],
|
180
|
+
max_def_value: Optional[datetime.datetime],
|
181
|
+
):
|
167
182
|
"""
|
183
|
+
Initialize.
|
184
|
+
|
168
185
|
Arguments:
|
169
186
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
187
|
+
start: The start value as a datetime
|
188
|
+
end: The end value as a datetime
|
189
|
+
interval: The interval as a tuple (years, months, days, seconds)
|
190
|
+
resolution: The resolution from the mapfile time definition
|
191
|
+
min_def_value: the minimum default value as a datetime
|
192
|
+
max_def_value: the maximum default value as a datetime
|
176
193
|
"""
|
177
194
|
self.start = start
|
178
195
|
self.end = end
|
@@ -181,15 +198,17 @@ class TimeExtentInterval:
|
|
181
198
|
self.min_def_value = min_def_value
|
182
199
|
self.max_def_value = max_def_value
|
183
200
|
|
184
|
-
def merge(self, extent):
|
201
|
+
def merge(self, extent: TimeExtent) -> None:
|
185
202
|
if not isinstance(extent, TimeExtentInterval):
|
186
|
-
raise ValueError(
|
187
|
-
"Could not merge time defined as with an " " interval with other type of definition"
|
188
|
-
)
|
203
|
+
raise ValueError("Could not merge time defined as with an interval with other type of definition")
|
189
204
|
if self.interval != extent.interval:
|
190
|
-
raise ValueError("Could not merge times defined with a
|
191
|
-
|
192
|
-
|
205
|
+
raise ValueError("Could not merge times defined with a different interval")
|
206
|
+
start = min_none(self.start, extent.start)
|
207
|
+
assert start is not None
|
208
|
+
self.start = start
|
209
|
+
end = max_none(self.end, extent.end)
|
210
|
+
assert end is not None
|
211
|
+
self.end = end
|
193
212
|
self.min_def_value = (
|
194
213
|
self.min_def_value
|
195
214
|
if extent.min_def_value is None
|
@@ -205,7 +224,7 @@ class TimeExtentInterval:
|
|
205
224
|
else max_none(self.max_def_value, extent.max_def_value)
|
206
225
|
)
|
207
226
|
|
208
|
-
def to_dict(self):
|
227
|
+
def to_dict(self) -> Dict[str, Any]:
|
209
228
|
min_def_value = _format_date(self.min_def_value) if self.min_def_value is not None else None
|
210
229
|
max_def_value = _format_date(self.max_def_value) if self.max_def_value is not None else None
|
211
230
|
|
@@ -219,10 +238,9 @@ class TimeExtentInterval:
|
|
219
238
|
}
|
220
239
|
|
221
240
|
|
222
|
-
def parse_extent(extent, default_values):
|
241
|
+
def parse_extent(extent: List[str], default_values: str) -> TimeExtent:
|
223
242
|
"""
|
224
|
-
Parse a time extend from OWSLib to a `̀ TimeExtentValue`` or a
|
225
|
-
``TimeExtentInterval``
|
243
|
+
Parse a time extend from OWSLib to a `̀ TimeExtentValue`` or a ``TimeExtentInterval``.
|
226
244
|
|
227
245
|
Two formats are supported:
|
228
246
|
* ['start/end/interval']
|
@@ -236,7 +254,7 @@ def parse_extent(extent, default_values):
|
|
236
254
|
if extent[0].count("/") > 0:
|
237
255
|
# case "start/end/interval"
|
238
256
|
if len(extent) > 1 or extent[0].count("/") != 2:
|
239
|
-
raise ValueError("Unsupported time definition '{
|
257
|
+
raise ValueError(f"Unsupported time definition '{extent!s}'")
|
240
258
|
s, e, i = extent[0].split("/")
|
241
259
|
start = _parse_date(s)
|
242
260
|
end = _parse_date(e)
|
@@ -246,20 +264,19 @@ def parse_extent(extent, default_values):
|
|
246
264
|
# case "value1, value2, ..., valueN"
|
247
265
|
dates = [_parse_date(d) for d in extent]
|
248
266
|
resolution = dates[0][0]
|
249
|
-
values =
|
267
|
+
values = {d[1] for d in dates}
|
250
268
|
|
251
269
|
return TimeExtentValue(values, resolution, min_def_value, max_def_value)
|
252
|
-
raise ValueError("Invalid time extent format '{}'"
|
270
|
+
raise ValueError(f"Invalid time extent format '{extent}'")
|
253
271
|
|
254
272
|
|
255
|
-
def _parse_default_values(default_values):
|
273
|
+
def _parse_default_values(default_values: str) -> Tuple[datetime.datetime, Optional[datetime.datetime]]:
|
256
274
|
"""
|
257
|
-
Parse the 'default' value from OWSLib's defaulttimeposition
|
258
|
-
|
259
|
-
slash separated String.
|
260
|
-
return None on the seconde value if it does not exist.
|
275
|
+
Parse the 'default' value from OWSLib's defaulttimeposition and return a maximum of two dates.
|
276
|
+
|
277
|
+
default value must be a slash separated String. return None on the seconde value if it does not exist.
|
261
278
|
"""
|
262
|
-
if default_values is None:
|
279
|
+
if default_values is None:
|
263
280
|
return None, None
|
264
281
|
|
265
282
|
def_value = default_values.split("/")
|
@@ -273,14 +290,16 @@ def _parse_default_values(default_values):
|
|
273
290
|
return min_def_value, max_def_value
|
274
291
|
|
275
292
|
|
276
|
-
def _parse_date(date):
|
293
|
+
def _parse_date(date: str) -> Tuple[str, datetime.datetime]:
|
277
294
|
"""
|
278
|
-
|
295
|
+
Parse a date string.
|
296
|
+
|
297
|
+
Return a tuple containing:
|
279
298
|
|
280
299
|
* the resolution: "year", "month", "day" or "second"
|
281
300
|
* the date as a datetime
|
282
301
|
|
283
|
-
The returned datetime always has a timezone (default
|
302
|
+
The returned datetime always has a timezone (default is UTC)
|
284
303
|
"""
|
285
304
|
resolutions = {"year": "%Y", "month": "%Y-%m", "day": "%Y-%m-%d"}
|
286
305
|
|
@@ -288,7 +307,7 @@ def _parse_date(date):
|
|
288
307
|
try:
|
289
308
|
dt = datetime.datetime.strptime(date, pattern)
|
290
309
|
return resolution, dt.replace(tzinfo=isodate.UTC)
|
291
|
-
except Exception:
|
310
|
+
except Exception: # nosec
|
292
311
|
pass
|
293
312
|
|
294
313
|
try:
|
@@ -296,33 +315,35 @@ def _parse_date(date):
|
|
296
315
|
if dt.tzinfo is None:
|
297
316
|
dt = dt.replace(tzinfo=isodate.UTC)
|
298
317
|
return "second", dt
|
299
|
-
except Exception:
|
300
|
-
raise ValueError("Invalid date format '{
|
318
|
+
except Exception as e:
|
319
|
+
raise ValueError(f"Invalid date format '{date}'") from e
|
301
320
|
|
302
321
|
|
303
|
-
def _format_date(date):
|
304
|
-
assert isinstance(date, datetime.datetime)
|
322
|
+
def _format_date(date: datetime.datetime) -> str:
|
305
323
|
str_ = isodate.datetime_isoformat(date)
|
324
|
+
assert isinstance(str_, str)
|
306
325
|
if date.tzinfo is None:
|
307
326
|
str_ += "Z"
|
308
327
|
return str_
|
309
328
|
|
310
329
|
|
311
|
-
def _parse_duration(duration):
|
330
|
+
def _parse_duration(duration: str) -> Tuple[int, int, int, int]:
|
312
331
|
"""
|
313
|
-
|
332
|
+
Parse an ISO 8601 duration (i.e. "P2DT5S").
|
333
|
+
|
334
|
+
Return a tuple containing:
|
314
335
|
|
315
336
|
* years
|
316
337
|
* months
|
317
338
|
* days
|
318
339
|
* seconds
|
319
340
|
"""
|
320
|
-
|
341
|
+
parsed_duration = isodate.parse_duration(duration)
|
321
342
|
|
322
343
|
# casting years and months to int as isodate might return a float
|
323
344
|
return (
|
324
|
-
int(
|
325
|
-
int(
|
326
|
-
|
327
|
-
|
345
|
+
int(parsed_duration.years) if hasattr(parsed_duration, "years") else 0,
|
346
|
+
int(parsed_duration.months) if hasattr(parsed_duration, "months") else 0,
|
347
|
+
parsed_duration.days,
|
348
|
+
parsed_duration.seconds,
|
328
349
|
)
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
1
|
# Copyright (c) 2018-2021, Camptocamp SA
|
4
2
|
# All rights reserved.
|
5
3
|
|
@@ -29,17 +27,25 @@
|
|
29
27
|
|
30
28
|
|
31
29
|
from io import BytesIO
|
30
|
+
from typing import Any, Callable, Dict, Optional, Type, Union, cast
|
32
31
|
|
32
|
+
import sqlalchemy.sql.schema
|
33
33
|
from papyrus.xsd import XSDGenerator as PapyrusXSDGenerator
|
34
34
|
from papyrus.xsd import tag
|
35
|
+
from sqlalchemy.ext.declarative import DeclarativeMeta
|
35
36
|
from sqlalchemy.orm.properties import ColumnProperty
|
36
37
|
from sqlalchemy.orm.util import class_mapper
|
37
38
|
|
38
39
|
|
39
|
-
class XSDGenerator(PapyrusXSDGenerator):
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
class XSDGenerator(PapyrusXSDGenerator): # type: ignore
|
41
|
+
"""Extends the PapyrusXSDGenerator."""
|
42
|
+
|
43
|
+
def add_class_properties_xsd(self, tb: str, cls: DeclarativeMeta) -> None:
|
44
|
+
"""
|
45
|
+
Add the XSD for the class properties to the ``TreeBuilder``.
|
46
|
+
|
47
|
+
And call the user ``sequence_callback``.
|
48
|
+
"""
|
43
49
|
mapper = class_mapper(cls)
|
44
50
|
properties = []
|
45
51
|
if cls.__attributes_order__:
|
@@ -62,7 +68,7 @@ class XSDGenerator(PapyrusXSDGenerator):
|
|
62
68
|
if self.sequence_callback:
|
63
69
|
self.sequence_callback(tb, cls)
|
64
70
|
|
65
|
-
def add_column_property_xsd(self, tb, column_property):
|
71
|
+
def add_column_property_xsd(self, tb: str, column_property: ColumnProperty) -> None:
|
66
72
|
column = column_property.columns[0]
|
67
73
|
if column.foreign_keys:
|
68
74
|
self.add_association_proxy_xsd(tb, column_property)
|
@@ -70,7 +76,7 @@ class XSDGenerator(PapyrusXSDGenerator):
|
|
70
76
|
|
71
77
|
super().add_column_property_xsd(tb, column_property)
|
72
78
|
|
73
|
-
def add_association_proxy_xsd(self, tb, column_property):
|
79
|
+
def add_association_proxy_xsd(self, tb: str, column_property: ColumnProperty) -> None:
|
74
80
|
from c2cgeoportal_commons.models import DBSession # pylint: disable=import-outside-toplevel
|
75
81
|
|
76
82
|
column = column_property.columns[0]
|
@@ -96,7 +102,7 @@ class XSDGenerator(PapyrusXSDGenerator):
|
|
96
102
|
pass
|
97
103
|
self.element_callback(tb4, column)
|
98
104
|
|
99
|
-
def element_callback(self, tb, column):
|
105
|
+
def element_callback(self, tb: str, column: sqlalchemy.sql.schema.Column) -> None:
|
100
106
|
if column.info.get("readonly"):
|
101
107
|
with tag(tb, "xsd:annotation"):
|
102
108
|
with tag(tb, "xsd:appinfo"):
|
@@ -105,12 +111,14 @@ class XSDGenerator(PapyrusXSDGenerator):
|
|
105
111
|
|
106
112
|
|
107
113
|
class XSD:
|
114
|
+
"""The XSD file generator on a pyramid view."""
|
115
|
+
|
108
116
|
def __init__(
|
109
117
|
self,
|
110
|
-
include_primary_keys=False,
|
111
|
-
include_foreign_keys=False,
|
112
|
-
sequence_callback=None,
|
113
|
-
element_callback=None,
|
118
|
+
include_primary_keys: bool = False,
|
119
|
+
include_foreign_keys: bool = False,
|
120
|
+
sequence_callback: Optional[str] = None,
|
121
|
+
element_callback: Optional[str] = None,
|
114
122
|
):
|
115
123
|
self.generator = XSDGenerator(
|
116
124
|
include_primary_keys=include_primary_keys,
|
@@ -119,14 +127,16 @@ class XSD:
|
|
119
127
|
element_callback=element_callback,
|
120
128
|
)
|
121
129
|
|
122
|
-
def __call__(
|
123
|
-
|
130
|
+
def __call__(
|
131
|
+
self, table: str
|
132
|
+
) -> Callable[[Union[Type[str], Type[bytes]], Dict[str, Any]], Optional[bytes]]:
|
133
|
+
def _render(cls: Union[Type[str], Type[bytes]], system: Dict[str, Any]) -> Optional[bytes]:
|
124
134
|
request = system.get("request")
|
125
135
|
if request is not None:
|
126
136
|
response = request.response
|
127
137
|
response.content_type = "application/xml"
|
128
138
|
io = self.generator.get_class_xsd(BytesIO(), cls)
|
129
|
-
return io.getvalue()
|
139
|
+
return cast(bytes, io.getvalue())
|
130
140
|
return None
|
131
141
|
|
132
142
|
return _render
|
@@ -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,18 +25,26 @@
|
|
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
|
|
28
|
+
from typing import List
|
29
|
+
|
30
|
+
import pyramid.request
|
31
|
+
|
30
32
|
|
31
33
|
class Root:
|
32
|
-
|
33
|
-
self.request = request # pragma: no cover
|
34
|
+
"""The pyramid root object."""
|
34
35
|
|
36
|
+
def __init__(self, request: pyramid.request.Request):
|
37
|
+
self.request = request
|
35
38
|
|
36
|
-
|
39
|
+
|
40
|
+
def defaultgroupsfinder(username: str, request: pyramid.request.Request) -> List[str]:
|
37
41
|
"""
|
38
|
-
|
39
|
-
|
42
|
+
Get the c2cgeoportal default group finder.
|
43
|
+
|
44
|
+
To be used as the callback of the ``AuthTktAuthenticationPolicy`` or any callback-based authentication
|
45
|
+
policy.
|
40
46
|
"""
|
41
47
|
del username # unused
|
42
48
|
if not hasattr(request, "user") or request.user is None:
|
43
|
-
return []
|
49
|
+
return []
|
44
50
|
return [role.name for role in request.user.roles]
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# yaml-language-server: $schema=https://raw.githubusercontent.com/camptocamp/c2cciutils/master/c2cciutils/schema.json
|
2
|
+
|
3
|
+
checks:
|
4
|
+
black: False
|
5
|
+
isort: False
|
6
|
+
prettier: False
|
7
|
+
codespell: False
|
8
|
+
eof: False
|
9
|
+
required_workflows: False
|
10
|
+
dependabot_config: False
|
11
|
+
prospector_config: False
|
12
|
+
setup: False
|
13
|
+
|
14
|
+
version:
|
15
|
+
branch_to_version_re:
|
16
|
+
- from: (prod-[0-9]+-[0-9]+)
|
17
|
+
to: \1
|
18
|
+
- from: (int-[0-9]+-[0-9]+)
|
19
|
+
to: \1
|
20
|
+
|
21
|
+
publish:
|
22
|
+
pypi: false
|
23
|
+
docker:
|
24
|
+
images:
|
25
|
+
- name: camptocamp/{{cookiecutter.package}}-config
|
26
|
+
- name: camptocamp/{{cookiecutter.package}}-geoportal
|
@@ -0,0 +1,18 @@
|
|
1
|
+
{
|
2
|
+
"project": "test_project",
|
3
|
+
"package": "test_project",
|
4
|
+
"srid": "2056",
|
5
|
+
"extent": "",
|
6
|
+
"extent_mapserver": "",
|
7
|
+
"authtkt_secret": "",
|
8
|
+
"unsafe_long_version": false,
|
9
|
+
"geomapfish_version": "",
|
10
|
+
"geomapfish_main_version": "",
|
11
|
+
"geomapfish_main_version_dash": "",
|
12
|
+
"geomapfish_main_minor_version": "",
|
13
|
+
"geomapfish_version_tag": "",
|
14
|
+
"geomapfish_version_tag_env": "",
|
15
|
+
"geomapfish_major_version_tag": "",
|
16
|
+
"geomapfish_major_version_tag_env": "",
|
17
|
+
"_copy_without_render": ["*.po", "*/contextualdata.html"]
|
18
|
+
}
|
c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/.eslintrc.yaml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
extends:
|
2
|
+
- eslint:recommended
|
3
|
+
|
4
|
+
globals:
|
5
|
+
'{{cookiecutter.package}}': false
|
6
|
+
|
7
|
+
env:
|
8
|
+
es6: true
|
9
|
+
node: true
|
10
|
+
browser: true
|
11
|
+
jquery: true
|
12
|
+
|
13
|
+
parserOptions:
|
14
|
+
sourceType: module
|
15
|
+
ecmaVersion: 2020
|
16
|
+
|
17
|
+
rules:
|
18
|
+
no-console: 0
|
19
|
+
no-unused-vars: 0
|
@@ -1,5 +1,6 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
max-line-length: 110
|
2
|
+
|
3
|
+
pycodestyle:
|
3
4
|
options:
|
4
5
|
max-line-length: 110
|
5
6
|
disable:
|
@@ -12,6 +13,11 @@ pylint:
|
|
12
13
|
- too-many-locals
|
13
14
|
- too-many-statements
|
14
15
|
- too-many-branches
|
16
|
+
- c-extension-no-member
|
17
|
+
|
18
|
+
pyflakes:
|
19
|
+
disable:
|
20
|
+
- F401
|
15
21
|
|
16
22
|
mccabe:
|
17
23
|
run: false
|