django-pfx 1.4.dev130__tar.gz → 1.4.dev134__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.4.dev130 → django_pfx-1.4.dev134}/PKG-INFO +1 -1
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/django_pfx.egg-info/PKG-INFO +1 -1
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/django_pfx.egg-info/SOURCES.txt +1 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +2 -2
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/__init__.py +5 -1
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/fields.py +2 -7
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/media_rest_view_mixin.py +41 -36
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/__init__.py +1 -0
- django_pfx-1.4.dev134/tests/tests/test_fields_date.py +60 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/.gitignore +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/.gitlab-ci.yml +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/.pre-commit-config.yaml +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/LICENSE +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/MANIFEST.in +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/README.md +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/django_pfx.egg-info/dependency_links.txt +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/django_pfx.egg-info/requires.txt +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/django_pfx.egg-info/top_level.txt +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/Makefile +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/conf.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/index.rst +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/api.views.rst +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/authentication.md +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/decorator.md +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/generate_openapi.md +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/getting_started.md +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/internationalisation.md +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/model.md +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/pfx_views.md +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/profiling.md +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/settings.md +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/testing.md +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/img/pfx.png +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/img/pfx.svg +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/make_messages +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/manage.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/apidoc/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/apidoc/parameters.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/apidoc/schema.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/apidoc/tags.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/apps.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/decorator/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/decorator/rest.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/default_settings.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/exceptions.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/fields/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/fields/decimal_field.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/fields/media_field.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/fields/nh3_field.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/http/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/http/json_response.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/management/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/management/commands/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/management/commands/profile.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/middleware/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/middleware/authentication.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/middleware/locale.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/middleware/profiling.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/0001_initial.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/cache_mixins.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/login_ban.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/not_null_fields.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/pfx_models.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/pfx_user.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/serializers/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/serializers/json.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/settings.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/shortcuts.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/storage/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/storage/exceptions.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/storage/local_storage.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/storage/s3_storage.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/test.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/urls.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/authentication_views.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/filters_views.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/locale_views.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/date_format.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/groups.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/list_count.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/list_items.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/list_order.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/list_search.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/rest_views.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/settings/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/settings/dev.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pyproject.toml +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/requirements.txt +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/serve-doc +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/setup.cfg +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/setup.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/apps.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/migrations/0001_initial.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/migrations/0002_alter_book_cover.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/migrations/0003_book_local_file.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/migrations/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/models.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/settings/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/settings/ci.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/settings/common.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/settings/dev.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/settings/dev_custom_example.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/settings/dev_default.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/basic_api_errors.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/basic_api_test.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_api_doc.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_api_doc_search.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_auth_api.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_body_mixin.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_cache.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_client.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_fields_choices.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_fields_decimal.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_fields_minutes_duration.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_fields_nh3.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_filters.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_locale_api.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_perm_tests.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_permissions.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_perms_api.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_post_migrate_groups_update.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_profiling_middleware.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_settings.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_shortcuts.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_timezone_middleware.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_tools.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_user_queryset.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_view_decorators.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_view_fields.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/urls.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/views.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/migrations/0001_initial.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/migrations/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/ci.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/common.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/dev.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/dev_custom_example.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/dev_default.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/tests/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/tests/test_api.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/tests/test_auth_api.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/urls.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/views.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/migrations/0001_initial.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/migrations/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/models.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/ci.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/common.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/dev.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/dev_custom_example.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/dev_default.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/tests/__init__.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/tests/test_api.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/tests/test_auth_api.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/urls.py +0 -0
- {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/views.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-pfx
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.dev134
|
|
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.4.
|
|
3
|
+
Version: 1.4.dev134
|
|
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
|
|
@@ -146,6 +146,7 @@ tests/tests/test_body_mixin.py
|
|
|
146
146
|
tests/tests/test_cache.py
|
|
147
147
|
tests/tests/test_client.py
|
|
148
148
|
tests/tests/test_fields_choices.py
|
|
149
|
+
tests/tests/test_fields_date.py
|
|
149
150
|
tests/tests/test_fields_decimal.py
|
|
150
151
|
tests/tests/test_fields_minutes_duration.py
|
|
151
152
|
tests/tests/test_fields_nh3.py
|
|
@@ -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: 2025-05-
|
|
10
|
+
"POT-Creation-Date: 2025-05-21 12:41+0200\n"
|
|
11
11
|
"PO-Revision-Date: 2021-06-22 23:31+0200\n"
|
|
12
12
|
"Last-Translator: \n"
|
|
13
13
|
"Language-Team: \n"
|
|
@@ -272,7 +272,7 @@ msgstr "Un nouveau code d'authentification a été envoyé par e-mail."
|
|
|
272
272
|
msgid "Invalid value for {filter} filter"
|
|
273
273
|
msgstr "Valeur invalide pour le filtre {filter}"
|
|
274
274
|
|
|
275
|
-
#: views/media_rest_view_mixin.py:
|
|
275
|
+
#: views/media_rest_view_mixin.py:37 views/media_rest_view_mixin.py:123
|
|
276
276
|
msgid "Unexpected storage error"
|
|
277
277
|
msgstr "Erreur de stockage inattendue"
|
|
278
278
|
|
|
@@ -8,7 +8,11 @@ from .authentication_views import (
|
|
|
8
8
|
from .fields import VF, FieldType, ViewField, ViewModelField
|
|
9
9
|
from .filters_views import Filter, FilterGroup, ModelFilter
|
|
10
10
|
from .locale_views import LocaleRestView
|
|
11
|
-
from .media_rest_view_mixin import
|
|
11
|
+
from .media_rest_view_mixin import (
|
|
12
|
+
MediaPermsRestViewMixin,
|
|
13
|
+
MediaRestViewMixin,
|
|
14
|
+
get_media_field_response,
|
|
15
|
+
)
|
|
12
16
|
from .ordered_rest_view_mixin import OrderedRestViewMixin
|
|
13
17
|
from .rest_views import (
|
|
14
18
|
BaseRestView,
|
|
@@ -366,14 +366,9 @@ class ViewModelField(ViewField):
|
|
|
366
366
|
value = (value['value']
|
|
367
367
|
if isinstance(value, dict) and 'value' in value
|
|
368
368
|
else value)
|
|
369
|
-
elif self.field_type
|
|
369
|
+
elif self.field_type in (FieldType.DateField, FieldType.DateTimeField):
|
|
370
370
|
try:
|
|
371
|
-
value = value and field.to_python(value)
|
|
372
|
-
except ValidationError as e:
|
|
373
|
-
raise ValidationError({field.name: e})
|
|
374
|
-
elif self.field_type == FieldType.DateTimeField:
|
|
375
|
-
try:
|
|
376
|
-
value = value and field.to_python(value)
|
|
371
|
+
value = value and field.to_python(value) or None
|
|
377
372
|
except ValidationError as e:
|
|
378
373
|
raise ValidationError({field.name: e})
|
|
379
374
|
elif self.field_type == FieldType.IntegerField:
|
|
@@ -18,18 +18,47 @@ from .rest_views import ModelMixin
|
|
|
18
18
|
logger = logging.getLogger(__name__)
|
|
19
19
|
|
|
20
20
|
|
|
21
|
+
def get_medial_field(model, field):
|
|
22
|
+
try:
|
|
23
|
+
model_field = model._meta.get_field(field)
|
|
24
|
+
if not isinstance(model_field, MediaField):
|
|
25
|
+
raise NotFoundError # pragma: no cover
|
|
26
|
+
except FieldDoesNotExist: # pragma: no cover
|
|
27
|
+
raise NotFoundError
|
|
28
|
+
return model_field
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def get_media_field_response(obj, field, request):
|
|
32
|
+
mediaField = get_medial_field(obj, field)
|
|
33
|
+
try:
|
|
34
|
+
url = mediaField.get_url(request, obj)
|
|
35
|
+
except StorageException as e: # pragma: no cover
|
|
36
|
+
logger.exception(e)
|
|
37
|
+
raise APIError(_("Unexpected storage error", status=500))
|
|
38
|
+
|
|
39
|
+
if mediaField.storage.direct:
|
|
40
|
+
attr = getattr(obj, field)
|
|
41
|
+
filename = attr.get('name')
|
|
42
|
+
if settings.STORAGE_LOCAL_X_ACCEL_REDIRECT:
|
|
43
|
+
response = HttpResponse()
|
|
44
|
+
response["Content-Disposition"] = (
|
|
45
|
+
f"attachment; filename={filename}")
|
|
46
|
+
response['X-Accel-Redirect'] = (
|
|
47
|
+
f"/filestore/{attr.get('key')}")
|
|
48
|
+
return response
|
|
49
|
+
response = FileResponse(
|
|
50
|
+
open(url, 'rb'),
|
|
51
|
+
as_attachment=True, filename=attr.get('name'))
|
|
52
|
+
return response
|
|
53
|
+
|
|
54
|
+
if get_bool(request.GET, 'redirect'):
|
|
55
|
+
return redirect(url)
|
|
56
|
+
return JsonResponse(dict(url=url))
|
|
57
|
+
|
|
58
|
+
|
|
21
59
|
class MediaRestViewMixin(ModelMixin):
|
|
22
60
|
"""Extension mixin to manage media fields."""
|
|
23
61
|
|
|
24
|
-
def _get_model_field(self, field):
|
|
25
|
-
try:
|
|
26
|
-
model_field = self.model._meta.get_field(field)
|
|
27
|
-
if not isinstance(model_field, MediaField):
|
|
28
|
-
raise NotFoundError # pragma: no cover
|
|
29
|
-
except FieldDoesNotExist: # pragma: no cover
|
|
30
|
-
raise NotFoundError
|
|
31
|
-
return model_field
|
|
32
|
-
|
|
33
62
|
@rest_api(
|
|
34
63
|
"/<int:pk>/<str:field>/upload-url/<str:filename>", method="get",
|
|
35
64
|
priority_doc=-8)
|
|
@@ -84,12 +113,11 @@ class MediaRestViewMixin(ModelMixin):
|
|
|
84
113
|
type: string
|
|
85
114
|
"""
|
|
86
115
|
obj = self.get_object(pk=pk)
|
|
87
|
-
mediaField = self.
|
|
116
|
+
mediaField = get_medial_field(self.model, field)
|
|
88
117
|
if mediaField.storage.direct:
|
|
89
118
|
raise APIError("Unavailable for direct storage")
|
|
90
119
|
try:
|
|
91
|
-
res = self.
|
|
92
|
-
self.request, obj, filename)
|
|
120
|
+
res = mediaField.get_upload_url(self.request, obj, filename)
|
|
93
121
|
except StorageException as e: # pragma: no cover
|
|
94
122
|
logger.exception(e)
|
|
95
123
|
raise APIError(_("Unexpected storage error", status=500))
|
|
@@ -135,30 +163,7 @@ class MediaRestViewMixin(ModelMixin):
|
|
|
135
163
|
if `redirect` is `true`.
|
|
136
164
|
"""
|
|
137
165
|
obj = self.get_object(pk=pk)
|
|
138
|
-
|
|
139
|
-
try:
|
|
140
|
-
url = mediaField.get_url(self.request, obj)
|
|
141
|
-
except StorageException as e: # pragma: no cover
|
|
142
|
-
logger.exception(e)
|
|
143
|
-
raise APIError(_("Unexpected storage error", status=500))
|
|
144
|
-
|
|
145
|
-
if mediaField.storage.direct:
|
|
146
|
-
filename = getattr(obj, field).get('name')
|
|
147
|
-
if settings.STORAGE_LOCAL_X_ACCEL_REDIRECT:
|
|
148
|
-
response = HttpResponse()
|
|
149
|
-
response["Content-Disposition"] = (
|
|
150
|
-
f"attachment; filename={filename}")
|
|
151
|
-
response['X-Accel-Redirect'] = (
|
|
152
|
-
f"/filestore/{getattr(obj, field).get('key')}")
|
|
153
|
-
return response
|
|
154
|
-
response = FileResponse(
|
|
155
|
-
open(mediaField.get_url(self.request, obj), 'rb'),
|
|
156
|
-
as_attachment=True, filename=getattr(obj, field).get('name'))
|
|
157
|
-
return response
|
|
158
|
-
|
|
159
|
-
if get_bool(self.request.GET, 'redirect'):
|
|
160
|
-
return redirect(url)
|
|
161
|
-
return JsonResponse(dict(url=url))
|
|
166
|
+
return get_media_field_response(obj, field, self.request)
|
|
162
167
|
|
|
163
168
|
|
|
164
169
|
class MediaPermsRestViewMixin(MediaRestViewMixin):
|
|
@@ -7,6 +7,7 @@ from .test_body_mixin import TestBodyMixin
|
|
|
7
7
|
from .test_cache import TestCache
|
|
8
8
|
from .test_client import TestApiClient
|
|
9
9
|
from .test_fields_choices import TestFieldsChoices
|
|
10
|
+
from .test_fields_date import TestFieldsDate
|
|
10
11
|
from .test_fields_decimal import TestFieldsDecimal
|
|
11
12
|
from .test_fields_minutes_duration import TestFieldsMinutesDuration
|
|
12
13
|
from .test_fields_nh3 import TestFieldsNh3
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from datetime import date
|
|
2
|
+
|
|
3
|
+
from django.db import connection, models
|
|
4
|
+
from django.test import TestCase
|
|
5
|
+
from django.test.utils import override_settings
|
|
6
|
+
from django.urls import include, path
|
|
7
|
+
|
|
8
|
+
from pfx.pfxcore import register_views
|
|
9
|
+
from pfx.pfxcore.decorator import rest_view
|
|
10
|
+
from pfx.pfxcore.models import JSONReprMixin
|
|
11
|
+
from pfx.pfxcore.test import APIClient, TestAssertMixin
|
|
12
|
+
from pfx.pfxcore.views import RestView
|
|
13
|
+
from tests.views import FakeViewMixin
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TestDateModel(JSONReprMixin, models.Model):
|
|
17
|
+
date_at = models.DateField(blank=True, null=True)
|
|
18
|
+
|
|
19
|
+
class Meta:
|
|
20
|
+
verbose_name = "TestModel"
|
|
21
|
+
verbose_name_plural = "TestModels"
|
|
22
|
+
ordering = ['pk']
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@rest_view("/test")
|
|
26
|
+
class TestDateRestView(FakeViewMixin, RestView):
|
|
27
|
+
default_public = True
|
|
28
|
+
model = TestDateModel
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
urlpatterns = [
|
|
32
|
+
path('api/', include(register_views(TestDateRestView))),
|
|
33
|
+
path('api/', include('pfx.pfxcore.urls'))
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@override_settings(ROOT_URLCONF=__name__)
|
|
38
|
+
class TestFieldsDate(TestAssertMixin, TestCase):
|
|
39
|
+
|
|
40
|
+
def setUp(self):
|
|
41
|
+
self.client = APIClient(default_locale='en')
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def setUpTestData(cls):
|
|
45
|
+
with connection.schema_editor() as schema_editor:
|
|
46
|
+
schema_editor.create_model(TestDateModel)
|
|
47
|
+
|
|
48
|
+
def test_update_null(self):
|
|
49
|
+
c1 = TestDateModel.objects.create(date_at=date(2025, 5, 3))
|
|
50
|
+
|
|
51
|
+
response = self.client.put(f'/api/test/{c1.pk}', dict(date_at=None))
|
|
52
|
+
self.assertRC(response, 200)
|
|
53
|
+
self.assertJE(response, 'date_at', None)
|
|
54
|
+
|
|
55
|
+
def test_update_empty_string(self):
|
|
56
|
+
c1 = TestDateModel.objects.create(date_at=date(2025, 5, 3))
|
|
57
|
+
|
|
58
|
+
response = self.client.put(f'/api/test/{c1.pk}', dict(date_at=""))
|
|
59
|
+
self.assertRC(response, 200)
|
|
60
|
+
self.assertJE(response, 'date_at', None)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/fields/minutes_duration_field.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.4.dev130 → django_pfx-1.4.dev134}/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
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/operations/__init__.py
RENAMED
|
File without changes
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/operations/permissions.py
RENAMED
|
File without changes
|
|
File without changes
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/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
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/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
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/welcome_email.txt
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.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/ordered_rest_view_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
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/media_redirect.py
RENAMED
|
File without changes
|
|
File without changes
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/meta_filters.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_limit.py
RENAMED
|
File without changes
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_offset.py
RENAMED
|
File without changes
|
|
File without changes
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_page_size.py
RENAMED
|
File without changes
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_page_subset.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
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_post_migrate_groups_update.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
|
{django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/dev_custom_example.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.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/migrations/0001_initial.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.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/dev_custom_example.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|