django-pfx 1.7.2.dev16__tar.gz → 1.7.3.dev4__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 (207) hide show
  1. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/PKG-INFO +1 -1
  2. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/django_pfx.egg-info/SOURCES.txt +1 -0
  4. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +3 -3
  5. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/fields.py +10 -3
  6. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/rest_views.py +32 -25
  7. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/__init__.py +1 -0
  8. django_pfx-1.7.3.dev4/tests/tests/test_fields_time.py +133 -0
  9. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/.gitignore +0 -0
  10. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/.gitlab-ci.yml +0 -0
  11. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/.pre-commit-config.yaml +0 -0
  12. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/LICENSE +0 -0
  13. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/MANIFEST.in +0 -0
  14. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/README.md +0 -0
  15. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/django_pfx.egg-info/dependency_links.txt +0 -0
  16. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/django_pfx.egg-info/requires.txt +0 -0
  17. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/django_pfx.egg-info/top_level.txt +0 -0
  18. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/Makefile +0 -0
  19. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/conf.py +0 -0
  20. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/index.rst +0 -0
  21. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/source/api.views.rst +0 -0
  22. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/source/authentication.md +0 -0
  23. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/source/decorator.md +0 -0
  24. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/source/generate_openapi.md +0 -0
  25. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/source/getting_started.md +0 -0
  26. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/source/internationalisation.md +0 -0
  27. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/source/model.md +0 -0
  28. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/source/pfx_views.md +0 -0
  29. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/source/profiling.md +0 -0
  30. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/source/settings.md +0 -0
  31. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/doc/source/testing.md +0 -0
  32. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/img/pfx.png +0 -0
  33. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/img/pfx.svg +0 -0
  34. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/make_messages +0 -0
  35. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/manage.py +0 -0
  36. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/__init__.py +0 -0
  37. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/__init__.py +0 -0
  38. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/apidoc/__init__.py +0 -0
  39. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/apidoc/parameters.py +0 -0
  40. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/apidoc/schema.py +0 -0
  41. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/apidoc/tags.py +0 -0
  42. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/apps.py +0 -0
  43. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/decorator/__init__.py +0 -0
  44. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/decorator/rest.py +0 -0
  45. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/default_settings.py +0 -0
  46. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/exceptions.py +0 -0
  47. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/fields/__init__.py +0 -0
  48. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/fields/decimal_field.py +0 -0
  49. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/fields/media_field.py +0 -0
  50. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  51. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/fields/rich_text_field.py +0 -0
  52. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/http/__init__.py +0 -0
  53. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/http/json_response.py +0 -0
  54. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  55. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/management/__init__.py +0 -0
  56. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/management/commands/__init__.py +0 -0
  57. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  58. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/management/commands/profile.py +0 -0
  59. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/middleware/__init__.py +0 -0
  60. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/middleware/authentication.py +0 -0
  61. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/middleware/locale.py +0 -0
  62. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/middleware/profiling.py +0 -0
  63. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  64. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  65. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  66. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/migrations/0004_alter_loginban_failed_counter_and_more.py +0 -0
  67. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/migrations/__init__.py +0 -0
  68. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  69. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  70. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/models/__init__.py +0 -0
  71. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  72. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/models/cache_mixins.py +0 -0
  73. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/models/login_ban.py +0 -0
  74. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/models/mfa_user_mixin.py +0 -0
  75. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/models/not_null_fields.py +0 -0
  76. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  77. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/models/pfx_models.py +0 -0
  78. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/models/pfx_user.py +0 -0
  79. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  80. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/serializers/__init__.py +0 -0
  81. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/serializers/json.py +0 -0
  82. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/settings.py +0 -0
  83. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/shortcuts.py +0 -0
  84. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/sms/__init__.py +0 -0
  85. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/sms/backends/__init__.py +0 -0
  86. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/sms/backends/base.py +0 -0
  87. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/sms/backends/console.py +0 -0
  88. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/storage/__init__.py +0 -0
  89. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/storage/exceptions.py +0 -0
  90. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/storage/local_storage.py +0 -0
  91. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/storage/s3_storage.py +0 -0
  92. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  93. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  94. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  95. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  96. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  97. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  98. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/test.py +0 -0
  99. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/urls.py +0 -0
  100. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/__init__.py +0 -0
  101. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/authentication_views.py +0 -0
  102. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/filters_views.py +0 -0
  103. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/locale_views.py +0 -0
  104. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
  105. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  106. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  107. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  108. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/groups.py +0 -0
  109. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  110. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  111. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  112. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  113. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  114. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  115. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  116. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  117. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  118. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/subset.py +0 -0
  119. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  120. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  121. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  122. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  123. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  124. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/settings/__init__.py +0 -0
  125. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pfx/settings/dev.py +0 -0
  126. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/pyproject.toml +0 -0
  127. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/requirements.txt +0 -0
  128. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/serve-doc +0 -0
  129. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/setup.cfg +0 -0
  130. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/setup.py +0 -0
  131. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/__init__.py +0 -0
  132. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/apps.py +0 -0
  133. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  134. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/migrations/0001_initial.py +0 -0
  135. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/migrations/0002_alter_book_cover.py +0 -0
  136. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/migrations/0003_book_local_file.py +0 -0
  137. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/migrations/0004_mfausermixin_fields.py +0 -0
  138. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/migrations/0005_mfausermixin_fields_fix.py +0 -0
  139. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/migrations/0006_rename_otp_enabled_user_mfa_authenticator_enabled_and_more.py +0 -0
  140. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/migrations/__init__.py +0 -0
  141. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/models.py +0 -0
  142. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/settings/__init__.py +0 -0
  143. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/settings/ci.py +0 -0
  144. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/settings/common.py +0 -0
  145. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/settings/dev.py +0 -0
  146. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/settings/dev_custom_example.py +0 -0
  147. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/settings/dev_default.py +0 -0
  148. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/basic_api_errors.py +0 -0
  149. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/basic_api_test.py +0 -0
  150. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_api_doc.py +0 -0
  151. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_api_doc_search.py +0 -0
  152. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_auth_api.py +0 -0
  153. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_body_mixin.py +0 -0
  154. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_cache.py +0 -0
  155. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_client.py +0 -0
  156. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_fields_choices.py +0 -0
  157. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_fields_date.py +0 -0
  158. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_fields_decimal.py +0 -0
  159. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_fields_minutes_duration.py +0 -0
  160. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_fields_one2many.py +0 -0
  161. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_fields_rich_text.py +0 -0
  162. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_filters.py +0 -0
  163. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_locale_api.py +0 -0
  164. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  165. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_perm_tests.py +0 -0
  166. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_permissions.py +0 -0
  167. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_perms_api.py +0 -0
  168. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_post_migrate_groups_update.py +0 -0
  169. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_profiling_middleware.py +0 -0
  170. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_settings.py +0 -0
  171. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_shortcuts.py +0 -0
  172. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_timezone_middleware.py +0 -0
  173. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_tools.py +0 -0
  174. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_user_queryset.py +0 -0
  175. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_view_decorators.py +0 -0
  176. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/tests/test_view_fields.py +0 -0
  177. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/urls.py +0 -0
  178. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests/views.py +0 -0
  179. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/__init__.py +0 -0
  180. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/migrations/0001_initial.py +0 -0
  181. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/migrations/__init__.py +0 -0
  182. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/settings/__init__.py +0 -0
  183. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/settings/ci.py +0 -0
  184. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/settings/common.py +0 -0
  185. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/settings/dev.py +0 -0
  186. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/settings/dev_custom_example.py +0 -0
  187. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/settings/dev_default.py +0 -0
  188. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/tests/__init__.py +0 -0
  189. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/tests/test_api.py +0 -0
  190. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/tests/test_auth_api.py +0 -0
  191. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/urls.py +0 -0
  192. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_base_user/views.py +0 -0
  193. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/__init__.py +0 -0
  194. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/migrations/0001_initial.py +0 -0
  195. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/migrations/__init__.py +0 -0
  196. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/models.py +0 -0
  197. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/settings/__init__.py +0 -0
  198. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/settings/ci.py +0 -0
  199. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/settings/common.py +0 -0
  200. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/settings/dev.py +0 -0
  201. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/settings/dev_custom_example.py +0 -0
  202. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/settings/dev_default.py +0 -0
  203. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/tests/__init__.py +0 -0
  204. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/tests/test_api.py +0 -0
  205. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/tests/test_auth_api.py +0 -0
  206. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/tests_custom_user/urls.py +0 -0
  207. {django_pfx-1.7.2.dev16 → django_pfx-1.7.3.dev4}/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.7.2.dev16
3
+ Version: 1.7.3.dev4
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.2.dev16
3
+ Version: 1.7.3.dev4
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
@@ -159,6 +159,7 @@ tests/tests/test_fields_decimal.py
159
159
  tests/tests/test_fields_minutes_duration.py
160
160
  tests/tests/test_fields_one2many.py
161
161
  tests/tests/test_fields_rich_text.py
162
+ tests/tests/test_fields_time.py
162
163
  tests/tests/test_filters.py
163
164
  tests/tests/test_locale_api.py
164
165
  tests/tests/test_ordered_rest_view_mixin.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: 2026-04-23 14:57+0200\n"
10
+ "POT-Creation-Date: 2026-05-12 10: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"
@@ -335,7 +335,7 @@ msgstr "Le paramètre object est requis pour move={move}."
335
335
  msgid "object {pk} does not exists in this move context."
336
336
  msgstr "object {pk} n'existe pas dans ce contexte de déplacement."
337
337
 
338
- #: views/rest_views.py:228 views/rest_views.py:400
338
+ #: views/rest_views.py:228 views/rest_views.py:385
339
339
  #, python-brace-format
340
340
  msgid "{obj} cannot be deleted because it is referenced by other objects."
341
341
  msgstr ""
@@ -351,7 +351,7 @@ msgstr "{model} {obj} créé."
351
351
  msgid "{model} {obj} updated."
352
352
  msgstr "{model} {obj} modifié."
353
353
 
354
- #: views/rest_views.py:1299
354
+ #: views/rest_views.py:1306
355
355
  #, python-brace-format
356
356
  msgid "{model} {obj} deleted."
357
357
  msgstr "{model} {obj} supprimé."
@@ -39,6 +39,7 @@ class FieldType:
39
39
  FloatField = "FloatField"
40
40
  DecimalField = "DecimalField"
41
41
  DateField = "DateField"
42
+ TimeField = "TimeField"
42
43
  DateTimeField = "DateTimeField"
43
44
  MinutesDurationField = "MinutesDurationField"
44
45
  MediaField = "MediaField"
@@ -57,6 +58,7 @@ class FieldType:
57
58
  (models.DecimalField, DecimalField),
58
59
  (models.DateTimeField, DateTimeField),
59
60
  (models.DateField, DateField),
61
+ (models.TimeField, TimeField),
60
62
  (models.TextField, TextField),
61
63
  (models.CharField, CharField),
62
64
  (models.URLField, CharField),
@@ -78,6 +80,7 @@ class FieldType:
78
80
  FloatField: "number",
79
81
  DecimalField: "string",
80
82
  DateField: "string",
83
+ TimeField: "string",
81
84
  DateTimeField: "string",
82
85
  MinutesDurationField: "object",
83
86
  MediaField: "object",
@@ -305,9 +308,11 @@ class ViewField:
305
308
  def to_apidoc(self, request=False):
306
309
  res = dict(type=FieldType.to_apidoc(self.field_type))
307
310
  if self.field_type == FieldType.DateField:
308
- res['format'] = 'date'
311
+ res['format'] = 'date' # Official specification name.
312
+ elif self.field_type == FieldType.TimeField:
313
+ res['format'] = 'time' # Custom name, does no exists.
309
314
  elif self.field_type == FieldType.DateTimeField:
310
- res['format'] = 'date-time'
315
+ res['format'] = 'date-time' # Official specification name.
311
316
  elif self.field_type == FieldType.ModelObject:
312
317
  properties = {}
313
318
  if self.related_model:
@@ -442,7 +447,9 @@ class ViewModelField(ViewField):
442
447
  value = (value['value']
443
448
  if isinstance(value, dict) and 'value' in value
444
449
  else value)
445
- elif self.field_type in (FieldType.DateField, FieldType.DateTimeField):
450
+ elif self.field_type in (
451
+ FieldType.DateField, FieldType.TimeField,
452
+ FieldType.DateTimeField):
446
453
  try:
447
454
  value = value and field.to_python(value) or None
448
455
  except ValidationError as e:
@@ -368,22 +368,7 @@ class ModelResponseMixin(ModelMixin):
368
368
  message=f(
369
369
  message, model=self.model_name, obj=object))
370
370
 
371
- def is_valid(self, obj, created=False, rel_data=None):
372
- """Persist an object instance changes and build default response.
373
-
374
- The default response contains the serialized instance after save and
375
- a text message.
376
-
377
- You can use :code:`rel_data` to pass values to set on related fields
378
- after instance is persisted (to avoid errors if the instance does
379
- not exists in database).
380
-
381
- :param obj: The object instance
382
- :param created: If object instance is created
383
- :param rel_data: Values to set on related fields
384
- :returns: The JSON response
385
- :rtype: :class:`JsonResponse`
386
- """
371
+ def _save(self, obj, created=False, rel_data=None):
387
372
  with transaction.atomic():
388
373
  funcs = self.pre_save(obj, created=created)
389
374
  obj.save()
@@ -412,6 +397,24 @@ class ModelResponseMixin(ModelMixin):
412
397
  prev = o
413
398
  getattr(obj, k).set(v)
414
399
  self.post_save(obj, created=created, funcs=funcs)
400
+
401
+ def is_valid(self, obj, created=False, rel_data=None):
402
+ """Persist an object instance changes and build default response.
403
+
404
+ The default response contains the serialized instance after save and
405
+ a text message.
406
+
407
+ You can use :code:`rel_data` to pass values to set on related fields
408
+ after instance is persisted (to avoid errors if the instance does
409
+ not exists in database).
410
+
411
+ :param obj: The object instance
412
+ :param created: If object instance is created
413
+ :param rel_data: Values to set on related fields
414
+ :returns: The JSON response
415
+ :rtype: :class:`JsonResponse`
416
+ """
417
+ self._save(obj, created, rel_data)
415
418
  obj = self.get_object(pk=obj.pk)
416
419
  return self.response(
417
420
  obj, **self.is_valid_response_meta(obj, created=created))
@@ -1229,18 +1232,22 @@ class UpdateRestViewMixin(ModelBodyMixin, ModelResponseMixin):
1229
1232
  """
1230
1233
  return True
1231
1234
 
1235
+ def _fill_and_validate(self, obj):
1236
+ data, rel_data = self.get_model_data(
1237
+ obj, self.deserialize_body(), created=False)
1238
+ forbidden = False
1239
+ if not self.object_update_perm(obj, data):
1240
+ forbidden = True
1241
+ self.set_values(obj, **data)
1242
+ self.validate(obj, rel_data=rel_data, created=False)
1243
+ if forbidden:
1244
+ raise ForbiddenError
1245
+ return rel_data
1246
+
1232
1247
  def _put(self, id, *args, **kwargs):
1233
1248
  try:
1234
1249
  obj = self.get_object(pk=id)
1235
- data, rel_data = self.get_model_data(
1236
- obj, self.deserialize_body(), created=False)
1237
- forbidden = False
1238
- if not self.object_update_perm(obj, data):
1239
- forbidden = True
1240
- self.set_values(obj, **data)
1241
- self.validate(obj, rel_data=rel_data, created=False)
1242
- if forbidden:
1243
- raise ForbiddenError
1250
+ rel_data = self._fill_and_validate(obj)
1244
1251
  return self.is_valid(obj, created=False, rel_data=rel_data)
1245
1252
  except ValidationError as e:
1246
1253
  return self.is_invalid(obj, errors=e)
@@ -12,6 +12,7 @@ from .test_fields_decimal import TestFieldsDecimal
12
12
  from .test_fields_minutes_duration import TestFieldsMinutesDuration
13
13
  from .test_fields_one2many import TestFieldsOne2Many
14
14
  from .test_fields_rich_text import TestFieldsRichText
15
+ from .test_fields_time import TestFieldsTime
15
16
  from .test_filters import FiltersTest
16
17
  from .test_locale_api import LocaleAPITest
17
18
  from .test_ordered_rest_view_mixin import TestOrderedRestViewMixin
@@ -0,0 +1,133 @@
1
+ from datetime import time
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 ModelFilter, RestView
13
+ from tests.views import FakeViewMixin
14
+
15
+
16
+ class TestTimeModel(JSONReprMixin, models.Model):
17
+ test_time = models.TimeField("Test Time Field", 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 TestTimeRestView(FakeViewMixin, RestView):
27
+ default_public = True
28
+ model = TestTimeModel
29
+
30
+ filters = [ModelFilter(TestTimeModel, 'test_time')]
31
+
32
+
33
+ urlpatterns = [
34
+ path('api/', include(register_views(TestTimeRestView))),
35
+ path('api/', include('pfx.pfxcore.urls'))
36
+ ]
37
+
38
+
39
+ @override_settings(ROOT_URLCONF=__name__)
40
+ class TestFieldsTime(TestAssertMixin, TestCase):
41
+
42
+ def setUp(self):
43
+ self.client = APIClient(default_locale='en')
44
+
45
+ @classmethod
46
+ def setUpTestData(cls):
47
+ with connection.schema_editor() as schema_editor:
48
+ schema_editor.create_model(TestTimeModel)
49
+
50
+ def test_meta(self):
51
+ res = self.client.get('/api/test/meta')
52
+ self.assertJE(res, 'fields.test_time.type', 'TimeField')
53
+ self.assertJE(res, 'fields.test_time.db_type', 'TimeField')
54
+ self.assertJE(res, 'fields.test_time.name', 'Test Time Field')
55
+
56
+ def test_get(self):
57
+ c1 = TestTimeModel.objects.create(test_time=time(14, 20))
58
+
59
+ res = self.client.get(f'/api/test/{c1.pk}')
60
+ self.assertRC(res, 200)
61
+ self.assertJE(res, 'test_time', '14:20:00')
62
+
63
+ def test_create(self):
64
+ res = self.client.post('/api/test', dict(
65
+ test_time='14:20'))
66
+ self.assertRC(res, 200)
67
+ self.assertJE(res, 'test_time', '14:20:00')
68
+
69
+ def test_create_null(self):
70
+ res = self.client.post('/api/test', dict(
71
+ test_time=None))
72
+ self.assertRC(res, 200)
73
+ self.assertJE(res, 'test_time', None)
74
+
75
+ def test_create_invalid(self):
76
+ res = self.client.post('/api/test', dict(
77
+ test_time='invalid'))
78
+ self.assertRC(res, 422)
79
+ self.assertJE(res, 'test_time', [
80
+ "“invalid” value has an invalid format. "
81
+ "It must be in HH:MM[:ss[.uuuuuu]] format."])
82
+
83
+ def test_update(self):
84
+ c1 = TestTimeModel.objects.create(test_time=time(14, 20))
85
+
86
+ res = self.client.put(f'/api/test/{c1.pk}', dict(
87
+ test_time='15:32'))
88
+ self.assertRC(res, 200)
89
+ self.assertJE(res, 'test_time', '15:32:00')
90
+
91
+ def test_update_null(self):
92
+ c1 = TestTimeModel.objects.create(test_time=time(14, 20))
93
+
94
+ res = self.client.put(f'/api/test/{c1.pk}', dict(
95
+ test_time=None))
96
+ self.assertRC(res, 200)
97
+ self.assertJE(res, 'test_time', None)
98
+
99
+ def test_list_order(self):
100
+ c1 = TestTimeModel.objects.create(test_time=time(14, 20))
101
+ c2 = TestTimeModel.objects.create(test_time=time(14, 21))
102
+ c3 = TestTimeModel.objects.create(test_time=time(22, 1))
103
+
104
+ res = self.client.get('/api/test?order=test_time')
105
+ self.assertRC(res, 200)
106
+ self.assertEqual(
107
+ [self.get_val(c, 'pk') for c in self.get_val(res, 'items')],
108
+ [c1.pk, c2.pk, c3.pk])
109
+
110
+ res = self.client.get('/api/test?order=-test_time')
111
+ self.assertRC(res, 200)
112
+ self.assertEqual(
113
+ [self.get_val(c, 'pk') for c in self.get_val(res, 'items')],
114
+ [c3.pk, c2.pk, c1.pk])
115
+
116
+ def test_list_filter(self):
117
+ TestTimeModel.objects.create(test_time=time(14, 20))
118
+ c2 = TestTimeModel.objects.create(test_time=time(14, 21))
119
+ c3 = TestTimeModel.objects.create(test_time=time(22, 1))
120
+
121
+ res = self.client.get('/api/test', dict(test_time='14:21:00'))
122
+ self.assertRC(res, 200)
123
+ self.assertSize(res, 'items', 1)
124
+ self.assertJE(res, 'items.@0.pk', c2.pk)
125
+
126
+ res = self.client.get('/api/test', dict(test_time='22:01'))
127
+ self.assertRC(res, 200)
128
+ self.assertSize(res, 'items', 1)
129
+ self.assertJE(res, 'items.@0.pk', c3.pk)
130
+
131
+ res = self.client.get('/api/test', dict(test_time='10:01'))
132
+ self.assertRC(res, 200)
133
+ self.assertSize(res, 'items', 0)