django-pfx 1.7.2.dev4__tar.gz → 1.7.2.dev8__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 (199) hide show
  1. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/PKG-INFO +1 -1
  2. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +5 -5
  4. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/models/ordered_model_mixin.py +3 -1
  5. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/models/pfx_models.py +1 -0
  6. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/rest_views.py +13 -3
  7. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/basic_api_test.py +51 -0
  8. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_ordered_rest_view_mixin.py +18 -0
  9. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/.gitignore +0 -0
  10. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/.gitlab-ci.yml +0 -0
  11. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/.pre-commit-config.yaml +0 -0
  12. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/LICENSE +0 -0
  13. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/MANIFEST.in +0 -0
  14. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/README.md +0 -0
  15. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/django_pfx.egg-info/SOURCES.txt +0 -0
  16. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/django_pfx.egg-info/dependency_links.txt +0 -0
  17. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/django_pfx.egg-info/requires.txt +0 -0
  18. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/django_pfx.egg-info/top_level.txt +0 -0
  19. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/Makefile +0 -0
  20. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/conf.py +0 -0
  21. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/index.rst +0 -0
  22. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/source/api.views.rst +0 -0
  23. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/source/authentication.md +0 -0
  24. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/source/decorator.md +0 -0
  25. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/source/generate_openapi.md +0 -0
  26. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/source/getting_started.md +0 -0
  27. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/source/internationalisation.md +0 -0
  28. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/source/model.md +0 -0
  29. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/source/pfx_views.md +0 -0
  30. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/source/profiling.md +0 -0
  31. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/source/settings.md +0 -0
  32. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/doc/source/testing.md +0 -0
  33. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/img/pfx.png +0 -0
  34. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/img/pfx.svg +0 -0
  35. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/make_messages +0 -0
  36. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/manage.py +0 -0
  37. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/__init__.py +0 -0
  38. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/__init__.py +0 -0
  39. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/apidoc/__init__.py +0 -0
  40. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/apidoc/parameters.py +0 -0
  41. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/apidoc/schema.py +0 -0
  42. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/apidoc/tags.py +0 -0
  43. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/apps.py +0 -0
  44. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/decorator/__init__.py +0 -0
  45. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/decorator/rest.py +0 -0
  46. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/default_settings.py +0 -0
  47. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/exceptions.py +0 -0
  48. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/fields/__init__.py +0 -0
  49. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/fields/decimal_field.py +0 -0
  50. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/fields/media_field.py +0 -0
  51. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  52. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/fields/rich_text_field.py +0 -0
  53. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/http/__init__.py +0 -0
  54. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/http/json_response.py +0 -0
  55. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  56. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/management/__init__.py +0 -0
  57. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/management/commands/__init__.py +0 -0
  58. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  59. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/management/commands/profile.py +0 -0
  60. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/middleware/__init__.py +0 -0
  61. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/middleware/authentication.py +0 -0
  62. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/middleware/locale.py +0 -0
  63. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/middleware/profiling.py +0 -0
  64. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  65. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  66. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  67. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/migrations/0004_alter_loginban_failed_counter_and_more.py +0 -0
  68. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/migrations/__init__.py +0 -0
  69. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  70. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  71. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/models/__init__.py +0 -0
  72. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  73. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/models/cache_mixins.py +0 -0
  74. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/models/login_ban.py +0 -0
  75. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/models/not_null_fields.py +0 -0
  76. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  77. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/models/pfx_user.py +0 -0
  78. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  79. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/serializers/__init__.py +0 -0
  80. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/serializers/json.py +0 -0
  81. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/settings.py +0 -0
  82. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/shortcuts.py +0 -0
  83. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/storage/__init__.py +0 -0
  84. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/storage/exceptions.py +0 -0
  85. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/storage/local_storage.py +0 -0
  86. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/storage/s3_storage.py +0 -0
  87. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  88. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  89. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  90. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  91. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  92. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  93. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/test.py +0 -0
  94. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/urls.py +0 -0
  95. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/__init__.py +0 -0
  96. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/authentication_views.py +0 -0
  97. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/fields.py +0 -0
  98. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/filters_views.py +0 -0
  99. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/locale_views.py +0 -0
  100. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
  101. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  102. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  103. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  104. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/groups.py +0 -0
  105. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  106. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  107. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  108. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  109. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  110. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  111. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  112. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  113. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  114. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/subset.py +0 -0
  115. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  116. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  117. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  118. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  119. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  120. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/settings/__init__.py +0 -0
  121. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pfx/settings/dev.py +0 -0
  122. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/pyproject.toml +0 -0
  123. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/requirements.txt +0 -0
  124. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/serve-doc +0 -0
  125. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/setup.cfg +0 -0
  126. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/setup.py +0 -0
  127. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/__init__.py +0 -0
  128. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/apps.py +0 -0
  129. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  130. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/migrations/0001_initial.py +0 -0
  131. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/migrations/0002_alter_book_cover.py +0 -0
  132. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/migrations/0003_book_local_file.py +0 -0
  133. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/migrations/__init__.py +0 -0
  134. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/models.py +0 -0
  135. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/settings/__init__.py +0 -0
  136. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/settings/ci.py +0 -0
  137. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/settings/common.py +0 -0
  138. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/settings/dev.py +0 -0
  139. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/settings/dev_custom_example.py +0 -0
  140. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/settings/dev_default.py +0 -0
  141. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/__init__.py +0 -0
  142. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/basic_api_errors.py +0 -0
  143. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_api_doc.py +0 -0
  144. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_api_doc_search.py +0 -0
  145. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_auth_api.py +0 -0
  146. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_body_mixin.py +0 -0
  147. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_cache.py +0 -0
  148. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_client.py +0 -0
  149. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_fields_choices.py +0 -0
  150. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_fields_date.py +0 -0
  151. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_fields_decimal.py +0 -0
  152. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_fields_minutes_duration.py +0 -0
  153. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_fields_one2many.py +0 -0
  154. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_fields_rich_text.py +0 -0
  155. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_filters.py +0 -0
  156. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_locale_api.py +0 -0
  157. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_perm_tests.py +0 -0
  158. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_permissions.py +0 -0
  159. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_perms_api.py +0 -0
  160. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_post_migrate_groups_update.py +0 -0
  161. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_profiling_middleware.py +0 -0
  162. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_settings.py +0 -0
  163. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_shortcuts.py +0 -0
  164. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_timezone_middleware.py +0 -0
  165. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_tools.py +0 -0
  166. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_user_queryset.py +0 -0
  167. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_view_decorators.py +0 -0
  168. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/tests/test_view_fields.py +0 -0
  169. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/urls.py +0 -0
  170. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests/views.py +0 -0
  171. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/__init__.py +0 -0
  172. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/migrations/0001_initial.py +0 -0
  173. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/migrations/__init__.py +0 -0
  174. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/settings/__init__.py +0 -0
  175. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/settings/ci.py +0 -0
  176. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/settings/common.py +0 -0
  177. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/settings/dev.py +0 -0
  178. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/settings/dev_custom_example.py +0 -0
  179. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/settings/dev_default.py +0 -0
  180. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/tests/__init__.py +0 -0
  181. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/tests/test_api.py +0 -0
  182. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/tests/test_auth_api.py +0 -0
  183. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/urls.py +0 -0
  184. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_base_user/views.py +0 -0
  185. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/__init__.py +0 -0
  186. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/migrations/0001_initial.py +0 -0
  187. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/migrations/__init__.py +0 -0
  188. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/models.py +0 -0
  189. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/settings/__init__.py +0 -0
  190. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/settings/ci.py +0 -0
  191. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/settings/common.py +0 -0
  192. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/settings/dev.py +0 -0
  193. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/settings/dev_custom_example.py +0 -0
  194. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/settings/dev_default.py +0 -0
  195. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/tests/__init__.py +0 -0
  196. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/tests/test_api.py +0 -0
  197. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/tests/test_auth_api.py +0 -0
  198. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/tests_custom_user/urls.py +0 -0
  199. {django_pfx-1.7.2.dev4 → django_pfx-1.7.2.dev8}/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.dev4
3
+ Version: 1.7.2.dev8
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.dev4
3
+ Version: 1.7.2.dev8
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: 2026-04-02 16:13+0200\n"
10
+ "POT-Creation-Date: 2026-04-20 13:42+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:228 views/rest_views.py:393
289
+ #: views/rest_views.py:228 views/rest_views.py:400
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:357
295
+ #: views/rest_views.py:364
296
296
  #, python-brace-format
297
297
  msgid "{model} {obj} created."
298
298
  msgstr "{model} {obj} créé."
299
299
 
300
- #: views/rest_views.py:358
300
+ #: views/rest_views.py:365
301
301
  #, python-brace-format
302
302
  msgid "{model} {obj} updated."
303
303
  msgstr "{model} {obj} modifié."
304
304
 
305
- #: views/rest_views.py:1289
305
+ #: views/rest_views.py:1299
306
306
  #, python-brace-format
307
307
  msgid "{model} {obj} deleted."
308
308
  msgstr "{model} {obj} supprimé."
@@ -25,10 +25,12 @@ class OrderedModelMixin(models.Model):
25
25
  super().clean_fields(exclude=exclude)
26
26
 
27
27
  def save(self, *args, **kwargs):
28
+ created = bool(self.pk)
28
29
  if not self.seq:
29
30
  self.seq = self._order_default
30
31
  super().save(*args, **kwargs)
31
- if self.__previous_ordered_by_values != self._ordered_by_values:
32
+ if (not created and
33
+ self.__previous_ordered_by_values != self._ordered_by_values):
32
34
  if self.ordered_default == 'first':
33
35
  self.top()
34
36
  else:
@@ -23,6 +23,7 @@ class UniqueConstraint(models.UniqueConstraint):
23
23
  class JSONReprMixin():
24
24
  """A model mixin to manage JSON representation."""
25
25
  api = None
26
+ api_navigation_loop = True
26
27
  url = None
27
28
  URL_AUTO_PK = True
28
29
  apidoc = {}
@@ -256,6 +256,8 @@ class ModelMixin():
256
256
 
257
257
  class ModelResponseMixin(ModelMixin):
258
258
  """Extension of :class:`ModelMixin` to manage object responses."""
259
+ #: Define if list navigation is looping (None is model default).
260
+ navigation_loop = None
259
261
  #: The response schema for meta service.
260
262
  meta_schema = None
261
263
  #: The model schema.
@@ -288,6 +290,11 @@ class ModelResponseMixin(ModelMixin):
288
290
  vals.update(fields)
289
291
  return vals
290
292
 
293
+ def is_navigation_loop(self):
294
+ if self.navigation_loop is None:
295
+ return getattr(self.model, 'api_navigation_loop', True)
296
+ return self.navigation_loop
297
+
291
298
  def get_navigation_meta(self, obj):
292
299
  return {}
293
300
 
@@ -995,10 +1002,13 @@ class ListRestViewMixin(ModelResponseMixin):
995
1002
  if not row:
996
1003
  return {}
997
1004
 
998
- prev_id, next_id, index = row
1005
+ prev_pk, next_pk, index = row
1006
+ if self.is_navigation_loop():
1007
+ prev_pk = prev_pk or qs.last().pk
1008
+ next_pk = next_pk or qs.first().pk
999
1009
  return {
1000
- 'previous_pk': prev_id or qs.last().pk,
1001
- 'next_pk': next_id or qs.first().pk,
1010
+ 'previous_pk': prev_pk,
1011
+ 'next_pk': next_pk,
1002
1012
  'index': index,
1003
1013
  'count': qs.count()}
1004
1014
 
@@ -6,6 +6,7 @@ from django.db import connection
6
6
  from django.test import TestCase, override_settings
7
7
 
8
8
  from pfx.pfxcore.test import APIClient, MockBoto3Client, TestAssertMixin
9
+ from tests import views
9
10
  from tests.models import Author, Book, BookType
10
11
 
11
12
 
@@ -657,6 +658,56 @@ class BasicAPITest(TestAssertMixin, TestCase):
657
658
  self.assertJE(response, 'meta.index', 3)
658
659
  self.assertJE(response, 'meta.count', 4)
659
660
 
661
+ # Check looping by default
662
+ response = self.client.get(
663
+ f'/api/authors/{self.author1.pk}?navigation=1&order=last_name')
664
+ self.assertRC(response, 200)
665
+ self.assertJE(response, 'meta.previous_pk', self.author4.pk)
666
+ self.assertJE(response, 'meta.next_pk', self.author3.pk)
667
+ self.assertJE(response, 'meta.index', 4)
668
+ self.assertJE(response, 'meta.count', 4)
669
+ response = self.client.get(
670
+ f'/api/authors/{self.author3.pk}?navigation=1&order=last_name')
671
+ self.assertRC(response, 200)
672
+ self.assertJE(response, 'meta.previous_pk', self.author1.pk)
673
+ self.assertJE(response, 'meta.next_pk', self.author2.pk)
674
+ self.assertJE(response, 'meta.index', 1)
675
+ self.assertJE(response, 'meta.count', 4)
676
+
677
+ # Check looping disabled by model
678
+ with patch.object(views.Author, "api_navigation_loop", False):
679
+ response = self.client.get(
680
+ f'/api/authors/{self.author1.pk}?navigation=1&order=last_name')
681
+ self.assertRC(response, 200)
682
+ self.assertJE(response, 'meta.previous_pk', self.author4.pk)
683
+ self.assertJE(response, 'meta.next_pk', None)
684
+ self.assertJE(response, 'meta.index', 4)
685
+ self.assertJE(response, 'meta.count', 4)
686
+ response = self.client.get(
687
+ f'/api/authors/{self.author3.pk}?navigation=1&order=last_name')
688
+ self.assertRC(response, 200)
689
+ self.assertJE(response, 'meta.previous_pk', None)
690
+ self.assertJE(response, 'meta.next_pk', self.author2.pk)
691
+ self.assertJE(response, 'meta.index', 1)
692
+ self.assertJE(response, 'meta.count', 4)
693
+
694
+ # Check looping disabled by view
695
+ with patch.object(views.AuthorRestView, "navigation_loop", False):
696
+ response = self.client.get(
697
+ f'/api/authors/{self.author1.pk}?navigation=1&order=last_name')
698
+ self.assertRC(response, 200)
699
+ self.assertJE(response, 'meta.previous_pk', self.author4.pk)
700
+ self.assertJE(response, 'meta.next_pk', None)
701
+ self.assertJE(response, 'meta.index', 4)
702
+ self.assertJE(response, 'meta.count', 4)
703
+ response = self.client.get(
704
+ f'/api/authors/{self.author3.pk}?navigation=1&order=last_name')
705
+ self.assertRC(response, 200)
706
+ self.assertJE(response, 'meta.previous_pk', None)
707
+ self.assertJE(response, 'meta.next_pk', self.author2.pk)
708
+ self.assertJE(response, 'meta.index', 1)
709
+ self.assertJE(response, 'meta.count', 4)
710
+
660
711
  def test_get_date_format(self):
661
712
  response = self.client.get(f'/api/books/{self.author1_book1.pk}')
662
713
  self.assertRC(response, 200)
@@ -316,6 +316,15 @@ class TestOrderedRestViewMixin(TestAssertMixin, TestCase):
316
316
  order(OrderedModel),
317
317
  [self.o3.pk, self.o1.pk, self.o2.pk])
318
318
 
319
+ response = self.client.post(
320
+ '/api/ordered?move=top', {'name': "Test"})
321
+ self.assertRC(response, 200)
322
+ o4_pk = self.get_val(response, 'pk')
323
+
324
+ self.assertEqual(
325
+ order(OrderedModel),
326
+ [o4_pk, self.o3.pk, self.o1.pk, self.o2.pk])
327
+
319
328
  def test_top_by_name(self):
320
329
  response = self.client.put(
321
330
  f'/api/ordered-by-name/{self.obn3.pk}?move=top', {})
@@ -370,6 +379,15 @@ class TestOrderedRestViewMixin(TestAssertMixin, TestCase):
370
379
  order(OrderedModel),
371
380
  [self.o2.pk, self.o3.pk, self.o1.pk])
372
381
 
382
+ response = self.client.post(
383
+ '/api/ordered?move=bottom', {'name': "Test"})
384
+ self.assertRC(response, 200)
385
+ o4_pk = self.get_val(response, 'pk')
386
+
387
+ self.assertEqual(
388
+ order(OrderedModel),
389
+ [self.o2.pk, self.o3.pk, self.o1.pk, o4_pk])
390
+
373
391
  def test_bottom_by_name(self):
374
392
  response = self.client.put(
375
393
  f'/api/ordered-by-name/{self.obn2.pk}?move=bottom', {})
File without changes