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.
Files changed (197) hide show
  1. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/PKG-INFO +1 -1
  2. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/django_pfx.egg-info/SOURCES.txt +1 -0
  4. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +2 -2
  5. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/__init__.py +5 -1
  6. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/fields.py +2 -7
  7. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/media_rest_view_mixin.py +41 -36
  8. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/__init__.py +1 -0
  9. django_pfx-1.4.dev134/tests/tests/test_fields_date.py +60 -0
  10. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/.gitignore +0 -0
  11. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/.gitlab-ci.yml +0 -0
  12. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/.pre-commit-config.yaml +0 -0
  13. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/LICENSE +0 -0
  14. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/MANIFEST.in +0 -0
  15. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/README.md +0 -0
  16. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/django_pfx.egg-info/dependency_links.txt +0 -0
  17. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/django_pfx.egg-info/requires.txt +0 -0
  18. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/django_pfx.egg-info/top_level.txt +0 -0
  19. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/Makefile +0 -0
  20. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/conf.py +0 -0
  21. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/index.rst +0 -0
  22. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/api.views.rst +0 -0
  23. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/authentication.md +0 -0
  24. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/decorator.md +0 -0
  25. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/generate_openapi.md +0 -0
  26. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/getting_started.md +0 -0
  27. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/internationalisation.md +0 -0
  28. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/model.md +0 -0
  29. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/pfx_views.md +0 -0
  30. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/profiling.md +0 -0
  31. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/settings.md +0 -0
  32. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/doc/source/testing.md +0 -0
  33. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/img/pfx.png +0 -0
  34. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/img/pfx.svg +0 -0
  35. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/make_messages +0 -0
  36. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/manage.py +0 -0
  37. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/__init__.py +0 -0
  38. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/__init__.py +0 -0
  39. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/apidoc/__init__.py +0 -0
  40. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/apidoc/parameters.py +0 -0
  41. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/apidoc/schema.py +0 -0
  42. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/apidoc/tags.py +0 -0
  43. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/apps.py +0 -0
  44. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/decorator/__init__.py +0 -0
  45. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/decorator/rest.py +0 -0
  46. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/default_settings.py +0 -0
  47. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/exceptions.py +0 -0
  48. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/fields/__init__.py +0 -0
  49. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/fields/decimal_field.py +0 -0
  50. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/fields/media_field.py +0 -0
  51. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  52. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/fields/nh3_field.py +0 -0
  53. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/http/__init__.py +0 -0
  54. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/http/json_response.py +0 -0
  55. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  56. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/management/__init__.py +0 -0
  57. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/management/commands/__init__.py +0 -0
  58. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  59. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/management/commands/profile.py +0 -0
  60. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/middleware/__init__.py +0 -0
  61. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/middleware/authentication.py +0 -0
  62. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/middleware/locale.py +0 -0
  63. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/middleware/profiling.py +0 -0
  64. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  65. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  66. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  67. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/__init__.py +0 -0
  68. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  69. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  70. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/__init__.py +0 -0
  71. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  72. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/cache_mixins.py +0 -0
  73. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/login_ban.py +0 -0
  74. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/not_null_fields.py +0 -0
  75. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  76. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  77. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/pfx_models.py +0 -0
  78. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/pfx_user.py +0 -0
  79. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  80. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/serializers/__init__.py +0 -0
  81. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/serializers/json.py +0 -0
  82. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/settings.py +0 -0
  83. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/shortcuts.py +0 -0
  84. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/storage/__init__.py +0 -0
  85. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/storage/exceptions.py +0 -0
  86. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/storage/local_storage.py +0 -0
  87. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/storage/s3_storage.py +0 -0
  88. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  89. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  90. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  91. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  92. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  93. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  94. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/test.py +0 -0
  95. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/urls.py +0 -0
  96. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/authentication_views.py +0 -0
  97. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/filters_views.py +0 -0
  98. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/locale_views.py +0 -0
  99. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  100. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  101. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  102. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/groups.py +0 -0
  103. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  104. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  105. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  106. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  107. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  108. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  109. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  110. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  111. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  112. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset.py +0 -0
  113. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  114. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  115. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  116. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  117. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  118. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/pfxcore/views/rest_views.py +0 -0
  119. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/settings/__init__.py +0 -0
  120. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pfx/settings/dev.py +0 -0
  121. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/pyproject.toml +0 -0
  122. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/requirements.txt +0 -0
  123. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/serve-doc +0 -0
  124. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/setup.cfg +0 -0
  125. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/setup.py +0 -0
  126. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/__init__.py +0 -0
  127. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/apps.py +0 -0
  128. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  129. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/migrations/0001_initial.py +0 -0
  130. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/migrations/0002_alter_book_cover.py +0 -0
  131. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/migrations/0003_book_local_file.py +0 -0
  132. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/migrations/__init__.py +0 -0
  133. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/models.py +0 -0
  134. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/settings/__init__.py +0 -0
  135. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/settings/ci.py +0 -0
  136. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/settings/common.py +0 -0
  137. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/settings/dev.py +0 -0
  138. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/settings/dev_custom_example.py +0 -0
  139. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/settings/dev_default.py +0 -0
  140. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/basic_api_errors.py +0 -0
  141. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/basic_api_test.py +0 -0
  142. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_api_doc.py +0 -0
  143. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_api_doc_search.py +0 -0
  144. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_auth_api.py +0 -0
  145. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_body_mixin.py +0 -0
  146. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_cache.py +0 -0
  147. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_client.py +0 -0
  148. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_fields_choices.py +0 -0
  149. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_fields_decimal.py +0 -0
  150. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_fields_minutes_duration.py +0 -0
  151. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_fields_nh3.py +0 -0
  152. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_filters.py +0 -0
  153. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_locale_api.py +0 -0
  154. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  155. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_perm_tests.py +0 -0
  156. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_permissions.py +0 -0
  157. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_perms_api.py +0 -0
  158. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_post_migrate_groups_update.py +0 -0
  159. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_profiling_middleware.py +0 -0
  160. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_settings.py +0 -0
  161. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_shortcuts.py +0 -0
  162. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_timezone_middleware.py +0 -0
  163. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_tools.py +0 -0
  164. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_user_queryset.py +0 -0
  165. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_view_decorators.py +0 -0
  166. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/tests/test_view_fields.py +0 -0
  167. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/urls.py +0 -0
  168. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests/views.py +0 -0
  169. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/__init__.py +0 -0
  170. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/migrations/0001_initial.py +0 -0
  171. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/migrations/__init__.py +0 -0
  172. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/__init__.py +0 -0
  173. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/ci.py +0 -0
  174. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/common.py +0 -0
  175. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/dev.py +0 -0
  176. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/dev_custom_example.py +0 -0
  177. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/settings/dev_default.py +0 -0
  178. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/tests/__init__.py +0 -0
  179. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/tests/test_api.py +0 -0
  180. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/tests/test_auth_api.py +0 -0
  181. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/urls.py +0 -0
  182. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_base_user/views.py +0 -0
  183. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/__init__.py +0 -0
  184. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/migrations/0001_initial.py +0 -0
  185. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/migrations/__init__.py +0 -0
  186. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/models.py +0 -0
  187. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/__init__.py +0 -0
  188. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/ci.py +0 -0
  189. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/common.py +0 -0
  190. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/dev.py +0 -0
  191. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/dev_custom_example.py +0 -0
  192. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/settings/dev_default.py +0 -0
  193. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/tests/__init__.py +0 -0
  194. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/tests/test_api.py +0 -0
  195. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/tests/test_auth_api.py +0 -0
  196. {django_pfx-1.4.dev130 → django_pfx-1.4.dev134}/tests_custom_user/urls.py +0 -0
  197. {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.dev130
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.dev130
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-14 11:50+0200\n"
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:95 views/media_rest_view_mixin.py:143
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 MediaPermsRestViewMixin, MediaRestViewMixin
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 == FieldType.DateField:
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._get_model_field(field)
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._get_model_field(field).get_upload_url(
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
- mediaField = self._get_model_field(field)
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