django-pfx 1.7.6.dev19__tar.gz → 1.7.6.dev23__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.dev19 → django_pfx-1.7.6.dev23}/PKG-INFO +1 -1
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/django_pfx.egg-info/PKG-INFO +1 -1
- django_pfx-1.7.6.dev23/django_pfx.egg-info/scm_version.json +8 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/default_settings.py +9 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/fields/media_field.py +31 -3
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +3 -3
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/media_rest_view_mixin.py +8 -1
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/basic_api_test.py +65 -4
- django_pfx-1.7.6.dev19/django_pfx.egg-info/scm_version.json +0 -8
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/.gitignore +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/.gitlab-ci.yml +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/.pre-commit-config.yaml +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/LICENSE +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/MANIFEST.in +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/README.md +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/django_pfx.egg-info/SOURCES.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/django_pfx.egg-info/dependency_links.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/django_pfx.egg-info/requires.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/django_pfx.egg-info/scm_file_list.json +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/django_pfx.egg-info/top_level.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/Makefile +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/conf.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/index.rst +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/source/api.views.rst +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/source/authentication.md +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/source/decorator.md +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/source/generate_openapi.md +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/source/getting_started.md +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/source/internationalisation.md +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/source/model.md +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/source/pfx_views.md +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/source/profiling.md +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/source/settings.md +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/source/testing.md +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/doc/source/user_jobs.md +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/img/pfx.png +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/img/pfx.svg +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/make_messages +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/manage.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/apps.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/email_backend/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/email_backend/q_mailjet_email_backend.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/exceptions.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/locale/fr/LC_MESSAGES/django.mo +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/locale/fr/LC_MESSAGES/django.po +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/mailjet/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/mailjet/mailjet.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/mailjet/message_result.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/migrations/0002_alter_email_headers.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/migrations/0003_alter_email_options.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/migrations/0004_alter_email_mail_from.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/migrations/0005_lowercase_verbose_names.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/models/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/models/email.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/providers/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/providers/email_django_q_executor.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/shortcuts.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/tasks.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/templates/emails/base_template.html +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/templates/emails/base_template.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/templates/emails/base_template_subject.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/urls.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/views/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/views/email_rest_view.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/apidoc/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/apidoc/parameters.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/apidoc/schema.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/apidoc/tags.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/apps.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/decorator/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/decorator/rest.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/exceptions.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/fields/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/fields/decimal_field.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/fields/rich_text_field.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/http/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/http/json_response.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/management/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/management/commands/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/management/commands/profile.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/mfa/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/mfa/authenticator.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/mfa/base.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/mfa/email.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/mfa/legacy.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/mfa/sms.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/middleware/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/middleware/authentication.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/middleware/locale.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/middleware/profiling.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/middleware/request_too_big_middleware.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/middleware/ws_cookie_authentication_middleware.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/0004_alter_loginban_failed_counter_and_more.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/0005_mfadevice_mfadevice_mfa_device_unique_backend.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/0006_alter_pfxuser_managers.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/0007_alter_pfxuser_options.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/0008_lowercase_verbose_names.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/models/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/models/attachment_mixin.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/models/cache_mixins.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/models/login_ban.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/models/mfa_device.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/models/mfa_user_mixin.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/models/not_null_fields.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/models/pfx_models.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/models/pfx_user.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/serializers/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/serializers/json.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/settings.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/shortcuts.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/sms/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/sms/backends/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/sms/backends/base.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/sms/backends/console.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/storage/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/storage/exceptions.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/storage/local_storage.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/storage/s3_storage.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/test.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/urls.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/version_check.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/authentication_views.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/fields.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/filters_views.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/locale_views.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/mfa_authentication_views.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/date_format.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/groups.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/list_count.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/list_items.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/list_order.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/list_search.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/subset.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/rest_views.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/settings/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/settings/dev.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/apps.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/locale/fr/LC_MESSAGES/django.mo +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/locale/fr/LC_MESSAGES/django.po +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/migrations/0002_alter_userjob_options_alter_userjob_auto_queued_and_more.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/migrations/0003_clean_scheduled_tasks.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/migrations/0004_userjob_summary_url.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/migrations/0005_swappable_user_job.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/migrations/0006_lowercase_verbose_names.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/models/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/models/user_job.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/models/user_job_attachment.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/providers/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/providers/user_job_django_q_executor.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/providers/user_job_websocket_channel_provider.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/tasks.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/urls.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/views/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/views/user_job_attachment_view.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/views/user_job_view.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/userjobs/views/user_websocket_consumer.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pyproject.toml +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/requirements.txt +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/serve-doc +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/setup.cfg +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/setup.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/apps.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/channel_group_send_calls.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/mfa_urls.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/models.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/settings/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/settings/ci.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/settings/common.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/settings/dev.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/settings/dev_default.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/basic_api_errors.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/mfa_test_utils.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_api_doc.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_api_doc_search.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_auth_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_body_mixin.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_cache.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_client.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_emails_email_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_emails_email_model.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_emails_q_mailjet_email_backend.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_emails_send_email_message.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_fields_choices.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_fields_date.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_fields_decimal.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_fields_help_text.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_fields_minutes_duration.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_fields_one2many.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_fields_rich_text.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_fields_time.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_filters.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_locale_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_mfa_legacy.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_mfa_login_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_mfa_setup_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_perm_tests.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_permissions.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_perms_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_post_migrate_groups_update.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_profiling_middleware.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_settings.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_shortcuts.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_timezone_middleware.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_tools.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_user_job_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_user_job_messages.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_user_job_model.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_user_queryset.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_user_websocket.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_verbose_names.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_version_check.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_view_decorators.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_view_fields.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/tests/test_ws_cookie_middleware.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/urls.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests/views.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/settings/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/settings/ci.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/settings/common.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/settings/dev.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/settings/dev_default.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/tests/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/tests/test_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/tests/test_auth_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/urls.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_base_user/views.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/models.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/settings/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/settings/ci.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/settings/common.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/settings/dev.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/settings/dev_default.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/tests/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/tests/test_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/tests/test_auth_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/urls.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user/views.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/migrations/0002_lowercase_verbose_names.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/models.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/providers.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/scope.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/settings/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/settings/ci.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/settings/common.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/settings/dev.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/settings/dev_default.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/tests/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/tests/test_user_job.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_custom_user_job/urls.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/migrations/0001_initial.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/migrations/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/models.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/settings/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/settings/ci.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/settings/common.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/settings/dev.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/settings/dev_custom_example.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/settings/dev_default.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/tests/__init__.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/tests/test_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/tests/test_auth_api.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/tests_user_email_login/urls.py +0 -0
- {django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/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.dev23
|
|
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.dev23
|
|
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
|
|
@@ -35,6 +35,15 @@ STORAGE_S3_AWS_GET_URL_EXPIRE = None
|
|
|
35
35
|
|
|
36
36
|
STORAGE_LOCAL_ROOT = None
|
|
37
37
|
STORAGE_LOCAL_X_ACCEL_REDIRECT = False
|
|
38
|
+
# Served from the application domain, so a type the browser renders as a
|
|
39
|
+
# document (text/html, image/svg+xml, …) would run its scripts there.
|
|
40
|
+
STORAGE_INLINE_CONTENT_TYPES = [
|
|
41
|
+
'application/pdf',
|
|
42
|
+
'image/gif',
|
|
43
|
+
'image/jpeg',
|
|
44
|
+
'image/png',
|
|
45
|
+
'image/webp',
|
|
46
|
+
]
|
|
38
47
|
|
|
39
48
|
PFX_TEST_MODE = False
|
|
40
49
|
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
import binascii
|
|
1
3
|
import io
|
|
2
4
|
import logging
|
|
3
5
|
from importlib import import_module
|
|
4
|
-
from urllib.
|
|
6
|
+
from urllib.parse import unquote_to_bytes
|
|
5
7
|
|
|
6
8
|
from django.core.exceptions import ValidationError
|
|
7
9
|
from django.db import models
|
|
@@ -15,6 +17,30 @@ logger = logging.getLogger(__name__)
|
|
|
15
17
|
DEFAULT_KEYS = {"key", "name", "content-type", "content-length"}
|
|
16
18
|
|
|
17
19
|
|
|
20
|
+
def decode_data_uri(value):
|
|
21
|
+
"""Return the bytes carried by a ``data:`` URI, and only that.
|
|
22
|
+
|
|
23
|
+
The uploaded content reaches the server as this string. It used to be
|
|
24
|
+
handed to ``urlopen``, which also opens ``file://`` and ``http://``:
|
|
25
|
+
a client could then have the server read a local file or reach the
|
|
26
|
+
internal network. Only the ``data:`` scheme is accepted here, and it
|
|
27
|
+
is decoded in place, never opened.
|
|
28
|
+
|
|
29
|
+
:raises ValidationError: when the value is not a valid ``data:`` URI
|
|
30
|
+
"""
|
|
31
|
+
if not isinstance(value, str) or not value.startswith('data:'):
|
|
32
|
+
raise ValidationError("Le contenu doit être une URI « data: ».")
|
|
33
|
+
header, sep, data = value[len('data:'):].partition(',')
|
|
34
|
+
if not sep:
|
|
35
|
+
raise ValidationError("URI « data: » invalide.")
|
|
36
|
+
if ';base64' in header:
|
|
37
|
+
try:
|
|
38
|
+
return base64.b64decode(data, validate=True)
|
|
39
|
+
except (binascii.Error, ValueError):
|
|
40
|
+
raise ValidationError("URI « data: » invalide.")
|
|
41
|
+
return unquote_to_bytes(data)
|
|
42
|
+
|
|
43
|
+
|
|
18
44
|
def get_storage_class(class_path):
|
|
19
45
|
ps = class_path.split('.')
|
|
20
46
|
return getattr(import_module('.'.join(ps[:-1])), ps[-1])()
|
|
@@ -91,8 +117,10 @@ class MediaField(models.JSONField):
|
|
|
91
117
|
after_save.append(lambda: self.delete(self._db_value))
|
|
92
118
|
setattr(obj, self.name, None)
|
|
93
119
|
if b64:
|
|
94
|
-
|
|
95
|
-
file =
|
|
120
|
+
try:
|
|
121
|
+
file = decode_data_uri(b64)
|
|
122
|
+
except ValidationError as e:
|
|
123
|
+
raise ValidationError({self.name: e.messages})
|
|
96
124
|
setattr(obj, self.name, dict(key=self.get_key(obj, name)))
|
|
97
125
|
after_save.append(lambda: save_file(obj, file, name))
|
|
98
126
|
return after_save
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/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-10-01 06:30+0200\n"
|
|
11
11
|
"PO-Revision-Date: 2021-06-22 23:31+0200\n"
|
|
12
12
|
"Last-Translator: \n"
|
|
13
13
|
"Language-Team: \n"
|
|
@@ -22,7 +22,7 @@ msgstr ""
|
|
|
22
22
|
msgid "An internal server error occured."
|
|
23
23
|
msgstr "Une erreur interne du serveur est survenue."
|
|
24
24
|
|
|
25
|
-
#: default_settings.py:
|
|
25
|
+
#: default_settings.py:65
|
|
26
26
|
msgid "A system error occurred. Our support team has been notified."
|
|
27
27
|
msgstr ""
|
|
28
28
|
"Une erreur système s’est produite. Notre équipe d’assistance en a été "
|
|
@@ -328,7 +328,7 @@ msgstr ""
|
|
|
328
328
|
msgid "Invalid value for {filter} filter"
|
|
329
329
|
msgstr "Valeur invalide pour le filtre {filter}"
|
|
330
330
|
|
|
331
|
-
#: views/media_rest_view_mixin.py:
|
|
331
|
+
#: views/media_rest_view_mixin.py:43 views/media_rest_view_mixin.py:133
|
|
332
332
|
msgid "Unexpected storage error"
|
|
333
333
|
msgstr "Erreur de stockage inattendue"
|
|
334
334
|
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/views/media_rest_view_mixin.py
RENAMED
|
@@ -29,6 +29,11 @@ def get_medial_field(model, field):
|
|
|
29
29
|
return model_field
|
|
30
30
|
|
|
31
31
|
|
|
32
|
+
def is_inline_content_type(content_type):
|
|
33
|
+
mime = (content_type or '').split(';')[0].strip().lower()
|
|
34
|
+
return mime in settings.STORAGE_INLINE_CONTENT_TYPES
|
|
35
|
+
|
|
36
|
+
|
|
32
37
|
def get_media_field_response(obj, field, request):
|
|
33
38
|
mediaField = get_medial_field(obj, field)
|
|
34
39
|
try:
|
|
@@ -40,7 +45,9 @@ def get_media_field_response(obj, field, request):
|
|
|
40
45
|
if mediaField.storage.direct:
|
|
41
46
|
attr = getattr(obj, field)
|
|
42
47
|
filename = attr.get('name')
|
|
43
|
-
inline =
|
|
48
|
+
inline = (
|
|
49
|
+
get_bool(request.GET, "inline") and
|
|
50
|
+
is_inline_content_type(attr.get('content-type')))
|
|
44
51
|
if settings.STORAGE_LOCAL_X_ACCEL_REDIRECT:
|
|
45
52
|
response = HttpResponse()
|
|
46
53
|
response["Content-Disposition"] = content_disposition_header(
|
|
@@ -847,6 +847,37 @@ class BasicAPITest(TestAssertMixin, TestCase):
|
|
|
847
847
|
self.assertJE(response, 'local_file', None)
|
|
848
848
|
self.assertFalse(Path(f'/tmp/django-pfx-filestore/{key2}').exists())
|
|
849
849
|
|
|
850
|
+
def test_create_file_rejects_non_data_uri(self):
|
|
851
|
+
"""A media upload only accepts a ``data:`` URI.
|
|
852
|
+
|
|
853
|
+
The content used to be handed to ``urlopen``, so ``file://`` made
|
|
854
|
+
the server read a local file and ``http://`` reach the network.
|
|
855
|
+
Both are refused now, with a field error, before anything is read.
|
|
856
|
+
"""
|
|
857
|
+
for uri in (
|
|
858
|
+
'file:///etc/hostname',
|
|
859
|
+
'http://169.254.169.254/latest/meta-data/',
|
|
860
|
+
'not a uri at all'):
|
|
861
|
+
response = self.client.post('/api/books', dict(
|
|
862
|
+
name="Test Book",
|
|
863
|
+
author=self.author1.pk,
|
|
864
|
+
pub_date='2000-01-01',
|
|
865
|
+
local_file=dict(name='x.txt', base64=uri)))
|
|
866
|
+
self.assertRC(response, 422)
|
|
867
|
+
self.assertJEExists(response, 'local_file')
|
|
868
|
+
|
|
869
|
+
def test_create_file_url_encoded_data_uri(self):
|
|
870
|
+
"""A ``data:`` URI without ``;base64`` is percent-decoded, as
|
|
871
|
+
``urlopen`` did, so that path keeps working without it."""
|
|
872
|
+
response = self.client.post('/api/books', dict(
|
|
873
|
+
name="Test Book",
|
|
874
|
+
author=self.author1.pk,
|
|
875
|
+
pub_date='2000-01-01',
|
|
876
|
+
local_file=dict(
|
|
877
|
+
name='test.txt', base64='data:text/plain,Hello%20world')))
|
|
878
|
+
self.assertRC(response, 200)
|
|
879
|
+
self.assertJE(response, 'local_file.content-length', '11')
|
|
880
|
+
|
|
850
881
|
def test_get_file_content_disposition(self):
|
|
851
882
|
"""The file name must survive both local serving paths.
|
|
852
883
|
|
|
@@ -855,20 +886,20 @@ class BasicAPITest(TestAssertMixin, TestCase):
|
|
|
855
886
|
(`=?utf-8?q?…?=`), which browsers cannot read, so "inline" was
|
|
856
887
|
lost. The ";" would also have cut the unquoted name short.
|
|
857
888
|
FileResponse is checked too, as both paths must agree.
|
|
889
|
+
A PDF, so that "inline" is honoured.
|
|
858
890
|
"""
|
|
859
891
|
response = self.client.post('/api/books', dict(
|
|
860
892
|
name="Test Book",
|
|
861
893
|
author=self.author1.pk,
|
|
862
894
|
pub_date='2000-01-01',
|
|
863
895
|
local_file=dict(
|
|
864
|
-
name='Crédit; école[…].
|
|
865
|
-
base64='data:
|
|
866
|
-
'base64,VGVzdCBjb250ZW50')))
|
|
896
|
+
name='Crédit; école[…].pdf',
|
|
897
|
+
base64='data:application/pdf;base64,VGVzdCBjb250ZW50')))
|
|
867
898
|
self.assertRC(response, 200)
|
|
868
899
|
url = f"/api/books/{self.get_val(response, 'pk')}/local_file"
|
|
869
900
|
name = (
|
|
870
901
|
"filename*=utf-8''"
|
|
871
|
-
"Cr%C3%A9dit%3B%20%C3%A9cole%5B%E2%80%A6%5D.
|
|
902
|
+
"Cr%C3%A9dit%3B%20%C3%A9cole%5B%E2%80%A6%5D.pdf")
|
|
872
903
|
|
|
873
904
|
for x_accel in (True, False):
|
|
874
905
|
with override_settings(STORAGE_LOCAL_X_ACCEL_REDIRECT=x_accel):
|
|
@@ -882,6 +913,36 @@ class BasicAPITest(TestAssertMixin, TestCase):
|
|
|
882
913
|
self.assertEqual(
|
|
883
914
|
response['Content-Disposition'], f"inline; {name}")
|
|
884
915
|
|
|
916
|
+
def test_get_file_inline_unsafe_type(self):
|
|
917
|
+
"""A file the browser would render as a page is never inline.
|
|
918
|
+
|
|
919
|
+
Served from the application domain, an HTML or SVG file opened
|
|
920
|
+
with "?inline=true" would run its scripts with the session of
|
|
921
|
+
whoever follows the link. The type is guessed from the name at
|
|
922
|
+
upload, so the name alone decides; both serving paths are checked.
|
|
923
|
+
"""
|
|
924
|
+
for filename, inline in (
|
|
925
|
+
('page.html', False), ('image.svg', False),
|
|
926
|
+
('note.txt', False), ('photo.png', True)):
|
|
927
|
+
response = self.client.post('/api/books', dict(
|
|
928
|
+
name=f"Book {filename}",
|
|
929
|
+
author=self.author1.pk,
|
|
930
|
+
pub_date='2000-01-01',
|
|
931
|
+
local_file=dict(
|
|
932
|
+
name=filename,
|
|
933
|
+
base64='data:text/html;base64,'
|
|
934
|
+
'PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==')))
|
|
935
|
+
self.assertRC(response, 200)
|
|
936
|
+
url = f"/api/books/{self.get_val(response, 'pk')}/local_file"
|
|
937
|
+
for x_accel in (True, False):
|
|
938
|
+
with self.subTest(filename=filename, x_accel=x_accel), \
|
|
939
|
+
override_settings(
|
|
940
|
+
STORAGE_LOCAL_X_ACCEL_REDIRECT=x_accel):
|
|
941
|
+
response = self.client.get(f"{url}?inline=true")
|
|
942
|
+
self.assertRC(response, 200)
|
|
943
|
+
self.assertTrue(response['Content-Disposition'].startswith(
|
|
944
|
+
'inline;' if inline else 'attachment;'))
|
|
945
|
+
|
|
885
946
|
def test_create_null_values(self):
|
|
886
947
|
response = self.client.post(
|
|
887
948
|
'/api/books', dict(
|
|
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
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/locale/fr/LC_MESSAGES/django.mo
RENAMED
|
File without changes
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/locale/fr/LC_MESSAGES/django.po
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/migrations/0002_alter_email_headers.py
RENAMED
|
File without changes
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/migrations/0003_alter_email_options.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.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/providers/email_django_q_executor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/emails/templates/emails/base_template.html
RENAMED
|
File without changes
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/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
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/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.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo
RENAMED
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/management/commands/__init__.py
RENAMED
|
File without changes
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/management/commands/makeapidoc.py
RENAMED
|
File without changes
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/management/commands/profile.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.dev19 → django_pfx-1.7.6.dev23}/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
|
|
File without changes
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/operations/__init__.py
RENAMED
|
File without changes
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/pfx/pfxcore/migrations/operations/permissions.py
RENAMED
|
File without changes
|
|
File without changes
|
{django_pfx-1.7.6.dev19 → django_pfx-1.7.6.dev23}/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.dev19 → django_pfx-1.7.6.dev23}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|