django-pfx 1.4.dev118__tar.gz → 1.4.dev122__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 (196) hide show
  1. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/PKG-INFO +1 -1
  2. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  4. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +10 -5
  5. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/models/pfx_models.py +3 -1
  6. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/shortcuts.py +17 -0
  7. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/fields.py +6 -0
  8. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_shortcuts.py +28 -0
  9. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/.gitignore +0 -0
  10. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/.gitlab-ci.yml +0 -0
  11. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/.pre-commit-config.yaml +0 -0
  12. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/LICENSE +0 -0
  13. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/MANIFEST.in +0 -0
  14. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/README.md +0 -0
  15. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/django_pfx.egg-info/SOURCES.txt +0 -0
  16. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/django_pfx.egg-info/dependency_links.txt +0 -0
  17. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/django_pfx.egg-info/requires.txt +0 -0
  18. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/django_pfx.egg-info/top_level.txt +0 -0
  19. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/Makefile +0 -0
  20. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/conf.py +0 -0
  21. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/index.rst +0 -0
  22. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/source/api.views.rst +0 -0
  23. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/source/authentication.md +0 -0
  24. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/source/decorator.md +0 -0
  25. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/source/generate_openapi.md +0 -0
  26. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/source/getting_started.md +0 -0
  27. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/source/internationalisation.md +0 -0
  28. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/source/model.md +0 -0
  29. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/source/pfx_views.md +0 -0
  30. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/source/profiling.md +0 -0
  31. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/source/settings.md +0 -0
  32. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/doc/source/testing.md +0 -0
  33. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/img/pfx.png +0 -0
  34. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/img/pfx.svg +0 -0
  35. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/make_messages +0 -0
  36. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/manage.py +0 -0
  37. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/__init__.py +0 -0
  38. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/__init__.py +0 -0
  39. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/apidoc/__init__.py +0 -0
  40. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/apidoc/parameters.py +0 -0
  41. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/apidoc/schema.py +0 -0
  42. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/apidoc/tags.py +0 -0
  43. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/apps.py +0 -0
  44. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/decorator/__init__.py +0 -0
  45. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/decorator/rest.py +0 -0
  46. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/default_settings.py +0 -0
  47. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/exceptions.py +0 -0
  48. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/fields/__init__.py +0 -0
  49. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/fields/decimal_field.py +0 -0
  50. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/fields/media_field.py +0 -0
  51. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  52. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/fields/nh3_field.py +0 -0
  53. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/http/__init__.py +0 -0
  54. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/http/json_response.py +0 -0
  55. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/management/__init__.py +0 -0
  56. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/management/commands/__init__.py +0 -0
  57. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  58. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/management/commands/profile.py +0 -0
  59. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/middleware/__init__.py +0 -0
  60. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/middleware/authentication.py +0 -0
  61. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/middleware/locale.py +0 -0
  62. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/middleware/profiling.py +0 -0
  63. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  64. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  65. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  66. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/migrations/__init__.py +0 -0
  67. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  68. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  69. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/models/__init__.py +0 -0
  70. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  71. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/models/cache_mixins.py +0 -0
  72. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/models/login_ban.py +0 -0
  73. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/models/not_null_fields.py +0 -0
  74. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  75. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  76. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/models/pfx_user.py +0 -0
  77. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  78. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/serializers/__init__.py +0 -0
  79. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/serializers/json.py +0 -0
  80. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/settings.py +0 -0
  81. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/storage/__init__.py +0 -0
  82. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/storage/exceptions.py +0 -0
  83. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/storage/local_storage.py +0 -0
  84. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/storage/s3_storage.py +0 -0
  85. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  86. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  87. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  88. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  89. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  90. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  91. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/test.py +0 -0
  92. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/urls.py +0 -0
  93. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/__init__.py +0 -0
  94. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/authentication_views.py +0 -0
  95. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/filters_views.py +0 -0
  96. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/locale_views.py +0 -0
  97. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
  98. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  99. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  100. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  101. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/groups.py +0 -0
  102. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  103. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  104. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  105. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  106. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  107. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  108. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  109. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  110. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  111. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/subset.py +0 -0
  112. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  113. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  114. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  115. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  116. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  117. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/pfxcore/views/rest_views.py +0 -0
  118. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/settings/__init__.py +0 -0
  119. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pfx/settings/dev.py +0 -0
  120. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/pyproject.toml +0 -0
  121. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/requirements.txt +0 -0
  122. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/serve-doc +0 -0
  123. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/setup.cfg +0 -0
  124. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/setup.py +0 -0
  125. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/__init__.py +0 -0
  126. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/apps.py +0 -0
  127. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  128. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/migrations/0001_initial.py +0 -0
  129. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/migrations/0002_alter_book_cover.py +0 -0
  130. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/migrations/0003_book_local_file.py +0 -0
  131. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/migrations/__init__.py +0 -0
  132. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/models.py +0 -0
  133. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/settings/__init__.py +0 -0
  134. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/settings/ci.py +0 -0
  135. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/settings/common.py +0 -0
  136. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/settings/dev.py +0 -0
  137. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/settings/dev_custom_example.py +0 -0
  138. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/settings/dev_default.py +0 -0
  139. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/__init__.py +0 -0
  140. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/basic_api_errors.py +0 -0
  141. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/basic_api_test.py +0 -0
  142. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_api_doc.py +0 -0
  143. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_api_doc_search.py +0 -0
  144. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_auth_api.py +0 -0
  145. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_body_mixin.py +0 -0
  146. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_cache.py +0 -0
  147. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_client.py +0 -0
  148. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_fields_choices.py +0 -0
  149. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_fields_decimal.py +0 -0
  150. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_fields_minutes_duration.py +0 -0
  151. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_fields_nh3.py +0 -0
  152. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_filters.py +0 -0
  153. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_locale_api.py +0 -0
  154. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  155. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_perm_tests.py +0 -0
  156. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_permissions.py +0 -0
  157. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_perms_api.py +0 -0
  158. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_post_migrate_groups_update.py +0 -0
  159. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_profiling_middleware.py +0 -0
  160. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_settings.py +0 -0
  161. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_timezone_middleware.py +0 -0
  162. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_tools.py +0 -0
  163. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_user_queryset.py +0 -0
  164. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_view_decorators.py +0 -0
  165. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/tests/test_view_fields.py +0 -0
  166. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/urls.py +0 -0
  167. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests/views.py +0 -0
  168. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/__init__.py +0 -0
  169. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/migrations/0001_initial.py +0 -0
  170. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/migrations/__init__.py +0 -0
  171. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/settings/__init__.py +0 -0
  172. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/settings/ci.py +0 -0
  173. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/settings/common.py +0 -0
  174. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/settings/dev.py +0 -0
  175. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/settings/dev_custom_example.py +0 -0
  176. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/settings/dev_default.py +0 -0
  177. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/tests/__init__.py +0 -0
  178. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/tests/test_api.py +0 -0
  179. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/tests/test_auth_api.py +0 -0
  180. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/urls.py +0 -0
  181. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_base_user/views.py +0 -0
  182. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/__init__.py +0 -0
  183. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/migrations/0001_initial.py +0 -0
  184. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/migrations/__init__.py +0 -0
  185. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/models.py +0 -0
  186. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/settings/__init__.py +0 -0
  187. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/settings/ci.py +0 -0
  188. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/settings/common.py +0 -0
  189. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/settings/dev.py +0 -0
  190. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/settings/dev_custom_example.py +0 -0
  191. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/settings/dev_default.py +0 -0
  192. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/tests/__init__.py +0 -0
  193. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/tests/test_api.py +0 -0
  194. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/tests/test_auth_api.py +0 -0
  195. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/tests_custom_user/urls.py +0 -0
  196. {django_pfx-1.4.dev118 → django_pfx-1.4.dev122}/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.dev118
3
+ Version: 1.4.dev122
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.dev118
3
+ Version: 1.4.dev122
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
@@ -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-04-08 13:56+0200\n"
10
+ "POT-Creation-Date: 2025-04-16 11:28+0200\n"
11
11
  "PO-Revision-Date: 2021-06-22 23:31+0200\n"
12
12
  "Last-Translator: \n"
13
13
  "Language-Team: \n"
@@ -112,22 +112,27 @@ msgstr "OTP activé"
112
112
  msgid "%(model_name)s with this %(field_labels)s already exists."
113
113
  msgstr "%(model_name)s avec ce/cette %(field_labels)s éxiste déjà."
114
114
 
115
- #: shortcuts.py:50
115
+ #: shortcuts.py:51
116
116
  #, python-brace-format
117
117
  msgid "{key} must be an integer number."
118
118
  msgstr "{key} doit être un nombre entier."
119
119
 
120
- #: shortcuts.py:66
120
+ #: shortcuts.py:67
121
121
  #, python-brace-format
122
122
  msgid "{key} must be a number."
123
123
  msgstr "{key} doit être un nombre."
124
124
 
125
- #: shortcuts.py:82
125
+ #: shortcuts.py:83
126
+ #, python-brace-format
127
+ msgid "{key} must be a decimal number."
128
+ msgstr "{key} doit être un nombre décimal."
129
+
130
+ #: shortcuts.py:99
126
131
  #, python-brace-format
127
132
  msgid "{key} must be a date."
128
133
  msgstr "{key} doit être une date."
129
134
 
130
- #: shortcuts.py:103
135
+ #: shortcuts.py:120
131
136
  #, python-brace-format
132
137
  msgid "{key} must be “true”, “false”, “1”, “0” or empty."
133
138
  msgstr "{key} doit être « true », « false », « 1 », « 0 » ou vide"
@@ -24,6 +24,7 @@ class JSONReprMixin():
24
24
  """A model mixin to manage JSON representation."""
25
25
  api = None
26
26
  url = None
27
+ URL_AUTO_PK = True
27
28
  apidoc = {}
28
29
 
29
30
  def __init__(self, *args, **kw):
@@ -51,7 +52,8 @@ class JSONReprMixin():
51
52
  res['resource_api'] = f"{self.api}/{self.pk}"
52
53
  url = self.get_url()
53
54
  if url:
54
- res['resource_url'] = f"{url}/{self.pk}"
55
+ res['resource_url'] = (
56
+ self.URL_AUTO_PK and f"{url}/{self.pk}" or url)
55
57
  res.update(**values)
56
58
  return res
57
59
 
@@ -1,6 +1,7 @@
1
1
 
2
2
  import logging
3
3
  from datetime import date
4
+ from decimal import Decimal as D
4
5
 
5
6
  from django.core.exceptions import ObjectDoesNotExist
6
7
  from django.utils.translation import gettext_lazy as _
@@ -66,6 +67,22 @@ def get_float(data, key, default=None):
66
67
  raise APIError(f(_("{key} must be a number."), key=key))
67
68
 
68
69
 
70
+ def parse_decimal(value):
71
+ if is_null(value):
72
+ return None
73
+ return D(value)
74
+
75
+
76
+ def get_decimal(data, key, default=None):
77
+ if key not in data:
78
+ return default
79
+ try:
80
+ return parse_decimal(data.get(key))
81
+ except Exception:
82
+ from pfx.pfxcore.exceptions import APIError
83
+ raise APIError(f(_("{key} must be a decimal number."), key=key))
84
+
85
+
69
86
  def parse_date(value):
70
87
  if is_null(value):
71
88
  return None
@@ -56,6 +56,7 @@ class FieldType:
56
56
  (models.URLField, CharField),
57
57
  (models.UUIDField, CharField),
58
58
  (models.ForeignObject, ModelObject),
59
+ (models.OneToOneRel, ModelObject),
59
60
  (models.ForeignObjectRel, ModelObjectList),
60
61
  (models.ManyToManyField, ModelObjectList),
61
62
  (models.JSONField, JsonObject),
@@ -111,6 +112,7 @@ class ViewField:
111
112
  self.related_model_api = related_model_api
112
113
  self.select_related = select_related or []
113
114
  self.prefetch_related = prefetch_related or []
115
+ self.model_field = None
114
116
 
115
117
  def is_readonly(self, created=False):
116
118
  return self.readonly_create if created else self.readonly_update
@@ -136,6 +138,10 @@ class ViewField:
136
138
  obj = operator.attrgetter(path)(obj)
137
139
  else:
138
140
  name = self.name
141
+ if (self.model_field and
142
+ 'reverse_related' in str(type(self.model_field)) and
143
+ not hasattr(obj, name)):
144
+ return None
139
145
  return getattr(obj, name)
140
146
 
141
147
  def _json_repr(self, value):
@@ -1,4 +1,5 @@
1
1
  from datetime import date
2
+ from decimal import Decimal as D
2
3
 
3
4
  from django.test import TestCase
4
5
 
@@ -7,6 +8,7 @@ from pfx.pfxcore.shortcuts import (
7
8
  f,
8
9
  get_bool,
9
10
  get_date,
11
+ get_decimal,
10
12
  get_float,
11
13
  get_int,
12
14
  get_object,
@@ -157,6 +159,32 @@ class ShortcutTest(TestAssertMixin, TestCase):
157
159
  self.assertEqual(get_float(
158
160
  vals, 'does_not_exists', default=3.14159265359), 3.14159265359)
159
161
 
162
+ def test_get_decimal(self):
163
+ vals = dict(
164
+ none=None,
165
+ empty='',
166
+ null='null',
167
+ undefined='undefined',
168
+ zero='0',
169
+ integer='3',
170
+ negative='-7.45',
171
+ positive='13.57',
172
+ invalid='INVALID')
173
+ self.assertIsNone(get_decimal(vals, 'none'))
174
+ self.assertIsNone(get_decimal(vals, 'empty'))
175
+ self.assertIsNone(get_decimal(vals, 'null'))
176
+ self.assertIsNone(get_decimal(vals, 'undefined'))
177
+ self.assertEqual(get_decimal(vals, 'zero'), D('0'))
178
+ self.assertEqual(get_decimal(vals, 'integer'), D('3'))
179
+ self.assertEqual(get_decimal(vals, 'negative'), D('-7.45'))
180
+ self.assertEqual(get_decimal(vals, 'positive'), D('13.57'))
181
+ with self.assertRaises(APIError):
182
+ get_decimal(vals, 'invalid')
183
+ self.assertIs(get_decimal(vals, 'does_not_exists'), None)
184
+ self.assertEqual(get_decimal(
185
+ vals, 'does_not_exists',
186
+ default=D('3.14159265359')), D('3.14159265359'))
187
+
160
188
  def test_parse_date(self):
161
189
  self.assertIsNone(parse_date(None))
162
190
  self.assertIsNone(parse_date(''))
File without changes