apache-airflow-providers-fab 2.0.2rc2__tar.gz → 2.1.0rc1__tar.gz
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.
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/PKG-INFO +10 -10
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/README.rst +5 -5
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/auth-manager/webserver-authentication.rst +8 -8
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/changelog.rst +30 -0
- apache_airflow_providers_fab-2.1.0rc1/docs/commits.rst +35 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/configurations-ref.rst +2 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/index.rst +6 -6
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/provider.yaml +72 -2
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/pyproject.toml +5 -5
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/__init__.py +3 -3
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api_endpoints/role_and_permission_endpoint.py +4 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api_endpoints/user_endpoint.py +4 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/models/__init__.py +56 -6
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/models/anonymous_user.py +5 -1
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/security_manager/override.py +25 -21
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/get_provider_info.py +56 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/app.py +2 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/auth.py +3 -3
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/extensions/init_jinja_globals.py +1 -1
- apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/extensions/init_wsgi_middlewares.py +41 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/package-lock.json +1258 -520
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/package.json +7 -7
- apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/main.edb2d40dfbbc537916e3.js → apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/main.eb83be09d97c23018bcb.js +1 -1
- apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/manifest.json +20 -0
- apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/moment.624b1f00ba723d39ce06.js → apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/moment.75a9286ff6019fefe5d9.js +1 -1
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api_endpoints/test_auth.py +0 -2
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/models/test_anonymous_user.py +1 -1
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/test_security.py +6 -6
- apache_airflow_providers_fab-2.0.2rc2/docs/commits.rst +0 -522
- apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/manifest.json +0 -20
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/3rd-party-licenses/LICENSES-ui.txt +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/NOTICE +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/api-ref/fab-public-api-ref.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/api-ref/fab-token-api-ref.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/auth-manager/access-control.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/auth-manager/api-authentication.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/auth-manager/configuring-flask-app.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/auth-manager/index.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/auth-manager/security.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/auth-manager/token.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/cli-ref.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/conf.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/img/add-role.png +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/img/diagram_fab_auth_manager_airflow_architecture.md5sum +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/img/diagram_fab_auth_manager_airflow_architecture.png +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/img/diagram_fab_auth_manager_airflow_architecture.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/img/new-role.png +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/installing-providers-from-sources.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/migrations-ref.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/security.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/upgrading.rst +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/3rd-party-licenses/LICENSES-ui.txt +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/LICENSE +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/alembic.ini +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api/auth/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api/auth/backend/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api/auth/backend/basic_auth.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api/auth/backend/kerberos_auth.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api/auth/backend/session.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api_endpoints/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api_fastapi/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api_fastapi/datamodels/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api_fastapi/datamodels/login.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api_fastapi/openapi/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api_fastapi/openapi/v1-fab-auth-manager-generated.yaml +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api_fastapi/routes/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api_fastapi/routes/login.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api_fastapi/services/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/api_fastapi/services/login.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/cli_commands/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/cli_commands/db_command.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/cli_commands/definition.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/cli_commands/role_command.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/cli_commands/sync_perm_command.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/cli_commands/user_command.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/cli_commands/utils.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/fab_auth_manager.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/models/db.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/openapi/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/openapi/v1-flask-api.yaml +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/schemas/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/schemas/role_and_permission_schema.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/schemas/user_schema.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/security_manager/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/security_manager/constants.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/views/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/views/permissions.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/views/roles_list.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/views/user.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/views/user_edit.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/auth_manager/views/user_stats.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/migrations/README +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/migrations/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/migrations/env.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/migrations/script.py.mako +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/migrations/versions/0001_1_4_0_placeholder_migration.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/migrations/versions/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/airflow_flask_app.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/api_connexion/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/api_connexion/exceptions.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/api_connexion/parameters.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/api_connexion/security.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/api_connexion/types.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/constants.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/extensions/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/extensions/init_appbuilder.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/extensions/init_manifest_files.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/extensions/init_security.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/extensions/init_session.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/extensions/init_views.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/security/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/security/permissions.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/security_appless.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/security_manager.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/session.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/css/bootstrap-theme.css +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/css/flash.css +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/css/loading-dots.css +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/css/main.css +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/css/material-icons.css +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/dist/48f0ea180c40270a5b05.png +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/dist/649c0b07771e68fafdeb.png +0 -0
- /apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/airflowDefaultTheme.feec4a4075c2f3d6ae01.css → /apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/airflowDefaultTheme.a26736fa84b3356edac0.css +0 -0
- /apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/airflowDefaultTheme.feec4a4075c2f3d6ae01.js → /apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/airflowDefaultTheme.a26736fa84b3356edac0.js +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/dist/f7490d556a6c42e49ba4.png +0 -0
- /apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/flash.137b30cff85b5588e661.css → /apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/flash.fbcc531a39479aa27065.css +0 -0
- /apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/flash.137b30cff85b5588e661.js → /apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/flash.fbcc531a39479aa27065.js +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/dist/jquery-ui.min.css +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/dist/jquery-ui.min.js +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/dist/jquery-ui.min.js.LICENSE.txt +0 -0
- /apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/loadingDots.48ab7d5b04e66f2686b0.css → /apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/loadingDots.e1fc82c3ac3f9af3771e.css +0 -0
- /apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/loadingDots.48ab7d5b04e66f2686b0.js → /apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/loadingDots.e1fc82c3ac3f9af3771e.js +0 -0
- /apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/main.edb2d40dfbbc537916e3.css → /apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/main.eb83be09d97c23018bcb.css +0 -0
- /apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/main.edb2d40dfbbc537916e3.js.LICENSE.txt → /apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/main.eb83be09d97c23018bcb.js.LICENSE.txt +0 -0
- /apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/materialIcons.57390fa60d8f61175334.css → /apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/materialIcons.b21138ea09d0cdf9ffc4.css +0 -0
- /apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/materialIcons.57390fa60d8f61175334.js → /apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/materialIcons.b21138ea09d0cdf9ffc4.js +0 -0
- /apache_airflow_providers_fab-2.0.2rc2/src/airflow/providers/fab/www/static/dist/moment.624b1f00ba723d39ce06.js.LICENSE.txt → /apache_airflow_providers_fab-2.1.0rc1/src/airflow/providers/fab/www/static/dist/moment.75a9286ff6019fefe5d9.js.LICENSE.txt +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/dist/oss-licenses.json +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/js/datetime_utils.js +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/js/main.js +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/sort_asc.png +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/sort_both.png +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/static/sort_desc.png +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/templates/airflow/_messages.html +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/templates/airflow/error.html +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/templates/airflow/main.html +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/templates/airflow/traceback.html +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/templates/appbuilder/flash.html +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/templates/appbuilder/index.html +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/templates/appbuilder/navbar.html +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/templates/appbuilder/navbar_menu.html +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/templates/appbuilder/navbar_right.html +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/utils.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/views.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/src/airflow/providers/fab/www/webpack.config.js +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/conftest.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api/auth/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api/auth/backend/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api/auth/backend/test_basic_auth.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api/auth/backend/test_kerberos_auth.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api/auth/backend/test_session.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api_endpoints/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api_endpoints/api_connexion_utils.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api_endpoints/remote_user_api_auth_backend.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api_endpoints/test_role_and_permission_endpoint.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api_endpoints/test_user_endpoint.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api_fastapi/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api_fastapi/conftest.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api_fastapi/routes/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api_fastapi/routes/test_login.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api_fastapi/services/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/api_fastapi/services/test_login.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/cli_commands/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/cli_commands/test_db_command.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/cli_commands/test_definition.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/cli_commands/test_role_command.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/cli_commands/test_sync_perm_command.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/cli_commands/test_user_command.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/cli_commands/test_utils.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/conftest.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/models/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/models/test_db.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/schemas/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/schemas/test_role_and_permission_schema.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/schemas/test_user_schema.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/security_manager/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/security_manager/test_constants.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/security_manager/test_override.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/test_fab_auth_manager.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/test_models.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/views/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/views/test_permissions.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/views/test_roles_list.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/views/test_user.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/views/test_user_edit.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/auth_manager/views/test_user_stats.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/decorators.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/utils.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/www/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/www/test_auth.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/www/test_utils.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/www/views/__init__.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/www/views/conftest.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/www/views/test_connection_form_fields.py +0 -0
- {apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/tests/unit/fab/www/views/test_views_custom_user_views.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: apache-airflow-providers-fab
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.1.0rc1
|
4
4
|
Summary: Provider package apache-airflow-providers-fab for Apache Airflow
|
5
5
|
Keywords: airflow-provider,fab,airflow,integration
|
6
6
|
Author-email: Apache Software Foundation <dev@airflow.apache.org>
|
@@ -22,11 +22,11 @@ Classifier: Programming Language :: Python :: 3.12
|
|
22
22
|
Classifier: Topic :: System :: Monitoring
|
23
23
|
License-File: 3rd-party-licenses/LICENSES-ui.txt
|
24
24
|
License-File: NOTICE
|
25
|
-
Requires-Dist: apache-airflow>=3.0.
|
25
|
+
Requires-Dist: apache-airflow>=3.0.2rc1
|
26
26
|
Requires-Dist: apache-airflow-providers-common-compat>=1.2.1rc1
|
27
27
|
Requires-Dist: blinker>=1.6.2
|
28
28
|
Requires-Dist: flask>=2.2.1,<2.3
|
29
|
-
Requires-Dist: flask-appbuilder==4.
|
29
|
+
Requires-Dist: flask-appbuilder==4.6.3
|
30
30
|
Requires-Dist: flask-login>=0.6.2
|
31
31
|
Requires-Dist: flask-session>=0.4.0,<0.6
|
32
32
|
Requires-Dist: flask-wtf>=1.1.0
|
@@ -36,8 +36,8 @@ Requires-Dist: werkzeug>=2.2,<4
|
|
36
36
|
Requires-Dist: wtforms>=3.0,<4
|
37
37
|
Requires-Dist: kerberos>=1.3.0 ; extra == "kerberos"
|
38
38
|
Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
|
39
|
-
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-fab/2.0
|
40
|
-
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-fab/2.0
|
39
|
+
Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-fab/2.1.0/changelog.html
|
40
|
+
Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-fab/2.1.0
|
41
41
|
Project-URL: Mastodon, https://fosstodon.org/@airflow
|
42
42
|
Project-URL: Slack Chat, https://s.apache.org/airflow-slack
|
43
43
|
Project-URL: Source Code, https://github.com/apache/airflow
|
@@ -69,7 +69,7 @@ Provides-Extra: kerberos
|
|
69
69
|
|
70
70
|
Package ``apache-airflow-providers-fab``
|
71
71
|
|
72
|
-
Release: ``2.0
|
72
|
+
Release: ``2.1.0``
|
73
73
|
|
74
74
|
|
75
75
|
`Flask App Builder <https://flask-appbuilder.readthedocs.io/>`__
|
@@ -82,7 +82,7 @@ This is a provider package for ``fab`` provider. All classes for this provider p
|
|
82
82
|
are in ``airflow.providers.fab`` python package.
|
83
83
|
|
84
84
|
You can find package information and changelog for the provider
|
85
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/2.0
|
85
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/2.1.0/>`_.
|
86
86
|
|
87
87
|
Installation
|
88
88
|
------------
|
@@ -99,11 +99,11 @@ Requirements
|
|
99
99
|
========================================== ==================
|
100
100
|
PIP package Version required
|
101
101
|
========================================== ==================
|
102
|
-
``apache-airflow`` ``>=3.0.
|
102
|
+
``apache-airflow`` ``>=3.0.2``
|
103
103
|
``apache-airflow-providers-common-compat`` ``>=1.2.1``
|
104
104
|
``blinker`` ``>=1.6.2``
|
105
105
|
``flask`` ``>=2.2.1,<2.3``
|
106
|
-
``flask-appbuilder`` ``==4.
|
106
|
+
``flask-appbuilder`` ``==4.6.3``
|
107
107
|
``flask-login`` ``>=0.6.2``
|
108
108
|
``flask-session`` ``>=0.4.0,<0.6``
|
109
109
|
``flask-wtf`` ``>=1.1.0``
|
@@ -133,5 +133,5 @@ Dependent package
|
|
133
133
|
================================================================================================================== =================
|
134
134
|
|
135
135
|
The changelog for the provider package can be found in the
|
136
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/2.0
|
136
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/2.1.0/changelog.html>`_.
|
137
137
|
|
@@ -23,7 +23,7 @@
|
|
23
23
|
|
24
24
|
Package ``apache-airflow-providers-fab``
|
25
25
|
|
26
|
-
Release: ``2.0
|
26
|
+
Release: ``2.1.0``
|
27
27
|
|
28
28
|
|
29
29
|
`Flask App Builder <https://flask-appbuilder.readthedocs.io/>`__
|
@@ -36,7 +36,7 @@ This is a provider package for ``fab`` provider. All classes for this provider p
|
|
36
36
|
are in ``airflow.providers.fab`` python package.
|
37
37
|
|
38
38
|
You can find package information and changelog for the provider
|
39
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/2.0
|
39
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/2.1.0/>`_.
|
40
40
|
|
41
41
|
Installation
|
42
42
|
------------
|
@@ -53,11 +53,11 @@ Requirements
|
|
53
53
|
========================================== ==================
|
54
54
|
PIP package Version required
|
55
55
|
========================================== ==================
|
56
|
-
``apache-airflow`` ``>=3.0.
|
56
|
+
``apache-airflow`` ``>=3.0.2``
|
57
57
|
``apache-airflow-providers-common-compat`` ``>=1.2.1``
|
58
58
|
``blinker`` ``>=1.6.2``
|
59
59
|
``flask`` ``>=2.2.1,<2.3``
|
60
|
-
``flask-appbuilder`` ``==4.
|
60
|
+
``flask-appbuilder`` ``==4.6.3``
|
61
61
|
``flask-login`` ``>=0.6.2``
|
62
62
|
``flask-session`` ``>=0.4.0,<0.6``
|
63
63
|
``flask-wtf`` ``>=1.1.0``
|
@@ -87,4 +87,4 @@ Dependent package
|
|
87
87
|
================================================================================================================== =================
|
88
88
|
|
89
89
|
The changelog for the provider package can be found in the
|
90
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/2.0
|
90
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/2.1.0/changelog.html>`_.
|
@@ -232,15 +232,15 @@ Here is an example of what you might have in your webserver_config.py:
|
|
232
232
|
|
233
233
|
.. code-block:: python
|
234
234
|
|
235
|
-
import os
|
236
|
-
import jwt
|
237
|
-
import requests
|
238
235
|
import logging
|
239
236
|
from base64 import b64decode
|
237
|
+
|
238
|
+
import jwt
|
239
|
+
import requests
|
240
240
|
from cryptography.hazmat.primitives import serialization
|
241
|
-
from flask_appbuilder.security.manager import
|
242
|
-
|
243
|
-
from airflow.
|
241
|
+
from flask_appbuilder.security.manager import AUTH_OAUTH
|
242
|
+
|
243
|
+
from airflow.providers.fab.auth_manager.security_manager.override import FabAirflowSecurityManagerOverride
|
244
244
|
|
245
245
|
log = logging.getLogger(__name__)
|
246
246
|
|
@@ -284,11 +284,11 @@ Here is an example of what you might have in your webserver_config.py:
|
|
284
284
|
public_key = serialization.load_der_public_key(key_der)
|
285
285
|
|
286
286
|
|
287
|
-
class CustomSecurityManager(
|
287
|
+
class CustomSecurityManager(FabAirflowSecurityManagerOverride):
|
288
288
|
def get_oauth_user_info(self, provider, response):
|
289
289
|
if provider == "keycloak":
|
290
290
|
token = response["access_token"]
|
291
|
-
me = jwt.decode(token, public_key, algorithms=["HS256", "RS256"])
|
291
|
+
me = jwt.decode(token, public_key, algorithms=["HS256", "RS256"], audience="account")
|
292
292
|
|
293
293
|
# Extract roles from resource access
|
294
294
|
realm_access = me.get("realm_access", {})
|
{apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/changelog.rst
RENAMED
@@ -20,6 +20,36 @@
|
|
20
20
|
Changelog
|
21
21
|
---------
|
22
22
|
|
23
|
+
2.1.0
|
24
|
+
.....
|
25
|
+
|
26
|
+
Features
|
27
|
+
~~~~~~~~
|
28
|
+
|
29
|
+
* ``Add back ProxyFix Middleware for flask app builder (#49942)``
|
30
|
+
* ``Move access_denied_message webserver config to fab (#50208)``
|
31
|
+
* ``Move webserver expose_hostname config to fab (#50269)``
|
32
|
+
|
33
|
+
Misc
|
34
|
+
~~~~
|
35
|
+
|
36
|
+
* ``Bump the fab-ui-package-updates group across 1 directory with 4 updates (#50312)``
|
37
|
+
* ``Bump the fab-ui-package-updates group across 1 directory with 4 updates (#50035)``
|
38
|
+
* ``Upgrade 'flask-appbuilder' to 4.6.3 in FAB provider (#50513)``
|
39
|
+
|
40
|
+
Doc-only
|
41
|
+
~~~~~~~~
|
42
|
+
|
43
|
+
* ``docs: Update oauth keycloak example with new security manager (#50284)``
|
44
|
+
* ``docs: conditionally render section‐move links in sections‐and‐options include (#50582)``
|
45
|
+
|
46
|
+
.. Below changes are excluded from the changelog. Move them to
|
47
|
+
appropriate section above if needed. Do not delete the lines(!):
|
48
|
+
* ``Update description of provider.yaml dependencies (#50231)``
|
49
|
+
* ``Avoid committing history for providers (#49907)``
|
50
|
+
* ``Fix main - Generate FAB assets (#50546)``
|
51
|
+
* ``Fix Fab docs (#50594)``
|
52
|
+
|
23
53
|
2.0.2
|
24
54
|
.....
|
25
55
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
.. Licensed to the Apache Software Foundation (ASF) under one
|
3
|
+
or more contributor license agreements. See the NOTICE file
|
4
|
+
distributed with this work for additional information
|
5
|
+
regarding copyright ownership. The ASF licenses this file
|
6
|
+
to you under the Apache License, Version 2.0 (the
|
7
|
+
"License"); you may not use this file except in compliance
|
8
|
+
with the License. You may obtain a copy of the License at
|
9
|
+
|
10
|
+
.. http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
|
12
|
+
.. Unless required by applicable law or agreed to in writing,
|
13
|
+
software distributed under the License is distributed on an
|
14
|
+
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
15
|
+
KIND, either express or implied. See the License for the
|
16
|
+
specific language governing permissions and limitations
|
17
|
+
under the License.
|
18
|
+
|
19
|
+
.. NOTE! THIS FILE IS AUTOMATICALLY GENERATED AND WILL BE OVERWRITTEN!
|
20
|
+
|
21
|
+
.. IF YOU WANT TO MODIFY THIS FILE, YOU SHOULD MODIFY THE TEMPLATE
|
22
|
+
`PROVIDER_COMMITS_TEMPLATE.rst.jinja2` IN the `dev/breeze/src/airflow_breeze/templates` DIRECTORY
|
23
|
+
|
24
|
+
.. THE REMAINDER OF THE FILE IS AUTOMATICALLY GENERATED. IT WILL BE OVERWRITTEN!
|
25
|
+
|
26
|
+
Package apache-airflow-providers-fab
|
27
|
+
------------------------------------------------------
|
28
|
+
|
29
|
+
`Flask App Builder <https://flask-appbuilder.readthedocs.io/>`__
|
30
|
+
|
31
|
+
|
32
|
+
This is detailed commit list of changes for versions provider package: ``fab``.
|
33
|
+
For high-level changelog, see :doc:`package information including changelog <index>`.
|
34
|
+
|
35
|
+
.. airflow-providers-commits::
|
{apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/docs/index.rst
RENAMED
@@ -84,7 +84,7 @@ apache-airflow-providers-fab package
|
|
84
84
|
`Flask App Builder <https://flask-appbuilder.readthedocs.io/>`__
|
85
85
|
|
86
86
|
|
87
|
-
Release: 2.0
|
87
|
+
Release: 2.1.0
|
88
88
|
|
89
89
|
Provider package
|
90
90
|
----------------
|
@@ -102,16 +102,16 @@ For the minimum Airflow version supported, see ``Requirements`` below.
|
|
102
102
|
Requirements
|
103
103
|
------------
|
104
104
|
|
105
|
-
The minimum Apache Airflow version supported by this provider distribution is ``3.0.
|
105
|
+
The minimum Apache Airflow version supported by this provider distribution is ``3.0.2``.
|
106
106
|
|
107
107
|
========================================== ==================
|
108
108
|
PIP package Version required
|
109
109
|
========================================== ==================
|
110
|
-
``apache-airflow`` ``>=3.0.
|
110
|
+
``apache-airflow`` ``>=3.0.2``
|
111
111
|
``apache-airflow-providers-common-compat`` ``>=1.2.1``
|
112
112
|
``blinker`` ``>=1.6.2``
|
113
113
|
``flask`` ``>=2.2.1,<2.3``
|
114
|
-
``flask-appbuilder`` ``==4.
|
114
|
+
``flask-appbuilder`` ``==4.6.3``
|
115
115
|
``flask-login`` ``>=0.6.2``
|
116
116
|
``flask-session`` ``>=0.4.0,<0.6``
|
117
117
|
``flask-wtf`` ``>=1.1.0``
|
@@ -146,5 +146,5 @@ Downloading official packages
|
|
146
146
|
You can download officially released packages and verify their checksums and signatures from the
|
147
147
|
`Official Apache Download site <https://downloads.apache.org/airflow/providers/>`_
|
148
148
|
|
149
|
-
* `The apache-airflow-providers-fab 2.0
|
150
|
-
* `The apache-airflow-providers-fab 2.0
|
149
|
+
* `The apache-airflow-providers-fab 2.1.0 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_fab-2.1.0.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_fab-2.1.0.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_fab-2.1.0.tar.gz.sha512>`__)
|
150
|
+
* `The apache-airflow-providers-fab 2.1.0 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_fab-2.1.0-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_fab-2.1.0-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_fab-2.1.0-py3-none-any.whl.sha512>`__)
|
{apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/provider.yaml
RENAMED
@@ -28,10 +28,14 @@ description: |
|
|
28
28
|
# For providers until we think it should be released.
|
29
29
|
state: ready
|
30
30
|
|
31
|
-
source-date-epoch:
|
31
|
+
source-date-epoch: 1747132761
|
32
32
|
|
33
|
-
#
|
33
|
+
# Note that those versions are maintained by release manager - do not update them manually
|
34
|
+
# with the exception of case where other provider in sources has >= new provider version.
|
35
|
+
# In such case adding >= NEW_VERSION and bumping to NEW_VERSION in a provider have
|
36
|
+
# to be done in the same PR
|
34
37
|
versions:
|
38
|
+
- 2.1.0
|
35
39
|
- 2.0.2
|
36
40
|
- 2.0.1
|
37
41
|
- 2.0.0
|
@@ -56,6 +60,20 @@ config:
|
|
56
60
|
fab:
|
57
61
|
description: This section contains configs specific to FAB provider.
|
58
62
|
options:
|
63
|
+
access_denied_message:
|
64
|
+
description: |
|
65
|
+
The message displayed when a user attempts to execute actions beyond their authorised privileges.
|
66
|
+
version_added: 2.1.0
|
67
|
+
type: string
|
68
|
+
example: ~
|
69
|
+
default: "Access is Denied"
|
70
|
+
expose_hostname:
|
71
|
+
description: |
|
72
|
+
Expose hostname in the web server
|
73
|
+
version_added: 2.1.0
|
74
|
+
type: string
|
75
|
+
example: ~
|
76
|
+
default: "False"
|
59
77
|
auth_rate_limited:
|
60
78
|
description: |
|
61
79
|
Boolean for enabling rate limiting on authentication endpoints.
|
@@ -119,6 +137,58 @@ config:
|
|
119
137
|
type: integer
|
120
138
|
example: ~
|
121
139
|
default: "43200"
|
140
|
+
enable_proxy_fix:
|
141
|
+
description: |
|
142
|
+
Enable werkzeug ``ProxyFix`` middleware for reverse proxy
|
143
|
+
version_added: 2.1.0
|
144
|
+
type: boolean
|
145
|
+
example: ~
|
146
|
+
default: "False"
|
147
|
+
proxy_fix_x_for:
|
148
|
+
description: |
|
149
|
+
Number of values to trust for ``X-Forwarded-For``.
|
150
|
+
See `Werkzeug: X-Forwarded-For Proxy Fix
|
151
|
+
<https://werkzeug.palletsprojects.com/en/2.3.x/middleware/proxy_fix/>`__ for more details.
|
152
|
+
version_added: 2.1.0
|
153
|
+
type: integer
|
154
|
+
example: ~
|
155
|
+
default: "1"
|
156
|
+
proxy_fix_x_proto:
|
157
|
+
description: |
|
158
|
+
Number of values to trust for ``X-Forwarded-Proto``.
|
159
|
+
See `Werkzeug: X-Forwarded-For Proxy Fix
|
160
|
+
<https://werkzeug.palletsprojects.com/en/2.3.x/middleware/proxy_fix/>`__ for more details.
|
161
|
+
version_added: 2.1.0
|
162
|
+
type: integer
|
163
|
+
example: ~
|
164
|
+
default: "1"
|
165
|
+
proxy_fix_x_host:
|
166
|
+
description: |
|
167
|
+
Number of values to trust for ``X-Forwarded-Host``.
|
168
|
+
See `Werkzeug: X-Forwarded-For Proxy Fix
|
169
|
+
<https://werkzeug.palletsprojects.com/en/2.3.x/middleware/proxy_fix/>`__ for more details.
|
170
|
+
version_added: 2.1.0
|
171
|
+
type: integer
|
172
|
+
example: ~
|
173
|
+
default: "1"
|
174
|
+
proxy_fix_x_port:
|
175
|
+
description: |
|
176
|
+
Number of values to trust for ``X-Forwarded-Port``.
|
177
|
+
See `Werkzeug: X-Forwarded-For Proxy Fix
|
178
|
+
<https://werkzeug.palletsprojects.com/en/2.3.x/middleware/proxy_fix/>`__ for more details.
|
179
|
+
version_added: 2.1.0
|
180
|
+
type: integer
|
181
|
+
example: ~
|
182
|
+
default: "1"
|
183
|
+
proxy_fix_x_prefix:
|
184
|
+
description: |
|
185
|
+
Number of values to trust for ``X-Forwarded-Prefix``.
|
186
|
+
See `Werkzeug: X-Forwarded-For Proxy Fix
|
187
|
+
<https://werkzeug.palletsprojects.com/en/2.3.x/middleware/proxy_fix/>`__ for more details.
|
188
|
+
version_added: 2.1.0
|
189
|
+
type: integer
|
190
|
+
example: ~
|
191
|
+
default: "1"
|
122
192
|
|
123
193
|
auth-managers:
|
124
194
|
- airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager
|
{apache_airflow_providers_fab-2.0.2rc2 → apache_airflow_providers_fab-2.1.0rc1}/pyproject.toml
RENAMED
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
|
|
25
25
|
|
26
26
|
[project]
|
27
27
|
name = "apache-airflow-providers-fab"
|
28
|
-
version = "2.
|
28
|
+
version = "2.1.0rc1"
|
29
29
|
description = "Provider package apache-airflow-providers-fab for Apache Airflow"
|
30
30
|
readme = "README.rst"
|
31
31
|
authors = [
|
@@ -57,7 +57,7 @@ license-files = ["NOTICE", "*/LICENSE*"]
|
|
57
57
|
# Make sure to run ``breeze static-checks --type update-providers-dependencies --all-files``
|
58
58
|
# After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
|
59
59
|
dependencies = [
|
60
|
-
"apache-airflow>=3.0.
|
60
|
+
"apache-airflow>=3.0.2rc1",
|
61
61
|
"apache-airflow-providers-common-compat>=1.2.1rc1",
|
62
62
|
# Blinker use for signals in Flask, this is an optional dependency in Flask 2.2 and lower.
|
63
63
|
# In Flask 2.3 it becomes a mandatory dependency, and flask signals are always available.
|
@@ -71,7 +71,7 @@ dependencies = [
|
|
71
71
|
# Every time we update FAB version here, please make sure that you review the classes and models in
|
72
72
|
# `airflow/providers/fab/auth_manager/security_manager/override.py` with their upstream counterparts.
|
73
73
|
# In particular, make sure any breaking changes, for example any new methods, are accounted for.
|
74
|
-
"flask-appbuilder==4.
|
74
|
+
"flask-appbuilder==4.6.3",
|
75
75
|
"flask-login>=0.6.2",
|
76
76
|
# Flask-Session 0.6 add new arguments into the SqlAlchemySessionInterface constructor as well as
|
77
77
|
# all parameters now are mandatory which make AirflowDatabaseSessionInterface incompatible with this version.
|
@@ -127,8 +127,8 @@ apache-airflow-providers-common-sql = {workspace = true}
|
|
127
127
|
apache-airflow-providers-standard = {workspace = true}
|
128
128
|
|
129
129
|
[project.urls]
|
130
|
-
"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-fab/2.0
|
131
|
-
"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-fab/2.0
|
130
|
+
"Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-fab/2.1.0"
|
131
|
+
"Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-fab/2.1.0/changelog.html"
|
132
132
|
"Bug Tracker" = "https://github.com/apache/airflow/issues"
|
133
133
|
"Source Code" = "https://github.com/apache/airflow"
|
134
134
|
"Slack Chat" = "https://s.apache.org/airflow-slack"
|
@@ -29,11 +29,11 @@ from airflow import __version__ as airflow_version
|
|
29
29
|
|
30
30
|
__all__ = ["__version__"]
|
31
31
|
|
32
|
-
__version__ = "2.0
|
32
|
+
__version__ = "2.1.0"
|
33
33
|
|
34
34
|
if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
|
35
|
-
"3.0.
|
35
|
+
"3.0.2"
|
36
36
|
):
|
37
37
|
raise RuntimeError(
|
38
|
-
f"The package `apache-airflow-providers-fab:{__version__}` needs Apache Airflow 3.0.
|
38
|
+
f"The package `apache-airflow-providers-fab:{__version__}` needs Apache Airflow 3.0.2+"
|
39
39
|
)
|
@@ -123,6 +123,8 @@ def patch_role(*, role_name: str, update_mask: UpdateMask = None) -> APIResponse
|
|
123
123
|
"""Update a role."""
|
124
124
|
security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
|
125
125
|
body = request.json
|
126
|
+
if body is None:
|
127
|
+
raise BadRequest("Request body is required")
|
126
128
|
try:
|
127
129
|
data = role_schema.load(body)
|
128
130
|
except ValidationError as err:
|
@@ -156,6 +158,8 @@ def post_role() -> APIResponse:
|
|
156
158
|
"""Create a new role."""
|
157
159
|
security_manager = cast("FabAuthManager", get_auth_manager()).security_manager
|
158
160
|
body = request.json
|
161
|
+
if body is None:
|
162
|
+
raise BadRequest("Request body is required")
|
159
163
|
try:
|
160
164
|
data = role_schema.load(body)
|
161
165
|
except ValidationError as err:
|
@@ -88,6 +88,8 @@ def get_users(*, limit: int, order_by: str = "id", offset: str | None = None) ->
|
|
88
88
|
@requires_access_custom_view("POST", permissions.RESOURCE_USER)
|
89
89
|
def post_user() -> APIResponse:
|
90
90
|
"""Create a new user."""
|
91
|
+
if request.json is None:
|
92
|
+
raise BadRequest("Request body is required")
|
91
93
|
try:
|
92
94
|
data = user_schema.load(request.json)
|
93
95
|
except ValidationError as e:
|
@@ -131,6 +133,8 @@ def post_user() -> APIResponse:
|
|
131
133
|
@requires_access_custom_view("PUT", permissions.RESOURCE_USER)
|
132
134
|
def patch_user(*, username: str, update_mask: UpdateMask = None) -> APIResponse:
|
133
135
|
"""Update a user."""
|
136
|
+
if request.json is None:
|
137
|
+
raise BadRequest("Request body is required")
|
134
138
|
try:
|
135
139
|
data = user_schema.load(request.json)
|
136
140
|
except ValidationError as e:
|
@@ -102,11 +102,37 @@ assoc_permission_role = Table(
|
|
102
102
|
"ab_permission_view_role",
|
103
103
|
Model.metadata,
|
104
104
|
Column("id", Integer, primary_key=True),
|
105
|
-
Column(
|
106
|
-
|
105
|
+
Column(
|
106
|
+
"permission_view_id",
|
107
|
+
Integer,
|
108
|
+
ForeignKey("ab_permission_view.id", ondelete="CASCADE"),
|
109
|
+
),
|
110
|
+
Column("role_id", Integer, ForeignKey("ab_role.id", ondelete="CASCADE")),
|
107
111
|
UniqueConstraint("permission_view_id", "role_id"),
|
108
112
|
)
|
109
113
|
|
114
|
+
assoc_user_group = Table(
|
115
|
+
"ab_user_group",
|
116
|
+
Model.metadata,
|
117
|
+
Column("id", Integer, primary_key=True),
|
118
|
+
Column("user_id", Integer, ForeignKey("ab_user.id", ondelete="CASCADE")),
|
119
|
+
Column("group_id", Integer, ForeignKey("ab_group.id", ondelete="CASCADE")),
|
120
|
+
UniqueConstraint("user_id", "group_id"),
|
121
|
+
Index("idx_user_id", "user_id"),
|
122
|
+
Index("idx_user_group_id", "group_id"),
|
123
|
+
)
|
124
|
+
|
125
|
+
assoc_group_role = Table(
|
126
|
+
"ab_group_role",
|
127
|
+
Model.metadata,
|
128
|
+
Column("id", Integer, primary_key=True),
|
129
|
+
Column("group_id", Integer, ForeignKey("ab_group.id", ondelete="CASCADE")),
|
130
|
+
Column("role_id", Integer, ForeignKey("ab_role.id", ondelete="CASCADE")),
|
131
|
+
UniqueConstraint("group_id", "role_id"),
|
132
|
+
Index("idx_group_id", "group_id"),
|
133
|
+
Index("idx_group_role_id", "role_id"),
|
134
|
+
)
|
135
|
+
|
110
136
|
|
111
137
|
class Role(Model):
|
112
138
|
"""Represents a user role to which permissions can be assigned."""
|
@@ -115,7 +141,29 @@ class Role(Model):
|
|
115
141
|
|
116
142
|
id = Column(Integer, primary_key=True)
|
117
143
|
name = Column(String(64), unique=True, nullable=False)
|
118
|
-
permissions = relationship(
|
144
|
+
permissions = relationship(
|
145
|
+
"Permission",
|
146
|
+
secondary=assoc_permission_role,
|
147
|
+
backref="role",
|
148
|
+
lazy="joined",
|
149
|
+
passive_deletes=True,
|
150
|
+
)
|
151
|
+
|
152
|
+
def __repr__(self):
|
153
|
+
return self.name
|
154
|
+
|
155
|
+
|
156
|
+
class Group(Model):
|
157
|
+
"""Represents a user group."""
|
158
|
+
|
159
|
+
__tablename__ = "ab_group"
|
160
|
+
|
161
|
+
id = Column(Integer, primary_key=True)
|
162
|
+
name = Column(String(100), unique=True, nullable=False)
|
163
|
+
label = Column(String(150))
|
164
|
+
description = Column(String(512))
|
165
|
+
users = relationship("User", secondary=assoc_user_group, backref="groups", passive_deletes=True)
|
166
|
+
roles = relationship("Role", secondary=assoc_group_role, backref="groups", passive_deletes=True)
|
119
167
|
|
120
168
|
def __repr__(self):
|
121
169
|
return self.name
|
@@ -148,8 +196,8 @@ assoc_user_role = Table(
|
|
148
196
|
"ab_user_role",
|
149
197
|
Model.metadata,
|
150
198
|
Column("id", Integer, primary_key=True),
|
151
|
-
Column("user_id", Integer, ForeignKey("ab_user.id")),
|
152
|
-
Column("role_id", Integer, ForeignKey("ab_role.id")),
|
199
|
+
Column("user_id", Integer, ForeignKey("ab_user.id", ondelete="CASCADE")),
|
200
|
+
Column("role_id", Integer, ForeignKey("ab_role.id", ondelete="CASCADE")),
|
153
201
|
UniqueConstraint("user_id", "role_id"),
|
154
202
|
)
|
155
203
|
|
@@ -170,7 +218,9 @@ class User(Model, BaseUser):
|
|
170
218
|
last_login = Column(DateTime)
|
171
219
|
login_count = Column(Integer)
|
172
220
|
fail_login_count = Column(Integer)
|
173
|
-
roles = relationship(
|
221
|
+
roles = relationship(
|
222
|
+
"Role", secondary=assoc_user_role, backref="user", lazy="selectin", passive_deletes=True
|
223
|
+
)
|
174
224
|
created_on = Column(DateTime, default=datetime.datetime.now, nullable=True)
|
175
225
|
changed_on = Column(DateTime, default=datetime.datetime.now, nullable=True)
|
176
226
|
|
@@ -37,13 +37,17 @@ class AnonymousUser(AnonymousUserMixin, BaseUser):
|
|
37
37
|
if not self._roles:
|
38
38
|
public_role = current_app.config.get("AUTH_ROLE_PUBLIC", None)
|
39
39
|
self._roles = {current_app.appbuilder.sm.find_role(public_role)} if public_role else set()
|
40
|
-
return self._roles
|
40
|
+
return list(self._roles)
|
41
41
|
|
42
42
|
@roles.setter
|
43
43
|
def roles(self, roles):
|
44
44
|
self._roles = roles
|
45
45
|
self._perms = set()
|
46
46
|
|
47
|
+
@property
|
48
|
+
def groups(self):
|
49
|
+
return []
|
50
|
+
|
47
51
|
@property
|
48
52
|
def perms(self):
|
49
53
|
if not self._perms:
|