django-pfx 1.4.dev156__tar.gz → 1.4.dev158__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.dev156 → django_pfx-1.4.dev158}/PKG-INFO +1 -1
  2. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +5 -5
  4. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/rest_views.py +42 -9
  5. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/basic_api_test.py +19 -0
  6. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/.gitignore +0 -0
  7. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/.gitlab-ci.yml +0 -0
  8. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/.pre-commit-config.yaml +0 -0
  9. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/LICENSE +0 -0
  10. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/MANIFEST.in +0 -0
  11. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/README.md +0 -0
  12. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/django_pfx.egg-info/SOURCES.txt +0 -0
  13. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/django_pfx.egg-info/dependency_links.txt +0 -0
  14. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/django_pfx.egg-info/requires.txt +0 -0
  15. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/django_pfx.egg-info/top_level.txt +0 -0
  16. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/Makefile +0 -0
  17. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/conf.py +0 -0
  18. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/index.rst +0 -0
  19. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/source/api.views.rst +0 -0
  20. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/source/authentication.md +0 -0
  21. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/source/decorator.md +0 -0
  22. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/source/generate_openapi.md +0 -0
  23. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/source/getting_started.md +0 -0
  24. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/source/internationalisation.md +0 -0
  25. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/source/model.md +0 -0
  26. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/source/pfx_views.md +0 -0
  27. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/source/profiling.md +0 -0
  28. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/source/settings.md +0 -0
  29. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/doc/source/testing.md +0 -0
  30. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/img/pfx.png +0 -0
  31. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/img/pfx.svg +0 -0
  32. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/make_messages +0 -0
  33. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/manage.py +0 -0
  34. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/__init__.py +0 -0
  35. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/__init__.py +0 -0
  36. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/apidoc/__init__.py +0 -0
  37. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/apidoc/parameters.py +0 -0
  38. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/apidoc/schema.py +0 -0
  39. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/apidoc/tags.py +0 -0
  40. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/apps.py +0 -0
  41. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/decorator/__init__.py +0 -0
  42. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/decorator/rest.py +0 -0
  43. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/default_settings.py +0 -0
  44. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/exceptions.py +0 -0
  45. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/fields/__init__.py +0 -0
  46. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/fields/decimal_field.py +0 -0
  47. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/fields/media_field.py +0 -0
  48. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  49. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/fields/rich_text_field.py +0 -0
  50. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/http/__init__.py +0 -0
  51. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/http/json_response.py +0 -0
  52. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  53. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/management/__init__.py +0 -0
  54. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/management/commands/__init__.py +0 -0
  55. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  56. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/management/commands/profile.py +0 -0
  57. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/middleware/__init__.py +0 -0
  58. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/middleware/authentication.py +0 -0
  59. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/middleware/locale.py +0 -0
  60. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/middleware/profiling.py +0 -0
  61. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  62. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  63. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  64. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/migrations/__init__.py +0 -0
  65. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  66. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  67. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/models/__init__.py +0 -0
  68. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  69. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/models/cache_mixins.py +0 -0
  70. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/models/login_ban.py +0 -0
  71. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/models/not_null_fields.py +0 -0
  72. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  73. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  74. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/models/pfx_models.py +0 -0
  75. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/models/pfx_user.py +0 -0
  76. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  77. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/serializers/__init__.py +0 -0
  78. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/serializers/json.py +0 -0
  79. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/settings.py +0 -0
  80. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/shortcuts.py +0 -0
  81. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/storage/__init__.py +0 -0
  82. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/storage/exceptions.py +0 -0
  83. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/storage/local_storage.py +0 -0
  84. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/storage/s3_storage.py +0 -0
  85. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  86. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  87. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  88. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  89. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  90. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  91. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/test.py +0 -0
  92. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/urls.py +0 -0
  93. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/__init__.py +0 -0
  94. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/authentication_views.py +0 -0
  95. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/fields.py +0 -0
  96. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/filters_views.py +0 -0
  97. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/locale_views.py +0 -0
  98. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
  99. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  100. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  101. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  102. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/groups.py +0 -0
  103. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  104. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  105. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  106. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  107. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  108. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  109. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  110. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  111. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  112. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/subset.py +0 -0
  113. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  114. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  115. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  116. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  117. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  118. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/settings/__init__.py +0 -0
  119. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pfx/settings/dev.py +0 -0
  120. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/pyproject.toml +0 -0
  121. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/requirements.txt +0 -0
  122. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/serve-doc +0 -0
  123. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/setup.cfg +0 -0
  124. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/setup.py +0 -0
  125. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/__init__.py +0 -0
  126. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/apps.py +0 -0
  127. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  128. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/migrations/0001_initial.py +0 -0
  129. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/migrations/0002_alter_book_cover.py +0 -0
  130. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/migrations/0003_book_local_file.py +0 -0
  131. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/migrations/__init__.py +0 -0
  132. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/models.py +0 -0
  133. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/settings/__init__.py +0 -0
  134. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/settings/ci.py +0 -0
  135. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/settings/common.py +0 -0
  136. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/settings/dev.py +0 -0
  137. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/settings/dev_custom_example.py +0 -0
  138. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/settings/dev_default.py +0 -0
  139. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/__init__.py +0 -0
  140. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/basic_api_errors.py +0 -0
  141. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_api_doc.py +0 -0
  142. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_api_doc_search.py +0 -0
  143. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_auth_api.py +0 -0
  144. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_body_mixin.py +0 -0
  145. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_cache.py +0 -0
  146. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_client.py +0 -0
  147. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_fields_choices.py +0 -0
  148. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_fields_date.py +0 -0
  149. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_fields_decimal.py +0 -0
  150. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_fields_minutes_duration.py +0 -0
  151. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_fields_one2many.py +0 -0
  152. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_fields_rich_text.py +0 -0
  153. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_filters.py +0 -0
  154. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_locale_api.py +0 -0
  155. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  156. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_perm_tests.py +0 -0
  157. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_permissions.py +0 -0
  158. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_perms_api.py +0 -0
  159. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_post_migrate_groups_update.py +0 -0
  160. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_profiling_middleware.py +0 -0
  161. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_settings.py +0 -0
  162. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_shortcuts.py +0 -0
  163. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_timezone_middleware.py +0 -0
  164. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_tools.py +0 -0
  165. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_user_queryset.py +0 -0
  166. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_view_decorators.py +0 -0
  167. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/tests/test_view_fields.py +0 -0
  168. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/urls.py +0 -0
  169. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests/views.py +0 -0
  170. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/__init__.py +0 -0
  171. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/migrations/0001_initial.py +0 -0
  172. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/migrations/__init__.py +0 -0
  173. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/settings/__init__.py +0 -0
  174. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/settings/ci.py +0 -0
  175. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/settings/common.py +0 -0
  176. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/settings/dev.py +0 -0
  177. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/settings/dev_custom_example.py +0 -0
  178. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/settings/dev_default.py +0 -0
  179. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/tests/__init__.py +0 -0
  180. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/tests/test_api.py +0 -0
  181. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/tests/test_auth_api.py +0 -0
  182. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/urls.py +0 -0
  183. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_base_user/views.py +0 -0
  184. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/__init__.py +0 -0
  185. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/migrations/0001_initial.py +0 -0
  186. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/migrations/__init__.py +0 -0
  187. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/models.py +0 -0
  188. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/settings/__init__.py +0 -0
  189. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/settings/ci.py +0 -0
  190. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/settings/common.py +0 -0
  191. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/settings/dev.py +0 -0
  192. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/settings/dev_custom_example.py +0 -0
  193. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/settings/dev_default.py +0 -0
  194. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/tests/__init__.py +0 -0
  195. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/tests/test_api.py +0 -0
  196. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/tests/test_auth_api.py +0 -0
  197. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/tests_custom_user/urls.py +0 -0
  198. {django_pfx-1.4.dev156 → django_pfx-1.4.dev158}/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.dev156
3
+ Version: 1.4.dev158
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.dev156
3
+ Version: 1.4.dev158
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-16 10:41+0200\n"
10
+ "POT-Creation-Date: 2025-10-22 12:44+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 views/rest_views.py:381
289
+ #: views/rest_views.py:221 views/rest_views.py:387
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:345
295
+ #: views/rest_views.py:351
296
296
  #, python-brace-format
297
297
  msgid "{model} {obj} created."
298
298
  msgstr "{model} {obj} créé."
299
299
 
300
- #: views/rest_views.py:346
300
+ #: views/rest_views.py:352
301
301
  #, python-brace-format
302
302
  msgid "{model} {obj} updated."
303
303
  msgstr "{model} {obj} modifié."
304
304
 
305
- #: views/rest_views.py:1224
305
+ #: views/rest_views.py:1257
306
306
  #, python-brace-format
307
307
  msgid "{model} {obj} deleted."
308
308
  msgstr "{model} {obj} supprimé."
@@ -6,9 +6,10 @@ from json import JSONDecodeError
6
6
  from django.conf import settings
7
7
  from django.core.cache import cache
8
8
  from django.core.exceptions import FieldError, ValidationError
9
- from django.db import IntegrityError, transaction
10
- from django.db.models import ForeignKey, ManyToOneRel, Model, Q
9
+ from django.db import IntegrityError, connection, transaction
10
+ from django.db.models import ForeignKey, ManyToOneRel, Model, Q, Window
11
11
  from django.db.models.fields import AutoFieldMixin
12
+ from django.db.models.functions import Lag, Lead
12
13
  from django.urls import path
13
14
  from django.utils.translation import gettext_lazy as _
14
15
  from django.views import View
@@ -280,6 +281,9 @@ class ModelResponseMixin(ModelMixin):
280
281
  vals.update(fields)
281
282
  return vals
282
283
 
284
+ def get_navigation_meta(self, obj):
285
+ raise APIError("navigation data are only available on list view.")
286
+
283
287
  def response(self, o, **meta):
284
288
  """Build a :class:`JsonResponse` from an object instance.
285
289
 
@@ -288,6 +292,8 @@ class ModelResponseMixin(ModelMixin):
288
292
  :returns: The JSON response
289
293
  :rtype: :class:`JsonResponse`
290
294
  """
295
+ if get_bool(self.request.GET, 'navigation'):
296
+ meta.update(self.get_navigation_meta(o))
291
297
  return JsonResponse(self.serialize_object(o, **{
292
298
  _f.alias: _f.to_json(o, self)
293
299
  for _f in self.get_fields().values()}, meta=meta))
@@ -742,6 +748,14 @@ class ListRestViewMixin(ModelResponseMixin):
742
748
  order = self.request.GET.get('order')
743
749
  return order and [apply(o) for o in order.split(',')] or order
744
750
 
751
+ def get_order(self):
752
+ order = (
753
+ self.get_query_order() or self.default_order or
754
+ self.model._meta.ordering)
755
+ if 'pk' not in order:
756
+ order.append('pk')
757
+ return order
758
+
745
759
  def apply_view_order(self, qs):
746
760
  """Apply view order on queryset.
747
761
 
@@ -750,13 +764,10 @@ class ListRestViewMixin(ModelResponseMixin):
750
764
  :returns: The ordered queryset
751
765
  :rtype: :class:`django.db.models.QuerySet`
752
766
  """
753
- order = self.get_query_order()
754
- if order:
755
- try:
756
- return qs.order_by(*order)
757
- except FieldError as e:
758
- raise APIError(e.args[0])
759
- return qs.order_by(*(self.default_order or self.model._meta.ordering))
767
+ try:
768
+ return qs.order_by(*self.get_order())
769
+ except FieldError as e:
770
+ raise APIError(e.args[0])
760
771
 
761
772
  def get_list_queryset(self, select_related=None, prefetch_related=None):
762
773
  """Get list queryset.
@@ -937,6 +948,28 @@ class ListRestViewMixin(ModelResponseMixin):
937
948
 
938
949
  return self._get_list(*args, **kwargs)
939
950
 
951
+ def get_navigation_meta(self, obj):
952
+ qs = self.get_list_queryset()
953
+ order = qs.query.order_by
954
+ qs_window = qs.annotate(
955
+ prev_id=Window(Lag('id'), order_by=order),
956
+ next_id=Window(Lead('id'), order_by=order))
957
+ sql = f"""
958
+ WITH annotated AS (
959
+ {qs_window.values('id', 'prev_id', 'next_id').query}
960
+ )
961
+ SELECT prev_id, next_id
962
+ FROM annotated
963
+ WHERE id = %s;
964
+ """
965
+
966
+ with connection.cursor() as cursor:
967
+ cursor.execute(sql, [obj.pk])
968
+ prev_id, next_id = cursor.fetchone() or (None, None)
969
+ return {
970
+ 'previous_pk': prev_id,
971
+ 'next_pk': next_id}
972
+
940
973
  @classmethod
941
974
  def generate_schemas(cls):
942
975
  """Generate schemas for the class.
@@ -632,6 +632,25 @@ class BasicAPITest(TestAssertMixin, TestCase):
632
632
  self.assertJE(response, 'gender.value', 'male')
633
633
  self.assertJE(response, 'gender.label', 'Male')
634
634
 
635
+ def test_get_detail_navigation_meta(self):
636
+ response = self.client.get(
637
+ f'/api/authors/{self.author3.pk}?navigation=1&order=last_name')
638
+ self.assertRC(response, 200)
639
+ self.assertJE(response, 'meta.previous_pk', None)
640
+ self.assertJE(response, 'meta.next_pk', self.author2.pk)
641
+
642
+ response = self.client.get(
643
+ f'/api/authors/{self.author2.pk}?navigation=1&order=last_name')
644
+ self.assertRC(response, 200)
645
+ self.assertJE(response, 'meta.previous_pk', self.author3.pk)
646
+ self.assertJE(response, 'meta.next_pk', self.author4.pk)
647
+
648
+ response = self.client.get(
649
+ f'/api/authors/{self.author2.pk}?navigation=1&order=-last_name')
650
+ self.assertRC(response, 200)
651
+ self.assertJE(response, 'meta.previous_pk', self.author4.pk)
652
+ self.assertJE(response, 'meta.next_pk', self.author3.pk)
653
+
635
654
  def test_get_date_format(self):
636
655
  response = self.client.get(f'/api/books/{self.author1_book1.pk}')
637
656
  self.assertRC(response, 200)
File without changes