oxutils 0.4.2__tar.gz → 0.4.3__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.
- {oxutils-0.4.2 → oxutils-0.4.3}/PKG-INFO +1 -1
- {oxutils-0.4.2 → oxutils-0.4.3}/pyproject.toml +1 -1
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/__init__.py +1 -1
- oxutils-0.4.3/src/oxutils/permissions/__init__.py +1 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/checks.py +36 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/perms.py +58 -0
- oxutils-0.4.2/src/oxutils/users/migrations/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/README.md +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/apps.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/audit/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/audit/apps.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/audit/export.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/audit/locale/fr/LC_MESSAGES/django.po +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/audit/masks.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/audit/migrations/0001_initial.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/audit/migrations/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/audit/models.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/audit/settings.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/audit/utils.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/adapter.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/admin.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/app_settings.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/apps.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/constants.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/controllers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/emails/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/emails/controllers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/emails/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/emails/services.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/exceptions.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/invitations/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/invitations/backend.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/invitations/controllers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/invitations/models.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/invitations/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/invitations/tokens.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/adapter.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/base/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/base/controllers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/base/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/recovery_codes/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/recovery_codes/controllers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/recovery_codes/flows.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/recovery_codes/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/recovery_codes/services.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/totp/__ini__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/totp/controllers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/totp/flows.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/totp/permissions.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/totp/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/totp/services.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mfa/utils.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/migrations/0001_initial.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/migrations/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/mixins.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/models.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/password_reset/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/password_reset/controllers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/password_reset/models.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/password_reset/permissions.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/password_reset/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/registration/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/registration/controllers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/registration/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/sessions/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/sessions/controllers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/sessions/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/signals.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/templatetags/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/templatetags/spa_urls.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/tokens/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/tokens/app_settings.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/tokens/models.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/tokens/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/tokens/tokens.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/tokens/utils.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/auth/utils.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/celery/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/celery/base.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/celery/settings.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/conf.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/constants.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/context/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/context/site_name_processor.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/admin.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/apps.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/caches.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/controllers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/enums.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/management/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/management/commands/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/management/commands/sync_currency.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/migrations/0001_initial.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/migrations/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/models.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/signals.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/tests.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/currency/utils.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/enums/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/enums/audit.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/enums/invoices.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/exceptions.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/functions.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/jwt/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/jwt/auth.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/jwt/middleware.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/jwt/models.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/jwt/tokens.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/jwt/utils.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/logger/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/logger/receivers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/logger/settings.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/mixins/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/mixins/base.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/mixins/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/mixins/services.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/models/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/models/base.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/models/billing.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/models/change_tracker.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/models/fields.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/models/invoice.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/admin.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/apps.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/authorization.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/cacheops.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/caches.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/checks.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/constants.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/context.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/controllers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/enums.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/exceptions.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/locale/fr/LC_MESSAGES/django.po +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/management/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/management/commands/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/management/commands/grant_tenant_owners.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/management/commands/init_oxiliere_system.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/middleware.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/migrations/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/models.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/permissions.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/services.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/settings.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/signals.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/tests.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/utils.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/pagination/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/pagination/cursor.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/pdf/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/pdf/printer.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/pdf/utils.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/pdf/views.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/actions.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/admin.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/apps.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/caches.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/constants.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/controllers.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/exceptions.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/locale/fr/LC_MESSAGES/django.po +0 -0
- {oxutils-0.4.2/src/oxutils/permissions → oxutils-0.4.3/src/oxutils/permissions/management}/__init__.py +0 -0
- {oxutils-0.4.2/src/oxutils/permissions/management → oxutils-0.4.3/src/oxutils/permissions/management/commands}/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/management/commands/load_permission_preset.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/migrations/0001_initial.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/migrations/0002_alter_grant_role.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/migrations/0003_alter_grant_options_alter_group_options_and_more.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/migrations/0004_group_app_group_permissions_app_9a9924_idx.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/migrations/0005_role_app.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/migrations/0006_alter_rolegrant_options_and_more.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/migrations/0007_grant_locked_alter_grant_role_and_more.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/migrations/0008_remove_grant_unique_user_scope_role_and_more.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/migrations/0009_grant_is_active.py +0 -0
- {oxutils-0.4.2/src/oxutils/permissions/management/commands → oxutils-0.4.3/src/oxutils/permissions/migrations}/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/models.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/queryset.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/schemas.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/services.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/tests.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/permissions/utils.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/py.typed +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/s3.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/settings.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/templates/account/email/base_message.txt +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/templates/email/password/reset_email_message.html +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/templates/email/password/reset_email_message.txt +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/templates/email/password/reset_email_subject.txt +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/templates/email/signup/email_message.html +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/templates/email/signup/email_subject.txt +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/templates/verified.html +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/types.py +0 -0
- {oxutils-0.4.2/src/oxutils/permissions/migrations → oxutils-0.4.3/src/oxutils/users}/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/users/admin.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/users/apps.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/users/locale/fr/LC_MESSAGES/django.po +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/users/migrations/0001_initial.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/users/migrations/0002_alter_user_first_name_alter_user_last_name.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/users/migrations/0003_user_photo.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/users/migrations/0004_alter_user_options.py +0 -0
- {oxutils-0.4.2/src/oxutils/users → oxutils-0.4.3/src/oxutils/users/migrations}/__init__.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/users/models.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/users/tests.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/users/utils.py +0 -0
- {oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/utils.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -291,4 +291,40 @@ def check_permission_settings(app_configs, **kwargs):
|
|
|
291
291
|
)
|
|
292
292
|
)
|
|
293
293
|
|
|
294
|
+
# Validate EXTRA_PERMISSIONS
|
|
295
|
+
if hasattr(settings, 'EXTRA_PERMISSIONS'):
|
|
296
|
+
extra = settings.EXTRA_PERMISSIONS
|
|
297
|
+
if not isinstance(extra, (list, tuple)):
|
|
298
|
+
errors.append(
|
|
299
|
+
Error(
|
|
300
|
+
'EXTRA_PERMISSIONS must be a list or tuple',
|
|
301
|
+
hint='Set EXTRA_PERMISSIONS = ["dotted.path.ToPermission", ...]',
|
|
302
|
+
id='permissions.E019',
|
|
303
|
+
)
|
|
304
|
+
)
|
|
305
|
+
else:
|
|
306
|
+
from django.utils.module_loading import import_string
|
|
307
|
+
|
|
308
|
+
for path in extra:
|
|
309
|
+
if not isinstance(path, str):
|
|
310
|
+
errors.append(
|
|
311
|
+
Error(
|
|
312
|
+
f'Each entry in EXTRA_PERMISSIONS must be a string, got {type(path).__name__}',
|
|
313
|
+
hint='Use dotted paths like "myapp.permissions.MyPermission"',
|
|
314
|
+
id='permissions.E020',
|
|
315
|
+
)
|
|
316
|
+
)
|
|
317
|
+
continue
|
|
318
|
+
try:
|
|
319
|
+
cls = import_string(path)
|
|
320
|
+
except ImportError:
|
|
321
|
+
errors.append(
|
|
322
|
+
Error(
|
|
323
|
+
f'Cannot import "{path}" from EXTRA_PERMISSIONS',
|
|
324
|
+
hint='Check that the module and class exist',
|
|
325
|
+
id='permissions.E021',
|
|
326
|
+
)
|
|
327
|
+
)
|
|
328
|
+
continue
|
|
329
|
+
|
|
294
330
|
return errors
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
from functools import lru_cache
|
|
1
2
|
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from django.conf import settings
|
|
4
5
|
from django.core.exceptions import ImproperlyConfigured
|
|
5
6
|
from django.http import HttpRequest
|
|
7
|
+
from django.utils.module_loading import import_string
|
|
6
8
|
from ninja_extra.controllers import ControllerBase
|
|
7
9
|
from ninja_extra.permissions import BasePermission
|
|
8
10
|
|
|
@@ -199,3 +201,59 @@ def access_manager(actions: str):
|
|
|
199
201
|
)
|
|
200
202
|
|
|
201
203
|
return ScopePermission(perm, context)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
@lru_cache(maxsize=1)
|
|
207
|
+
def extra_permissions():
|
|
208
|
+
"""
|
|
209
|
+
Return the list of permission instances defined in
|
|
210
|
+
``EXTRA_PERMISSIONS`` (settings.py).
|
|
211
|
+
|
|
212
|
+
Each entry is a dotted path to an **already instantiated** permission
|
|
213
|
+
object (e.g. a module-level singleton). The object is imported via
|
|
214
|
+
:func:`django.utils.module_loading.import_string` and returned as-is.
|
|
215
|
+
|
|
216
|
+
The result is cached via :func:`functools.lru_cache` so that
|
|
217
|
+
``import_string`` is only called once per process.
|
|
218
|
+
|
|
219
|
+
Example::
|
|
220
|
+
|
|
221
|
+
# myapp/permissions.py
|
|
222
|
+
from ninja_extra.permissions import BasePermission
|
|
223
|
+
|
|
224
|
+
class IsPremium(BasePermission):
|
|
225
|
+
def has_permission(self, request, controller):
|
|
226
|
+
return request.user.is_premium
|
|
227
|
+
|
|
228
|
+
IsPremium = IsPremium() # <-- singleton instance
|
|
229
|
+
|
|
230
|
+
# settings.py
|
|
231
|
+
EXTRA_PERMISSIONS = [
|
|
232
|
+
"myapp.permissions.IsPremium",
|
|
233
|
+
]
|
|
234
|
+
|
|
235
|
+
# controller
|
|
236
|
+
from oxutils.permissions import extra_permissions
|
|
237
|
+
|
|
238
|
+
@api_controller(
|
|
239
|
+
"/api",
|
|
240
|
+
permissions=[*extra_permissions(), ScopePermission("articles:r")],
|
|
241
|
+
)
|
|
242
|
+
class MyController:
|
|
243
|
+
...
|
|
244
|
+
"""
|
|
245
|
+
paths = getattr(settings, "EXTRA_PERMISSIONS", [])
|
|
246
|
+
if not isinstance(paths, (list, tuple)):
|
|
247
|
+
raise ImproperlyConfigured(
|
|
248
|
+
"EXTRA_PERMISSIONS must be a list or tuple of dotted paths."
|
|
249
|
+
)
|
|
250
|
+
instances = []
|
|
251
|
+
for path in paths:
|
|
252
|
+
try:
|
|
253
|
+
instance = import_string(path)
|
|
254
|
+
except ImportError as exc:
|
|
255
|
+
raise ImproperlyConfigured(
|
|
256
|
+
f"Cannot import permission from EXTRA_PERMISSIONS: {path}"
|
|
257
|
+
) from exc
|
|
258
|
+
instances.append(instance)
|
|
259
|
+
return instances
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/management/commands/grant_tenant_owners.py
RENAMED
|
File without changes
|
{oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/oxiliere/management/commands/init_oxiliere_system.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/templates/email/password/reset_email_message.html
RENAMED
|
File without changes
|
{oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/templates/email/password/reset_email_message.txt
RENAMED
|
File without changes
|
{oxutils-0.4.2 → oxutils-0.4.3}/src/oxutils/templates/email/password/reset_email_subject.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{oxutils-0.4.2/src/oxutils/permissions/migrations → oxutils-0.4.3/src/oxutils/users}/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|