django-pfx 1.7.6.dev9__tar.gz → 1.7.6.dev13__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.
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/PKG-INFO +1 -1
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/django_pfx.egg-info/PKG-INFO +1 -1
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/django_pfx.egg-info/SOURCES.txt +1 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/django_pfx.egg-info/scm_file_list.json +1 -0
- django_pfx-1.7.6.dev13/django_pfx.egg-info/scm_version.json +8 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +4 -4
- django_pfx-1.7.6.dev13/pfx/pfxcore/middleware/ws_cookie_authentication_middleware.py +60 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/media_rest_view_mixin.py +3 -2
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/__init__.py +1 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/basic_api_test.py +35 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_user_job_api.py +1 -1
- django_pfx-1.7.6.dev13/tests/tests/test_ws_cookie_middleware.py +30 -0
- django_pfx-1.7.6.dev9/django_pfx.egg-info/scm_version.json +0 -8
- django_pfx-1.7.6.dev9/pfx/pfxcore/middleware/ws_cookie_authentication_middleware.py +0 -35
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/.gitignore +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/.gitlab-ci.yml +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/.pre-commit-config.yaml +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/LICENSE +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/MANIFEST.in +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/README.md +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/django_pfx.egg-info/dependency_links.txt +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/django_pfx.egg-info/requires.txt +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/django_pfx.egg-info/top_level.txt +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/Makefile +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/conf.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/index.rst +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/api.views.rst +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/authentication.md +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/decorator.md +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/generate_openapi.md +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/getting_started.md +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/internationalisation.md +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/model.md +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/pfx_views.md +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/profiling.md +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/settings.md +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/testing.md +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/user_jobs.md +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/img/pfx.png +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/img/pfx.svg +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/make_messages +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/manage.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/apps.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/email_backend/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/email_backend/q_mailjet_email_backend.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/exceptions.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/mailjet/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/mailjet/mailjet.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/mailjet/message_result.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/0002_alter_email_headers.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/0003_alter_email_options.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/0004_alter_email_mail_from.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/models/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/models/email.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/providers/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/providers/email_django_q_executor.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/shortcuts.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/tasks.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/templates/emails/base_template.html +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/templates/emails/base_template.txt +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/templates/emails/base_template_subject.txt +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/urls.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/views/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/views/email_rest_view.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/apidoc/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/apidoc/parameters.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/apidoc/schema.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/apidoc/tags.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/apps.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/decorator/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/decorator/rest.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/default_settings.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/exceptions.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/fields/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/fields/decimal_field.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/fields/media_field.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/fields/rich_text_field.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/http/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/http/json_response.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/management/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/management/commands/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/management/commands/profile.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/mfa/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/mfa/authenticator.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/mfa/base.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/mfa/email.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/mfa/legacy.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/mfa/sms.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/middleware/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/middleware/authentication.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/middleware/locale.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/middleware/profiling.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/middleware/request_too_big_middleware.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0004_alter_loginban_failed_counter_and_more.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0005_mfadevice_mfadevice_mfa_device_unique_backend.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0006_alter_pfxuser_managers.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0007_alter_pfxuser_options.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/attachment_mixin.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/cache_mixins.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/login_ban.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/mfa_device.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/mfa_user_mixin.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/not_null_fields.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/pfx_models.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/pfx_user.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/serializers/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/serializers/json.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/settings.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/shortcuts.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/sms/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/sms/backends/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/sms/backends/base.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/sms/backends/console.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/storage/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/storage/exceptions.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/storage/local_storage.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/storage/s3_storage.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/test.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/urls.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/version_check.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/authentication_views.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/fields.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/filters_views.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/locale_views.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/mfa_authentication_views.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/date_format.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/groups.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/list_count.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/list_items.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/list_order.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/list_search.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/subset.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/rest_views.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/settings/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/settings/dev.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/apps.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/locale/fr/LC_MESSAGES/django.mo +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/locale/fr/LC_MESSAGES/django.po +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/migrations/0002_alter_userjob_options_alter_userjob_auto_queued_and_more.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/migrations/0003_clean_scheduled_tasks.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/migrations/0004_userjob_summary_url.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/migrations/0005_swappable_user_job.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/models/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/models/user_job.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/models/user_job_attachment.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/providers/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/providers/user_job_django_q_executor.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/providers/user_job_websocket_channel_provider.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/tasks.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/urls.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/views/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/views/user_job_attachment_view.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/views/user_job_view.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/views/user_websocket_consumer.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pyproject.toml +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/requirements.txt +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/serve-doc +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/setup.cfg +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/setup.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/apps.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/channel_group_send_calls.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/mfa_urls.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/models.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/settings/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/settings/ci.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/settings/common.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/settings/dev.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/settings/dev_default.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/basic_api_errors.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/mfa_test_utils.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_api_doc.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_api_doc_search.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_auth_api.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_body_mixin.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_cache.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_client.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_emails_email_api.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_emails_email_model.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_emails_q_mailjet_email_backend.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_emails_send_email_message.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_choices.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_date.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_decimal.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_minutes_duration.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_one2many.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_rich_text.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_time.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_filters.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_locale_api.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_mfa_legacy.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_mfa_login_api.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_mfa_setup_api.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_perm_tests.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_permissions.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_perms_api.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_post_migrate_groups_update.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_profiling_middleware.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_settings.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_shortcuts.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_timezone_middleware.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_tools.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_user_job_messages.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_user_job_model.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_user_queryset.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_user_websocket.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_version_check.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_view_decorators.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_view_fields.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/urls.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/views.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/settings/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/settings/ci.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/settings/common.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/settings/dev.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/settings/dev_default.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/tests/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/tests/test_api.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/tests/test_auth_api.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/urls.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/views.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/models.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/settings/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/settings/ci.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/settings/common.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/settings/dev.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/settings/dev_default.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/tests/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/tests/test_api.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/tests/test_auth_api.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/urls.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/views.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/models.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/providers.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/scope.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/settings/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/settings/ci.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/settings/common.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/settings/dev.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/settings/dev_default.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/tests/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/tests/test_user_job.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/urls.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/models.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/settings/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/settings/ci.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/settings/common.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/settings/dev.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/settings/dev_default.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/tests/__init__.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/tests/test_api.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/tests/test_auth_api.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/urls.py +0 -0
- {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/views.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-pfx
|
|
3
|
-
Version: 1.7.6.
|
|
3
|
+
Version: 1.7.6.dev13
|
|
4
4
|
Summary: Django PFX is a toolkit designed to streamline the development of RESTful APIs using the Django framework.
|
|
5
5
|
Author: Hervé Martinet
|
|
6
6
|
Author-email: herve.martinet@gmail.com
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-pfx
|
|
3
|
-
Version: 1.7.6.
|
|
3
|
+
Version: 1.7.6.dev13
|
|
4
4
|
Summary: Django PFX is a toolkit designed to streamline the development of RESTful APIs using the Django framework.
|
|
5
5
|
Author: Hervé Martinet
|
|
6
6
|
Author-email: herve.martinet@gmail.com
|
|
@@ -250,6 +250,7 @@ tests/tests/test_user_websocket.py
|
|
|
250
250
|
tests/tests/test_version_check.py
|
|
251
251
|
tests/tests/test_view_decorators.py
|
|
252
252
|
tests/tests/test_view_fields.py
|
|
253
|
+
tests/tests/test_ws_cookie_middleware.py
|
|
253
254
|
tests_base_user/__init__.py
|
|
254
255
|
tests_base_user/urls.py
|
|
255
256
|
tests_base_user/views.py
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po
RENAMED
|
@@ -7,7 +7,7 @@ msgid ""
|
|
|
7
7
|
msgstr ""
|
|
8
8
|
"Project-Id-Version: \n"
|
|
9
9
|
"Report-Msgid-Bugs-To: \n"
|
|
10
|
-
"POT-Creation-Date: 2026-
|
|
10
|
+
"POT-Creation-Date: 2026-09-24 07:09+0200\n"
|
|
11
11
|
"PO-Revision-Date: 2021-06-22 23:31+0200\n"
|
|
12
12
|
"Last-Translator: \n"
|
|
13
13
|
"Language-Team: \n"
|
|
@@ -206,8 +206,8 @@ msgid ""
|
|
|
206
206
|
"You’re receiving this email because you requested an authentication code at "
|
|
207
207
|
"%(site_name)s."
|
|
208
208
|
msgstr ""
|
|
209
|
-
"Vous recevez cet e-mail parce que vous avez demandé un code
|
|
210
|
-
"sur %(site_name)s."
|
|
209
|
+
"Vous recevez cet e-mail parce que vous avez demandé un code "
|
|
210
|
+
"d’authentification sur %(site_name)s."
|
|
211
211
|
|
|
212
212
|
#: templates/registration/otp_code_email.txt:4
|
|
213
213
|
msgid "Authentication code:"
|
|
@@ -323,7 +323,7 @@ msgstr ""
|
|
|
323
323
|
msgid "Invalid value for {filter} filter"
|
|
324
324
|
msgstr "Valeur invalide pour le filtre {filter}"
|
|
325
325
|
|
|
326
|
-
#: views/media_rest_view_mixin.py:
|
|
326
|
+
#: views/media_rest_view_mixin.py:38 views/media_rest_view_mixin.py:126
|
|
327
327
|
msgid "Unexpected storage error"
|
|
328
328
|
msgstr "Erreur de stockage inattendue"
|
|
329
329
|
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from django.contrib.auth.models import AnonymousUser
|
|
4
|
+
from django.core.exceptions import ImproperlyConfigured
|
|
5
|
+
from django.http import parse_cookie
|
|
6
|
+
|
|
7
|
+
from pfx.pfxcore.middleware.authentication import JWTTokenDecodeMixin
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
from channels.db import database_sync_to_async
|
|
13
|
+
from channels.middleware import BaseMiddleware
|
|
14
|
+
except ImportError as e:
|
|
15
|
+
# Channels is only needed by the projects serving websockets, but
|
|
16
|
+
# naming any middleware of `pfx.pfxcore.middleware` makes Django
|
|
17
|
+
# import the whole package: this module has to stay importable
|
|
18
|
+
# without it. The error is raised when the middleware is used.
|
|
19
|
+
CHANNELS_IMPORT_ERROR = e
|
|
20
|
+
database_sync_to_async = None
|
|
21
|
+
BaseMiddleware = object
|
|
22
|
+
else:
|
|
23
|
+
CHANNELS_IMPORT_ERROR = None
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class WSCookieAuthenticationMiddleware(JWTTokenDecodeMixin, BaseMiddleware):
|
|
27
|
+
def __init__(self, *args, **kwargs):
|
|
28
|
+
if CHANNELS_IMPORT_ERROR:
|
|
29
|
+
raise ImproperlyConfigured(
|
|
30
|
+
f'Missing channels: {CHANNELS_IMPORT_ERROR}\n'
|
|
31
|
+
"PFX CONFIGURATION ERROR: You have to install channels "
|
|
32
|
+
"to use [pfx.pfxcore.middleware."
|
|
33
|
+
f"{self.__class__.__name__}]:\n"
|
|
34
|
+
"pip install channels\n"
|
|
35
|
+
"(and a websocket server, for instance with "
|
|
36
|
+
"`pip install channels[daphne]`)"
|
|
37
|
+
) from CHANNELS_IMPORT_ERROR
|
|
38
|
+
super().__init__(*args, **kwargs)
|
|
39
|
+
|
|
40
|
+
async def __call__(self, scope, receive, send):
|
|
41
|
+
if scope.get("user") is not None:
|
|
42
|
+
return await super().__call__(scope, receive, send)
|
|
43
|
+
|
|
44
|
+
headers = dict(scope.get("headers", []))
|
|
45
|
+
cookies = {}
|
|
46
|
+
if b"cookie" in headers:
|
|
47
|
+
cookies = parse_cookie(headers[b"cookie"].decode())
|
|
48
|
+
|
|
49
|
+
key = cookies.get("token")
|
|
50
|
+
if key:
|
|
51
|
+
try:
|
|
52
|
+
user, __, __ = await database_sync_to_async(
|
|
53
|
+
self.decode_jwt)(key)
|
|
54
|
+
except Exception as e:
|
|
55
|
+
logger.exception(e, exc_info=True)
|
|
56
|
+
user = AnonymousUser()
|
|
57
|
+
else:
|
|
58
|
+
user = AnonymousUser()
|
|
59
|
+
scope['user'] = user
|
|
60
|
+
return await super().__call__(scope, receive, send)
|
|
@@ -3,6 +3,7 @@ import logging
|
|
|
3
3
|
from django.core.exceptions import FieldDoesNotExist
|
|
4
4
|
from django.http import FileResponse, HttpResponse
|
|
5
5
|
from django.shortcuts import redirect
|
|
6
|
+
from django.utils.http import content_disposition_header
|
|
6
7
|
from django.utils.translation import gettext_lazy as _
|
|
7
8
|
|
|
8
9
|
from pfx.pfxcore.decorator import rest_api
|
|
@@ -42,8 +43,8 @@ def get_media_field_response(obj, field, request):
|
|
|
42
43
|
inline = get_bool(request.GET, "inline")
|
|
43
44
|
if settings.STORAGE_LOCAL_X_ACCEL_REDIRECT:
|
|
44
45
|
response = HttpResponse()
|
|
45
|
-
response["Content-Disposition"] = (
|
|
46
|
-
|
|
46
|
+
response["Content-Disposition"] = content_disposition_header(
|
|
47
|
+
not inline, filename)
|
|
47
48
|
response["Content-Type"] = attr.get('content-type', '')
|
|
48
49
|
response['X-Accel-Redirect'] = (
|
|
49
50
|
f"/filestore/{attr.get('key')}")
|
|
@@ -840,6 +840,41 @@ class BasicAPITest(TestAssertMixin, TestCase):
|
|
|
840
840
|
self.assertJE(response, 'local_file', None)
|
|
841
841
|
self.assertFalse(Path(f'/tmp/django-pfx-filestore/{key2}').exists())
|
|
842
842
|
|
|
843
|
+
def test_get_file_content_disposition(self):
|
|
844
|
+
"""The file name must survive both local serving paths.
|
|
845
|
+
|
|
846
|
+
The name holds "…", outside latin-1: written by hand into the
|
|
847
|
+
X-Accel header, it made Django MIME-encode the whole value
|
|
848
|
+
(`=?utf-8?q?…?=`), which browsers cannot read, so "inline" was
|
|
849
|
+
lost. The ";" would also have cut the unquoted name short.
|
|
850
|
+
FileResponse is checked too, as both paths must agree.
|
|
851
|
+
"""
|
|
852
|
+
response = self.client.post('/api/books', dict(
|
|
853
|
+
name="Test Book",
|
|
854
|
+
author=self.author1.pk,
|
|
855
|
+
pub_date='2000-01-01',
|
|
856
|
+
local_file=dict(
|
|
857
|
+
name='Crédit; école[…].txt',
|
|
858
|
+
base64='data:text/plain;charset=utf-8;'
|
|
859
|
+
'base64,VGVzdCBjb250ZW50')))
|
|
860
|
+
self.assertRC(response, 200)
|
|
861
|
+
url = f"/api/books/{self.get_val(response, 'pk')}/local_file"
|
|
862
|
+
name = (
|
|
863
|
+
"filename*=utf-8''"
|
|
864
|
+
"Cr%C3%A9dit%3B%20%C3%A9cole%5B%E2%80%A6%5D.txt")
|
|
865
|
+
|
|
866
|
+
for x_accel in (True, False):
|
|
867
|
+
with override_settings(STORAGE_LOCAL_X_ACCEL_REDIRECT=x_accel):
|
|
868
|
+
response = self.client.get(url)
|
|
869
|
+
self.assertRC(response, 200)
|
|
870
|
+
self.assertEqual(
|
|
871
|
+
response['Content-Disposition'], f"attachment; {name}")
|
|
872
|
+
|
|
873
|
+
response = self.client.get(f"{url}?inline=true")
|
|
874
|
+
self.assertRC(response, 200)
|
|
875
|
+
self.assertEqual(
|
|
876
|
+
response['Content-Disposition'], f"inline; {name}")
|
|
877
|
+
|
|
843
878
|
def test_create_null_values(self):
|
|
844
879
|
response = self.client.post(
|
|
845
880
|
'/api/books', dict(
|
|
@@ -353,7 +353,7 @@ class TestUserJobApi(TestAssertMixin, TestCase):
|
|
|
353
353
|
self.assertRC(response, 200)
|
|
354
354
|
self.assertEqual(
|
|
355
355
|
response.headers['Content-Disposition'],
|
|
356
|
-
|
|
356
|
+
'attachment; filename="test.txt"')
|
|
357
357
|
self.assertEqual(
|
|
358
358
|
response.headers['X-Accel-Redirect'],
|
|
359
359
|
f"/filestore/{att.file['key']}")
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from unittest.mock import patch
|
|
3
|
+
|
|
4
|
+
from django.core.exceptions import ImproperlyConfigured
|
|
5
|
+
from django.test import TestCase
|
|
6
|
+
|
|
7
|
+
from pfx.pfxcore.middleware import WSCookieAuthenticationMiddleware
|
|
8
|
+
from pfx.pfxcore.middleware import ws_cookie_authentication_middleware as mod
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class TestWSCookieMiddleware(TestCase):
|
|
14
|
+
"""Channels is an optional dependency: naming any middleware of
|
|
15
|
+
`pfx.pfxcore.middleware` makes Django import the whole package, so a
|
|
16
|
+
project serving no websocket must not need it installed."""
|
|
17
|
+
|
|
18
|
+
def test_module_is_importable_without_channels(self):
|
|
19
|
+
# The module is already imported: reaching this point at all
|
|
20
|
+
# means the package did not require channels at import time.
|
|
21
|
+
self.assertIsNone(mod.CHANNELS_IMPORT_ERROR)
|
|
22
|
+
|
|
23
|
+
def test_middleware_reports_the_missing_dependency(self):
|
|
24
|
+
error = ImportError("No module named 'channels'")
|
|
25
|
+
with patch.object(mod, 'CHANNELS_IMPORT_ERROR', error):
|
|
26
|
+
with self.assertRaises(ImproperlyConfigured) as ctx:
|
|
27
|
+
WSCookieAuthenticationMiddleware(lambda *a: None)
|
|
28
|
+
message = str(ctx.exception)
|
|
29
|
+
self.assertIn("No module named 'channels'", message)
|
|
30
|
+
self.assertIn('pip install channels', message)
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
|
|
3
|
-
from django.contrib.auth.models import AnonymousUser
|
|
4
|
-
from django.http import parse_cookie
|
|
5
|
-
|
|
6
|
-
from channels.db import database_sync_to_async
|
|
7
|
-
from channels.middleware import BaseMiddleware
|
|
8
|
-
|
|
9
|
-
from pfx.pfxcore.middleware.authentication import JWTTokenDecodeMixin
|
|
10
|
-
|
|
11
|
-
logger = logging.getLogger(__name__)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class WSCookieAuthenticationMiddleware(JWTTokenDecodeMixin, BaseMiddleware):
|
|
15
|
-
async def __call__(self, scope, receive, send):
|
|
16
|
-
if scope.get("user") is not None:
|
|
17
|
-
return await super().__call__(scope, receive, send)
|
|
18
|
-
|
|
19
|
-
headers = dict(scope.get("headers", []))
|
|
20
|
-
cookies = {}
|
|
21
|
-
if b"cookie" in headers:
|
|
22
|
-
cookies = parse_cookie(headers[b"cookie"].decode())
|
|
23
|
-
|
|
24
|
-
key = cookies.get("token")
|
|
25
|
-
if key:
|
|
26
|
-
try:
|
|
27
|
-
user, __, __ = await database_sync_to_async(
|
|
28
|
-
self.decode_jwt)(key)
|
|
29
|
-
except Exception as e:
|
|
30
|
-
logger.exception(e, exc_info=True)
|
|
31
|
-
user = AnonymousUser()
|
|
32
|
-
else:
|
|
33
|
-
user = AnonymousUser()
|
|
34
|
-
scope['user'] = user
|
|
35
|
-
return await super().__call__(scope, receive, send)
|
|
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
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/email_backend/q_mailjet_email_backend.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/0002_alter_email_headers.py
RENAMED
|
File without changes
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/0003_alter_email_options.py
RENAMED
|
File without changes
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/0004_alter_email_mail_from.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/providers/email_django_q_executor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/templates/emails/base_template.html
RENAMED
|
File without changes
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/templates/emails/base_template.txt
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
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/fields/minutes_duration_field.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo
RENAMED
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/management/commands/__init__.py
RENAMED
|
File without changes
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/management/commands/makeapidoc.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
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/operations/__init__.py
RENAMED
|
File without changes
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/operations/permissions.py
RENAMED
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/abstract_pfx_base_user.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
|
{django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/user_filtered_queryset_mixin.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
|