django-pfx 1.4.dev146__tar.gz → 1.4.dev150__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 (198) hide show
  1. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/PKG-INFO +1 -1
  2. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +5 -5
  4. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/fields.py +24 -4
  5. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/rest_views.py +12 -1
  6. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_fields_one2many.py +19 -0
  7. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/.gitignore +0 -0
  8. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/.gitlab-ci.yml +0 -0
  9. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/.pre-commit-config.yaml +0 -0
  10. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/LICENSE +0 -0
  11. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/MANIFEST.in +0 -0
  12. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/README.md +0 -0
  13. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/django_pfx.egg-info/SOURCES.txt +0 -0
  14. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/django_pfx.egg-info/dependency_links.txt +0 -0
  15. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/django_pfx.egg-info/requires.txt +0 -0
  16. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/django_pfx.egg-info/top_level.txt +0 -0
  17. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/Makefile +0 -0
  18. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/conf.py +0 -0
  19. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/index.rst +0 -0
  20. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/source/api.views.rst +0 -0
  21. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/source/authentication.md +0 -0
  22. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/source/decorator.md +0 -0
  23. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/source/generate_openapi.md +0 -0
  24. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/source/getting_started.md +0 -0
  25. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/source/internationalisation.md +0 -0
  26. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/source/model.md +0 -0
  27. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/source/pfx_views.md +0 -0
  28. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/source/profiling.md +0 -0
  29. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/source/settings.md +0 -0
  30. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/doc/source/testing.md +0 -0
  31. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/img/pfx.png +0 -0
  32. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/img/pfx.svg +0 -0
  33. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/make_messages +0 -0
  34. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/manage.py +0 -0
  35. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/__init__.py +0 -0
  36. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/__init__.py +0 -0
  37. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/apidoc/__init__.py +0 -0
  38. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/apidoc/parameters.py +0 -0
  39. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/apidoc/schema.py +0 -0
  40. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/apidoc/tags.py +0 -0
  41. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/apps.py +0 -0
  42. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/decorator/__init__.py +0 -0
  43. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/decorator/rest.py +0 -0
  44. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/default_settings.py +0 -0
  45. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/exceptions.py +0 -0
  46. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/fields/__init__.py +0 -0
  47. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/fields/decimal_field.py +0 -0
  48. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/fields/media_field.py +0 -0
  49. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  50. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/fields/nh3_field.py +0 -0
  51. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/http/__init__.py +0 -0
  52. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/http/json_response.py +0 -0
  53. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  54. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/management/__init__.py +0 -0
  55. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/management/commands/__init__.py +0 -0
  56. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  57. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/management/commands/profile.py +0 -0
  58. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/middleware/__init__.py +0 -0
  59. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/middleware/authentication.py +0 -0
  60. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/middleware/locale.py +0 -0
  61. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/middleware/profiling.py +0 -0
  62. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  63. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  64. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  65. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/migrations/__init__.py +0 -0
  66. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  67. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  68. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/models/__init__.py +0 -0
  69. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  70. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/models/cache_mixins.py +0 -0
  71. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/models/login_ban.py +0 -0
  72. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/models/not_null_fields.py +0 -0
  73. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  74. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  75. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/models/pfx_models.py +0 -0
  76. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/models/pfx_user.py +0 -0
  77. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  78. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/serializers/__init__.py +0 -0
  79. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/serializers/json.py +0 -0
  80. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/settings.py +0 -0
  81. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/shortcuts.py +0 -0
  82. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/storage/__init__.py +0 -0
  83. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/storage/exceptions.py +0 -0
  84. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/storage/local_storage.py +0 -0
  85. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/storage/s3_storage.py +0 -0
  86. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  87. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  88. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  89. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  90. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  91. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  92. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/test.py +0 -0
  93. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/urls.py +0 -0
  94. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/__init__.py +0 -0
  95. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/authentication_views.py +0 -0
  96. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/filters_views.py +0 -0
  97. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/locale_views.py +0 -0
  98. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
  99. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  100. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  101. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  102. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/groups.py +0 -0
  103. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  104. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  105. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  106. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  107. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  108. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  109. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  110. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  111. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  112. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/subset.py +0 -0
  113. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  114. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  115. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  116. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  117. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  118. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/settings/__init__.py +0 -0
  119. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pfx/settings/dev.py +0 -0
  120. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/pyproject.toml +0 -0
  121. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/requirements.txt +0 -0
  122. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/serve-doc +0 -0
  123. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/setup.cfg +0 -0
  124. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/setup.py +0 -0
  125. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/__init__.py +0 -0
  126. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/apps.py +0 -0
  127. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  128. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/migrations/0001_initial.py +0 -0
  129. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/migrations/0002_alter_book_cover.py +0 -0
  130. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/migrations/0003_book_local_file.py +0 -0
  131. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/migrations/__init__.py +0 -0
  132. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/models.py +0 -0
  133. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/settings/__init__.py +0 -0
  134. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/settings/ci.py +0 -0
  135. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/settings/common.py +0 -0
  136. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/settings/dev.py +0 -0
  137. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/settings/dev_custom_example.py +0 -0
  138. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/settings/dev_default.py +0 -0
  139. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/__init__.py +0 -0
  140. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/basic_api_errors.py +0 -0
  141. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/basic_api_test.py +0 -0
  142. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_api_doc.py +0 -0
  143. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_api_doc_search.py +0 -0
  144. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_auth_api.py +0 -0
  145. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_body_mixin.py +0 -0
  146. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_cache.py +0 -0
  147. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_client.py +0 -0
  148. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_fields_choices.py +0 -0
  149. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_fields_date.py +0 -0
  150. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_fields_decimal.py +0 -0
  151. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_fields_minutes_duration.py +0 -0
  152. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_fields_nh3.py +0 -0
  153. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_filters.py +0 -0
  154. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_locale_api.py +0 -0
  155. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  156. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_perm_tests.py +0 -0
  157. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_permissions.py +0 -0
  158. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_perms_api.py +0 -0
  159. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_post_migrate_groups_update.py +0 -0
  160. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_profiling_middleware.py +0 -0
  161. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_settings.py +0 -0
  162. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_shortcuts.py +0 -0
  163. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_timezone_middleware.py +0 -0
  164. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_tools.py +0 -0
  165. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_user_queryset.py +0 -0
  166. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_view_decorators.py +0 -0
  167. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/tests/test_view_fields.py +0 -0
  168. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/urls.py +0 -0
  169. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests/views.py +0 -0
  170. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/__init__.py +0 -0
  171. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/migrations/0001_initial.py +0 -0
  172. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/migrations/__init__.py +0 -0
  173. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/settings/__init__.py +0 -0
  174. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/settings/ci.py +0 -0
  175. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/settings/common.py +0 -0
  176. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/settings/dev.py +0 -0
  177. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/settings/dev_custom_example.py +0 -0
  178. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/settings/dev_default.py +0 -0
  179. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/tests/__init__.py +0 -0
  180. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/tests/test_api.py +0 -0
  181. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/tests/test_auth_api.py +0 -0
  182. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/urls.py +0 -0
  183. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_base_user/views.py +0 -0
  184. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/__init__.py +0 -0
  185. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/migrations/0001_initial.py +0 -0
  186. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/migrations/__init__.py +0 -0
  187. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/models.py +0 -0
  188. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/settings/__init__.py +0 -0
  189. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/settings/ci.py +0 -0
  190. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/settings/common.py +0 -0
  191. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/settings/dev.py +0 -0
  192. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/settings/dev_custom_example.py +0 -0
  193. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/settings/dev_default.py +0 -0
  194. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/tests/__init__.py +0 -0
  195. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/tests/test_api.py +0 -0
  196. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/tests/test_auth_api.py +0 -0
  197. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/tests_custom_user/urls.py +0 -0
  198. {django_pfx-1.4.dev146 → django_pfx-1.4.dev150}/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.dev146
3
+ Version: 1.4.dev150
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.dev146
3
+ Version: 1.4.dev150
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-09-11 10:12+0200\n"
10
+ "POT-Creation-Date: 2025-09-16 10: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"
@@ -286,23 +286,23 @@ msgstr "Le paramètre object est requis pour move={move}."
286
286
  msgid "object {pk} does not exists in this move context."
287
287
  msgstr "object {pk} n'existe pas dans ce contexte de déplacement."
288
288
 
289
- #: views/rest_views.py:220
289
+ #: views/rest_views.py:220 views/rest_views.py:381
290
290
  #, python-brace-format
291
291
  msgid "{obj} cannot be deleted because it is referenced by other objects."
292
292
  msgstr ""
293
293
  "{obj} ne peut pas être supprimé car il est référencé par d’autres objets."
294
294
 
295
- #: views/rest_views.py:344
295
+ #: views/rest_views.py:345
296
296
  #, python-brace-format
297
297
  msgid "{model} {obj} created."
298
298
  msgstr "{model} {obj} créé."
299
299
 
300
- #: views/rest_views.py:345
300
+ #: views/rest_views.py:346
301
301
  #, python-brace-format
302
302
  msgid "{model} {obj} updated."
303
303
  msgstr "{model} {obj} modifié."
304
304
 
305
- #: views/rest_views.py:1213
305
+ #: views/rest_views.py:1224
306
306
  #, python-brace-format
307
307
  msgid "{model} {obj} deleted."
308
308
  msgstr "{model} {obj} supprimé."
@@ -93,9 +93,20 @@ class FieldType:
93
93
  return cls.APIDOC_FIELD_BINDING.get(field_type)
94
94
 
95
95
 
96
+ def get_db_type(field):
97
+ if isinstance(field, models.ManyToManyRel):
98
+ return "ManyToManyField"
99
+ elif isinstance(field, models.ManyToOneRel):
100
+ return "OneToManyField"
101
+ elif isinstance(field, models.OneToOneRel):
102
+ return "OneToOneField"
103
+ return field.__class__.__name__
104
+
105
+
96
106
  class ViewField:
97
107
  def __init__(
98
- self, name, verbose_name=None, alias=None, field_type=None,
108
+ self, name, verbose_name=None, alias=None,
109
+ field_type=None, db_type=None,
99
110
  readonly=False, readonly_create=False, readonly_update=False,
100
111
  choices=None, json_repr=None, media_field_api=None,
101
112
  related_model=None, related_model_api=None, related_fields=None,
@@ -106,6 +117,7 @@ class ViewField:
106
117
  self.readonly_update = readonly or readonly_update
107
118
  self.verbose_name = verbose_name or name
108
119
  self.field_type = field_type
120
+ self.db_type = db_type
109
121
  self.choices = dict(choices or [])
110
122
  self.json_repr = json_repr
111
123
  self.media_field_api = media_field_api
@@ -123,7 +135,8 @@ class ViewField:
123
135
  return self.readonly_create if created else self.readonly_update
124
136
 
125
137
  def meta(self):
126
- res = dict(type=self.field_type, name=self.verbose_name)
138
+ res = dict(
139
+ type=self.field_type, db_type=self.db_type, name=self.verbose_name)
127
140
  if self.choices:
128
141
  res['choices'] = [
129
142
  dict(label=str(v), value=k) for k, v in self.choices.items()]
@@ -206,12 +219,15 @@ class ViewField:
206
219
  verbose_name = getattr(
207
220
  prop.fget, 'short_description', prop.fget.__name__)
208
221
  field_type = getattr(prop.fget, 'field_type', None)
222
+ db_type = getattr(prop.fget, 'db_type', None)
209
223
  else:
210
224
  verbose_name = (
211
225
  hasattr(prop, 'name') and prop.name or str(prop))
212
226
  field_type = None
227
+ db_type = None
213
228
  setifnone(kwargs, 'verbose_name', verbose_name)
214
229
  setifnone(kwargs, 'field_type', field_type)
230
+ setifnone(kwargs, 'db_type', db_type)
215
231
  return ViewField(name, **kwargs)
216
232
 
217
233
  @classmethod
@@ -219,6 +235,8 @@ class ViewField:
219
235
  setifnone(kwargs, 'verbose_name', cls._get_model_verbose_name(field))
220
236
  setifnone(
221
237
  kwargs, 'field_type', FieldType.from_model_field(field.__class__))
238
+ setifnone(
239
+ kwargs, 'db_type', get_db_type(field))
222
240
  return ViewModelField(
223
241
  name, model_field=field, **kwargs)
224
242
 
@@ -427,7 +445,8 @@ class VF:
427
445
  readonly=False, readonly_create=False, readonly_update=False,
428
446
  choices=None, select_related=None, prefetch_related=None,
429
447
  json_repr=None, related_model=None, related_model_api=None,
430
- field=None, related_fields=None, media_field_api=None):
448
+ field=None, related_fields=None, media_field_api=None,
449
+ db_type=None):
431
450
  self.kwargs = dict(
432
451
  name=name, verbose_name=verbose_name, field_type=field_type,
433
452
  alias=alias,
@@ -436,7 +455,8 @@ class VF:
436
455
  select_related=select_related, prefetch_related=prefetch_related,
437
456
  json_repr=json_repr, related_model=related_model,
438
457
  related_model_api=related_model_api, field=field,
439
- related_fields=related_fields, media_field_api=media_field_api)
458
+ related_fields=related_fields, media_field_api=media_field_api,
459
+ db_type=db_type)
440
460
 
441
461
  def to_field(self, model):
442
462
  return ViewField.from_name(model, **self.kwargs)
@@ -7,7 +7,7 @@ from django.conf import settings
7
7
  from django.core.cache import cache
8
8
  from django.core.exceptions import FieldError, ValidationError
9
9
  from django.db import IntegrityError, transaction
10
- from django.db.models import ForeignKey, Model, Q
10
+ from django.db.models import ForeignKey, ManyToOneRel, Model, Q
11
11
  from django.db.models.fields import AutoFieldMixin
12
12
  from django.urls import path
13
13
  from django.utils.translation import gettext_lazy as _
@@ -314,6 +314,7 @@ class ModelResponseMixin(ModelMixin):
314
314
  save_field = getattr(o, '_save_related', False)
315
315
  if save_field:
316
316
  try:
317
+ setattr(o, save_field, obj)
317
318
  o.full_clean(exclude={save_field})
318
319
  except ValidationError as e:
319
320
  for mk, ms in e.error_dict.items():
@@ -370,6 +371,16 @@ class ModelResponseMixin(ModelMixin):
370
371
  if rel_data:
371
372
  for k, v in rel_data.items():
372
373
  if isinstance(v, ModelList):
374
+ if isinstance(obj._meta.get_field(k), ManyToOneRel):
375
+ for cur in getattr(obj, k).all():
376
+ if cur not in v:
377
+ try:
378
+ cur.delete()
379
+ except IntegrityError:
380
+ raise APIError(f(_(
381
+ "{obj} cannot be deleted because "
382
+ "it is referenced by other "
383
+ "objects."), obj=str(cur)))
373
384
  for o in v:
374
385
  save_field = getattr(o, '_save_related', False)
375
386
  if save_field:
@@ -176,3 +176,22 @@ class TestFieldsOne2Many(TestAssertMixin, TestCase):
176
176
  self.assertJE(response, 'name', ["This field cannot be blank."])
177
177
  self.assertJE(
178
178
  response, 'rels::0::name', ["This field cannot be null."])
179
+
180
+ def test_put_delete(self):
181
+ o = TestOne2ManyModel.objects.create(name="Test")
182
+ r1 = TestOne2ManyRelModel.objects.create(rel=o, name="R1", descr="D1")
183
+ r2 = TestOne2ManyRelModel.objects.create(rel=o, name="R2", descr="D2")
184
+ TestOne2ManyRelModel.objects.create(rel=o, name="R3", descr="D3")
185
+
186
+ vals = self.client.get(f'/api/test/{o.pk}').json()
187
+ del vals['rels'][2]
188
+
189
+ response = self.client.put(f'/api/test/{o.pk}', vals)
190
+ self.assertRC(response, 200)
191
+ self.assertSize(response, 'rels', 2)
192
+ self.assertJE(response, 'rels.@0.pk', r1.pk)
193
+ self.assertJE(response, 'rels.@0.name', "R1")
194
+ self.assertJE(response, 'rels.@0.descr', "D1")
195
+ self.assertJE(response, 'rels.@1.pk', r2.pk)
196
+ self.assertJE(response, 'rels.@1.name', "R2")
197
+ self.assertJE(response, 'rels.@1.descr', "D2")
File without changes