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