c2cgeoportal-geoportal 2.5.0.100__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 +261 -130
- c2cgeoportal_geoportal/lib/__init__.py +72 -120
- c2cgeoportal_geoportal/lib/authentication.py +170 -21
- c2cgeoportal_geoportal/lib/bashcolor.py +17 -13
- c2cgeoportal_geoportal/lib/cacheversion.py +19 -11
- c2cgeoportal_geoportal/lib/caching.py +66 -160
- c2cgeoportal_geoportal/lib/check_collector.py +17 -10
- c2cgeoportal_geoportal/lib/checker.py +62 -64
- c2cgeoportal_geoportal/lib/common_headers.py +170 -0
- c2cgeoportal_geoportal/lib/dbreflection.py +70 -31
- c2cgeoportal_geoportal/lib/filter_capabilities.py +124 -96
- c2cgeoportal_geoportal/lib/fulltextsearch.py +50 -0
- c2cgeoportal_geoportal/lib/functionality.py +36 -21
- c2cgeoportal_geoportal/lib/headers.py +14 -5
- c2cgeoportal_geoportal/lib/i18n.py +39 -0
- c2cgeoportal_geoportal/lib/layers.py +29 -10
- c2cgeoportal_geoportal/lib/lingua_extractor.py +408 -211
- c2cgeoportal_geoportal/lib/loader.py +18 -16
- c2cgeoportal_geoportal/lib/metrics.py +29 -18
- c2cgeoportal_geoportal/lib/oauth2.py +1036 -0
- c2cgeoportal_geoportal/lib/wmstparsing.py +115 -90
- c2cgeoportal_geoportal/lib/xsd.py +29 -19
- 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/+dot+prospector.yaml → advance_create/{{cookiecutter.project}}/geoportal/.prospector.yaml} +8 -4
- c2cgeoportal_geoportal/scaffolds/{create/geoportal/Dockerfile_tmpl → advance_create/{{cookiecutter.project}}/geoportal/Dockerfile} +24 -15
- c2cgeoportal_geoportal/scaffolds/{create → advance_create/{{cookiecutter.project}}}/geoportal/alembic.ini +1 -0
- 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/advance_create/{{cookiecutter.project}}/geoportal/setup.py +25 -0
- 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 +4 -4
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/__init__.py +47 -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/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static-ngeo/api/index.js +12 -0
- c2cgeoportal_geoportal/scaffolds/advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static-ngeo/js/{{cookiecutter.package}}module.js +25 -0
- c2cgeoportal_geoportal/scaffolds/{create/geoportal/+package+_geoportal/subscribers.py_tmpl → advance_create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/subscribers.py} +3 -6
- c2cgeoportal_geoportal/scaffolds/advance_update/cookiecutter.json +18 -0
- c2cgeoportal_geoportal/scaffolds/{update/geoportal/CONST_Makefile_tmpl → advance_update/{{cookiecutter.project}}/geoportal/CONST_Makefile} +32 -20
- 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} +4 -8
- 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} +34 -24
- 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/{{cookiecutter.project}}/ci/config.yaml +25 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/ci/requirements.txt +1 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/docker-compose-lib.yaml +474 -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} +43 -18
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.default +82 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/env.project +60 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/vars.yaml +396 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/css/mobile.css +0 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/markers/marker-blue.png +0 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/markers/marker-gold.png +0 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/markers/marker-green.png +0 -0
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/geoportal/{{cookiecutter.package}}_geoportal/static/images/markers/marker.png +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 +17 -9
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A3_Portrait.jrxml +17 -9
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Landscape.jrxml +17 -9
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/A4_Portrait.jrxml +17 -9
- c2cgeoportal_geoportal/scaffolds/create/{print/print-apps/+package+ → {{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}}/config.yaml.tmpl +30 -27
- c2cgeoportal_geoportal/scaffolds/create/{{cookiecutter.project}}/print/print-apps/{{cookiecutter.package}}/legend.jrxml +109 -0
- 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/{{cookiecutter.project}}/pyproject.toml +3 -0
- 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/{{cookiecutter.project}}/setup.cfg +7 -0
- 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/{{cookiecutter.project}}/.upgrade.yaml +191 -0
- c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/CONST_CHANGELOG.txt +1153 -0
- c2cgeoportal_geoportal/scaffolds/update/{geoportal → {{cookiecutter.project}}/geoportal}/CONST_config-schema.yaml +99 -47
- c2cgeoportal_geoportal/scaffolds/update/{{cookiecutter.project}}/geoportal/CONST_vars.yaml +1412 -0
- c2cgeoportal_geoportal/scripts/__init__.py +17 -33
- c2cgeoportal_geoportal/scripts/c2cupgrade.py +295 -200
- c2cgeoportal_geoportal/scripts/create_demo_theme.py +5 -6
- c2cgeoportal_geoportal/scripts/manage_users.py +34 -37
- c2cgeoportal_geoportal/scripts/pcreate.py +312 -0
- c2cgeoportal_geoportal/scripts/theme2fts.py +92 -25
- c2cgeoportal_geoportal/scripts/urllogin.py +23 -17
- c2cgeoportal_geoportal/templates/login.html +88 -84
- c2cgeoportal_geoportal/templates/notlogin.html +62 -0
- 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 +70 -40
- c2cgeoportal_geoportal/views/entry.py +93 -24
- c2cgeoportal_geoportal/views/fulltextsearch.py +36 -29
- c2cgeoportal_geoportal/views/geometry_processing.py +15 -7
- c2cgeoportal_geoportal/views/i18n.py +91 -9
- c2cgeoportal_geoportal/views/layers.py +173 -134
- c2cgeoportal_geoportal/views/login.py +206 -87
- c2cgeoportal_geoportal/views/mapserverproxy.py +59 -35
- c2cgeoportal_geoportal/views/memory.py +13 -13
- c2cgeoportal_geoportal/views/ogcproxy.py +48 -30
- c2cgeoportal_geoportal/views/pdfreport.py +31 -27
- c2cgeoportal_geoportal/views/printproxy.py +67 -53
- c2cgeoportal_geoportal/views/profile.py +25 -24
- c2cgeoportal_geoportal/views/proxy.py +97 -68
- c2cgeoportal_geoportal/views/raster.py +47 -29
- c2cgeoportal_geoportal/views/resourceproxy.py +13 -11
- c2cgeoportal_geoportal/views/shortener.py +31 -24
- c2cgeoportal_geoportal/views/theme.py +475 -365
- c2cgeoportal_geoportal/views/tinyowsproxy.py +46 -39
- c2cgeoportal_geoportal/views/vector_tiles.py +80 -0
- {c2cgeoportal_geoportal-2.5.0.100.dist-info → c2cgeoportal_geoportal-2.7.1.83.dist-info}/METADATA +16 -11
- c2cgeoportal_geoportal-2.7.1.83.dist-info/RECORD +185 -0
- {c2cgeoportal_geoportal-2.5.0.100.dist-info → c2cgeoportal_geoportal-2.7.1.83.dist-info}/WHEEL +1 -1
- {c2cgeoportal_geoportal-2.5.0.100.dist-info → c2cgeoportal_geoportal-2.7.1.83.dist-info}/entry_points.txt +3 -1
- tests/__init__.py +24 -3
- tests/test_cachebuster.py +1 -3
- tests/test_caching.py +19 -26
- tests/test_checker.py +2 -3
- tests/test_decimaljson.py +4 -4
- tests/test_headerstween.py +0 -3
- tests/test_i18n.py +31 -0
- tests/test_init.py +12 -27
- tests/test_locale_negociator.py +6 -6
- tests/test_mapserverproxy_route_predicate.py +0 -2
- tests/test_raster.py +18 -5
- tests/test_wmstparsing.py +7 -8
- c2cgeoportal_geoportal/scaffolds/__init__.py +0 -226
- c2cgeoportal_geoportal/scaffolds/create/+dot+dockerignore_tmpl +0 -11
- c2cgeoportal_geoportal/scaffolds/create/+dot+github/workflows/ci.yaml_tmpl +0 -56
- c2cgeoportal_geoportal/scaffolds/create/+dot+gitignore_tmpl +0 -12
- c2cgeoportal_geoportal/scaffolds/create/build_tmpl +0 -144
- c2cgeoportal_geoportal/scaffolds/create/docker-compose-lib.yaml_tmpl +0 -302
- c2cgeoportal_geoportal/scaffolds/create/docker-compose.override.sample.yaml_tmpl +0 -54
- c2cgeoportal_geoportal/scaffolds/create/env.default_tmpl +0 -49
- c2cgeoportal_geoportal/scaffolds/create/env.project_tmpl +0 -39
- c2cgeoportal_geoportal/scaffolds/create/geoportal/+dot+dockerignore_tmpl +0 -5
- c2cgeoportal_geoportal/scaffolds/create/geoportal/+dot+eslintrc_tmpl +0 -19
- c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/__init__.py_tmpl +0 -48
- c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/models.py_tmpl +0 -10
- c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static/images/favicon.ico +0 -0
- c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static/robot.txt +0 -3
- c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/api/index.js_tmpl +0 -37
- c2cgeoportal_geoportal/scaffolds/create/geoportal/+package+_geoportal/static-ngeo/js/+package+module.js_tmpl +0 -22
- c2cgeoportal_geoportal/scaffolds/create/geoportal/production.ini_tmpl +0 -106
- c2cgeoportal_geoportal/scaffolds/create/geoportal/requirements.txt +0 -2
- c2cgeoportal_geoportal/scaffolds/create/geoportal/setup.py_tmpl +0 -18
- c2cgeoportal_geoportal/scaffolds/create/geoportal/tsconfig.json_tmpl +0 -9
- c2cgeoportal_geoportal/scaffolds/create/geoportal/vars.yaml_tmpl +0 -224
- c2cgeoportal_geoportal/scaffolds/create/geoportal/webpack.api.js_tmpl +0 -71
- 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 -166
- c2cgeoportal_geoportal/scaffolds/create/print/print-apps/+package+/legend.jrxml +0 -27
- c2cgeoportal_geoportal/scaffolds/create/qgisserver/geomapfish.yaml.tmpl_tmpl +0 -29
- c2cgeoportal_geoportal/scaffolds/create/scripts/publish-docker +0 -124
- c2cgeoportal_geoportal/scaffolds/create/setup.cfg_tmpl +0 -3
- c2cgeoportal_geoportal/scaffolds/create/spell-ignore-words.txt +0 -1
- c2cgeoportal_geoportal/scaffolds/create/tilegeneration/config.yaml.tmpl_tmpl +0 -169
- c2cgeoportal_geoportal/scaffolds/create/yamllint.yaml +0 -11
- c2cgeoportal_geoportal/scaffolds/update/+dot+upgrade.yaml_tmpl +0 -171
- c2cgeoportal_geoportal/scaffolds/update/CONST_CHANGELOG.txt_tmpl +0 -64
- c2cgeoportal_geoportal/scaffolds/update/geoportal/CONST_vars.yaml_tmpl +0 -783
- c2cgeoportal_geoportal/templates/dynamic.js +0 -21
- c2cgeoportal_geoportal-2.5.0.100.dist-info/RECORD +0 -162
- tests/test_get_url.py +0 -96
- tests/test_lib.py +0 -77
- /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/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/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}}}/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/{run_alembic.sh → {{cookiecutter.project}}/run_alembic.sh} +0 -0
- {c2cgeoportal_geoportal-2.5.0.100.dist-info → c2cgeoportal_geoportal-2.7.1.83.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,4 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
# Copyright (c) 2013-2020, Camptocamp SA
|
1
|
+
# Copyright (c) 2013-2024, 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
|
+
Initialise.
|
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,31 +198,37 @@ 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
|
196
|
-
else
|
197
|
-
|
198
|
-
|
215
|
+
else (
|
216
|
+
extent.min_def_value
|
217
|
+
if self.min_def_value is None
|
218
|
+
else min_none(self.min_def_value, extent.min_def_value)
|
219
|
+
)
|
199
220
|
)
|
200
221
|
self.max_def_value = (
|
201
222
|
self.max_def_value
|
202
223
|
if extent.max_def_value is None
|
203
|
-
else
|
204
|
-
|
205
|
-
|
224
|
+
else (
|
225
|
+
extent.max_def_value
|
226
|
+
if self.max_def_value is None
|
227
|
+
else max_none(self.max_def_value, extent.max_def_value)
|
228
|
+
)
|
206
229
|
)
|
207
230
|
|
208
|
-
def to_dict(self):
|
231
|
+
def to_dict(self) -> Dict[str, Any]:
|
209
232
|
min_def_value = _format_date(self.min_def_value) if self.min_def_value is not None else None
|
210
233
|
max_def_value = _format_date(self.max_def_value) if self.max_def_value is not None else None
|
211
234
|
|
@@ -219,10 +242,9 @@ class TimeExtentInterval:
|
|
219
242
|
}
|
220
243
|
|
221
244
|
|
222
|
-
def parse_extent(extent, default_values):
|
245
|
+
def parse_extent(extent: List[str], default_values: str) -> TimeExtent:
|
223
246
|
"""
|
224
|
-
Parse a time extend from OWSLib to a `̀ TimeExtentValue`` or a
|
225
|
-
``TimeExtentInterval``
|
247
|
+
Parse a time extend from OWSLib to a `̀ TimeExtentValue`` or a ``TimeExtentInterval``.
|
226
248
|
|
227
249
|
Two formats are supported:
|
228
250
|
* ['start/end/interval']
|
@@ -236,7 +258,7 @@ def parse_extent(extent, default_values):
|
|
236
258
|
if extent[0].count("/") > 0:
|
237
259
|
# case "start/end/interval"
|
238
260
|
if len(extent) > 1 or extent[0].count("/") != 2:
|
239
|
-
raise ValueError("Unsupported time definition '{
|
261
|
+
raise ValueError(f"Unsupported time definition '{extent!s}'")
|
240
262
|
s, e, i = extent[0].split("/")
|
241
263
|
start = _parse_date(s)
|
242
264
|
end = _parse_date(e)
|
@@ -246,20 +268,19 @@ def parse_extent(extent, default_values):
|
|
246
268
|
# case "value1, value2, ..., valueN"
|
247
269
|
dates = [_parse_date(d) for d in extent]
|
248
270
|
resolution = dates[0][0]
|
249
|
-
values =
|
271
|
+
values = {d[1] for d in dates}
|
250
272
|
|
251
273
|
return TimeExtentValue(values, resolution, min_def_value, max_def_value)
|
252
|
-
raise ValueError("Invalid time extent format '{}'"
|
274
|
+
raise ValueError(f"Invalid time extent format '{extent}'")
|
253
275
|
|
254
276
|
|
255
|
-
def _parse_default_values(default_values):
|
277
|
+
def _parse_default_values(default_values: str) -> Tuple[datetime.datetime, Optional[datetime.datetime]]:
|
256
278
|
"""
|
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.
|
279
|
+
Parse the 'default' value from OWSLib's defaulttimeposition and return a maximum of two dates.
|
280
|
+
|
281
|
+
default value must be a slash separated String. return None on the seconde value if it does not exist.
|
261
282
|
"""
|
262
|
-
if default_values is None:
|
283
|
+
if default_values is None:
|
263
284
|
return None, None
|
264
285
|
|
265
286
|
def_value = default_values.split("/")
|
@@ -273,14 +294,16 @@ def _parse_default_values(default_values):
|
|
273
294
|
return min_def_value, max_def_value
|
274
295
|
|
275
296
|
|
276
|
-
def _parse_date(date):
|
297
|
+
def _parse_date(date: str) -> Tuple[str, datetime.datetime]:
|
277
298
|
"""
|
278
|
-
|
299
|
+
Parse a date string.
|
300
|
+
|
301
|
+
Return a tuple containing:
|
279
302
|
|
280
303
|
* the resolution: "year", "month", "day" or "second"
|
281
304
|
* the date as a datetime
|
282
305
|
|
283
|
-
The returned datetime always has a timezone (default
|
306
|
+
The returned datetime always has a timezone (default is UTC)
|
284
307
|
"""
|
285
308
|
resolutions = {"year": "%Y", "month": "%Y-%m", "day": "%Y-%m-%d"}
|
286
309
|
|
@@ -288,7 +311,7 @@ def _parse_date(date):
|
|
288
311
|
try:
|
289
312
|
dt = datetime.datetime.strptime(date, pattern)
|
290
313
|
return resolution, dt.replace(tzinfo=isodate.UTC)
|
291
|
-
except Exception:
|
314
|
+
except Exception: # nosec
|
292
315
|
pass
|
293
316
|
|
294
317
|
try:
|
@@ -296,33 +319,35 @@ def _parse_date(date):
|
|
296
319
|
if dt.tzinfo is None:
|
297
320
|
dt = dt.replace(tzinfo=isodate.UTC)
|
298
321
|
return "second", dt
|
299
|
-
except Exception:
|
300
|
-
raise ValueError("Invalid date format '{
|
322
|
+
except Exception as e:
|
323
|
+
raise ValueError(f"Invalid date format '{date}'") from e
|
301
324
|
|
302
325
|
|
303
|
-
def _format_date(date):
|
304
|
-
assert isinstance(date, datetime.datetime)
|
326
|
+
def _format_date(date: datetime.datetime) -> str:
|
305
327
|
str_ = isodate.datetime_isoformat(date)
|
328
|
+
assert isinstance(str_, str)
|
306
329
|
if date.tzinfo is None:
|
307
330
|
str_ += "Z"
|
308
331
|
return str_
|
309
332
|
|
310
333
|
|
311
|
-
def _parse_duration(duration):
|
334
|
+
def _parse_duration(duration: str) -> Tuple[int, int, int, int]:
|
312
335
|
"""
|
313
|
-
|
336
|
+
Parse an ISO 8601 duration (i.e. "P2DT5S").
|
337
|
+
|
338
|
+
Return a tuple containing:
|
314
339
|
|
315
340
|
* years
|
316
341
|
* months
|
317
342
|
* days
|
318
343
|
* seconds
|
319
344
|
"""
|
320
|
-
|
345
|
+
parsed_duration = isodate.parse_duration(duration)
|
321
346
|
|
322
347
|
# casting years and months to int as isodate might return a float
|
323
348
|
return (
|
324
|
-
int(
|
325
|
-
int(
|
326
|
-
|
327
|
-
|
349
|
+
int(parsed_duration.years) if hasattr(parsed_duration, "years") else 0,
|
350
|
+
int(parsed_duration.months) if hasattr(parsed_duration, "months") else 0,
|
351
|
+
parsed_duration.days,
|
352
|
+
parsed_duration.seconds,
|
328
353
|
)
|
@@ -1,6 +1,4 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
# Copyright (c) 2018-2019, Camptocamp SA
|
1
|
+
# Copyright (c) 2018-2021, Camptocamp SA
|
4
2
|
# All rights reserved.
|
5
3
|
|
6
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -29,19 +27,26 @@
|
|
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
|
-
|
43
|
-
|
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``.
|
44
46
|
|
47
|
+
And call the user ``sequence_callback``.
|
48
|
+
"""
|
49
|
+
mapper = class_mapper(cls)
|
45
50
|
properties = []
|
46
51
|
if cls.__attributes_order__:
|
47
52
|
for attribute_name in cls.__attributes_order__:
|
@@ -63,7 +68,7 @@ class XSDGenerator(PapyrusXSDGenerator):
|
|
63
68
|
if self.sequence_callback:
|
64
69
|
self.sequence_callback(tb, cls)
|
65
70
|
|
66
|
-
def add_column_property_xsd(self, tb, column_property):
|
71
|
+
def add_column_property_xsd(self, tb: str, column_property: ColumnProperty) -> None:
|
67
72
|
column = column_property.columns[0]
|
68
73
|
if column.foreign_keys:
|
69
74
|
self.add_association_proxy_xsd(tb, column_property)
|
@@ -71,7 +76,7 @@ class XSDGenerator(PapyrusXSDGenerator):
|
|
71
76
|
|
72
77
|
super().add_column_property_xsd(tb, column_property)
|
73
78
|
|
74
|
-
def add_association_proxy_xsd(self, tb, column_property):
|
79
|
+
def add_association_proxy_xsd(self, tb: str, column_property: ColumnProperty) -> None:
|
75
80
|
from c2cgeoportal_commons.models import DBSession # pylint: disable=import-outside-toplevel
|
76
81
|
|
77
82
|
column = column_property.columns[0]
|
@@ -82,6 +87,8 @@ class XSDGenerator(PapyrusXSDGenerator):
|
|
82
87
|
relationship_property = class_mapper(cls).get_property(association_proxy.target)
|
83
88
|
target_cls = relationship_property.argument
|
84
89
|
query = DBSession.query(getattr(target_cls, association_proxy.value_attr))
|
90
|
+
if association_proxy.order_by is not None:
|
91
|
+
query = query.order_by(getattr(target_cls, association_proxy.order_by))
|
85
92
|
attrs = {}
|
86
93
|
if association_proxy.nullable:
|
87
94
|
attrs["minOccurs"] = "0"
|
@@ -95,8 +102,7 @@ class XSDGenerator(PapyrusXSDGenerator):
|
|
95
102
|
pass
|
96
103
|
self.element_callback(tb4, column)
|
97
104
|
|
98
|
-
|
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-2019, 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,7 +1,6 @@
|
|
1
|
-
|
2
|
-
strictness: veryhigh
|
1
|
+
max-line-length: 110
|
3
2
|
|
4
|
-
|
3
|
+
pycodestyle:
|
5
4
|
options:
|
6
5
|
max-line-length: 110
|
7
6
|
disable:
|
@@ -14,9 +13,14 @@ pylint:
|
|
14
13
|
- too-many-locals
|
15
14
|
- too-many-statements
|
16
15
|
- too-many-branches
|
16
|
+
- c-extension-no-member
|
17
|
+
|
18
|
+
pyflakes:
|
19
|
+
disable:
|
20
|
+
- F401
|
17
21
|
|
18
22
|
mccabe:
|
19
23
|
run: false
|
20
24
|
|
21
|
-
|
25
|
+
bandit:
|
22
26
|
run: true
|