django-pfx 1.4.dev162__tar.gz → 1.4.dev166__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.dev162 → django_pfx-1.4.dev166}/PKG-INFO +1 -1
  2. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/fields/rich_text_field.py +14 -10
  4. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +2 -2
  5. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/storage/local_storage.py +3 -1
  6. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/fields.py +10 -4
  7. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/rest_views.py +2 -1
  8. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/.gitignore +0 -0
  9. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/.gitlab-ci.yml +0 -0
  10. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/.pre-commit-config.yaml +0 -0
  11. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/LICENSE +0 -0
  12. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/MANIFEST.in +0 -0
  13. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/README.md +0 -0
  14. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/django_pfx.egg-info/SOURCES.txt +0 -0
  15. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/django_pfx.egg-info/dependency_links.txt +0 -0
  16. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/django_pfx.egg-info/requires.txt +0 -0
  17. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/django_pfx.egg-info/top_level.txt +0 -0
  18. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/Makefile +0 -0
  19. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/conf.py +0 -0
  20. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/index.rst +0 -0
  21. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/source/api.views.rst +0 -0
  22. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/source/authentication.md +0 -0
  23. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/source/decorator.md +0 -0
  24. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/source/generate_openapi.md +0 -0
  25. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/source/getting_started.md +0 -0
  26. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/source/internationalisation.md +0 -0
  27. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/source/model.md +0 -0
  28. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/source/pfx_views.md +0 -0
  29. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/source/profiling.md +0 -0
  30. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/source/settings.md +0 -0
  31. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/doc/source/testing.md +0 -0
  32. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/img/pfx.png +0 -0
  33. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/img/pfx.svg +0 -0
  34. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/make_messages +0 -0
  35. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/manage.py +0 -0
  36. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/__init__.py +0 -0
  37. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/__init__.py +0 -0
  38. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/apidoc/__init__.py +0 -0
  39. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/apidoc/parameters.py +0 -0
  40. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/apidoc/schema.py +0 -0
  41. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/apidoc/tags.py +0 -0
  42. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/apps.py +0 -0
  43. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/decorator/__init__.py +0 -0
  44. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/decorator/rest.py +0 -0
  45. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/default_settings.py +0 -0
  46. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/exceptions.py +0 -0
  47. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/fields/__init__.py +0 -0
  48. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/fields/decimal_field.py +0 -0
  49. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/fields/media_field.py +0 -0
  50. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  51. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/http/__init__.py +0 -0
  52. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/http/json_response.py +0 -0
  53. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  54. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/management/__init__.py +0 -0
  55. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/management/commands/__init__.py +0 -0
  56. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  57. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/management/commands/profile.py +0 -0
  58. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/middleware/__init__.py +0 -0
  59. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/middleware/authentication.py +0 -0
  60. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/middleware/locale.py +0 -0
  61. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/middleware/profiling.py +0 -0
  62. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  63. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  64. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  65. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/migrations/__init__.py +0 -0
  66. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  67. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  68. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/models/__init__.py +0 -0
  69. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  70. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/models/cache_mixins.py +0 -0
  71. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/models/login_ban.py +0 -0
  72. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/models/not_null_fields.py +0 -0
  73. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  74. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  75. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/models/pfx_models.py +0 -0
  76. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/models/pfx_user.py +0 -0
  77. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  78. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/serializers/__init__.py +0 -0
  79. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/serializers/json.py +0 -0
  80. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/settings.py +0 -0
  81. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/shortcuts.py +0 -0
  82. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/storage/__init__.py +0 -0
  83. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/storage/exceptions.py +0 -0
  84. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/storage/s3_storage.py +0 -0
  85. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  86. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  87. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  88. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  89. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  90. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  91. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/test.py +0 -0
  92. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/urls.py +0 -0
  93. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/__init__.py +0 -0
  94. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/authentication_views.py +0 -0
  95. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/filters_views.py +0 -0
  96. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/locale_views.py +0 -0
  97. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
  98. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  99. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  100. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  101. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/groups.py +0 -0
  102. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  103. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  104. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  105. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  106. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  107. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  108. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  109. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  110. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  111. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/subset.py +0 -0
  112. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  113. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  114. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  115. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  116. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  117. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/settings/__init__.py +0 -0
  118. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pfx/settings/dev.py +0 -0
  119. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/pyproject.toml +0 -0
  120. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/requirements.txt +0 -0
  121. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/serve-doc +0 -0
  122. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/setup.cfg +0 -0
  123. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/setup.py +0 -0
  124. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/__init__.py +0 -0
  125. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/apps.py +0 -0
  126. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  127. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/migrations/0001_initial.py +0 -0
  128. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/migrations/0002_alter_book_cover.py +0 -0
  129. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/migrations/0003_book_local_file.py +0 -0
  130. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/migrations/__init__.py +0 -0
  131. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/models.py +0 -0
  132. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/settings/__init__.py +0 -0
  133. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/settings/ci.py +0 -0
  134. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/settings/common.py +0 -0
  135. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/settings/dev.py +0 -0
  136. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/settings/dev_custom_example.py +0 -0
  137. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/settings/dev_default.py +0 -0
  138. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/__init__.py +0 -0
  139. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/basic_api_errors.py +0 -0
  140. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/basic_api_test.py +0 -0
  141. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_api_doc.py +0 -0
  142. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_api_doc_search.py +0 -0
  143. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_auth_api.py +0 -0
  144. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_body_mixin.py +0 -0
  145. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_cache.py +0 -0
  146. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_client.py +0 -0
  147. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_fields_choices.py +0 -0
  148. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_fields_date.py +0 -0
  149. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_fields_decimal.py +0 -0
  150. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_fields_minutes_duration.py +0 -0
  151. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_fields_one2many.py +0 -0
  152. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_fields_rich_text.py +0 -0
  153. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_filters.py +0 -0
  154. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_locale_api.py +0 -0
  155. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  156. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_perm_tests.py +0 -0
  157. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_permissions.py +0 -0
  158. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_perms_api.py +0 -0
  159. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_post_migrate_groups_update.py +0 -0
  160. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_profiling_middleware.py +0 -0
  161. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_settings.py +0 -0
  162. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_shortcuts.py +0 -0
  163. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_timezone_middleware.py +0 -0
  164. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_tools.py +0 -0
  165. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_user_queryset.py +0 -0
  166. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_view_decorators.py +0 -0
  167. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/tests/test_view_fields.py +0 -0
  168. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/urls.py +0 -0
  169. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests/views.py +0 -0
  170. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/__init__.py +0 -0
  171. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/migrations/0001_initial.py +0 -0
  172. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/migrations/__init__.py +0 -0
  173. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/settings/__init__.py +0 -0
  174. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/settings/ci.py +0 -0
  175. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/settings/common.py +0 -0
  176. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/settings/dev.py +0 -0
  177. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/settings/dev_custom_example.py +0 -0
  178. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/settings/dev_default.py +0 -0
  179. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/tests/__init__.py +0 -0
  180. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/tests/test_api.py +0 -0
  181. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/tests/test_auth_api.py +0 -0
  182. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/urls.py +0 -0
  183. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_base_user/views.py +0 -0
  184. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/__init__.py +0 -0
  185. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/migrations/0001_initial.py +0 -0
  186. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/migrations/__init__.py +0 -0
  187. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/models.py +0 -0
  188. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/settings/__init__.py +0 -0
  189. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/settings/ci.py +0 -0
  190. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/settings/common.py +0 -0
  191. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/settings/dev.py +0 -0
  192. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/settings/dev_custom_example.py +0 -0
  193. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/settings/dev_default.py +0 -0
  194. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/tests/__init__.py +0 -0
  195. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/tests/test_api.py +0 -0
  196. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/tests/test_auth_api.py +0 -0
  197. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/tests_custom_user/urls.py +0 -0
  198. {django_pfx-1.4.dev162 → django_pfx-1.4.dev166}/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.dev162
3
+ Version: 1.4.dev166
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.dev162
3
+ Version: 1.4.dev166
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,7 @@
1
1
  from django.conf import settings
2
2
  from django.core.exceptions import ImproperlyConfigured
3
3
  from django.db import models
4
+ from django.db.models.signals import pre_save
4
5
  from django.utils.safestring import mark_safe
5
6
 
6
7
  import nh3
@@ -28,19 +29,22 @@ class RichTextField(models.TextField):
28
29
  "for this field.")
29
30
  self.nh3_kwargs = settings.NH3_CONFIGS[nh3_config]
30
31
 
31
- def pre_save(self, model_instance, add):
32
- data = getattr(model_instance, self.attname)
33
- if data is None:
34
- return data
35
- clean_value = (
36
- nh3.clean(data, **self.nh3_kwargs)
37
- if self.nh3_kwargs and data else data or "")
38
- setattr(model_instance, self.attname, mark_safe(clean_value))
39
- return clean_value
40
-
41
32
  def from_db_value(self, value, expression, connection):
42
33
  if value is None:
43
34
  return value
44
35
  # Values are sanitized before saving, so any value returned from the DB
45
36
  # is safe to render unescaped.
46
37
  return mark_safe(value)
38
+
39
+ def contribute_to_class(self, cls, name, private_only=False):
40
+ super().contribute_to_class(cls, name, private_only=private_only)
41
+
42
+ if self.nh3_kwargs:
43
+ # connect a pre_save signal for this field
44
+ def sanitize(sender, instance, **kwargs):
45
+ value = getattr(instance, name)
46
+ if value:
47
+ clean_value = nh3.clean(value, **self.nh3_kwargs)
48
+ setattr(instance, name, mark_safe(clean_value))
49
+
50
+ pre_save.connect(sanitize, sender=cls, weak=False)
@@ -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-10-22 16:49+0200\n"
10
+ "POT-Creation-Date: 2025-11-18 16:38+0100\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:1261
305
+ #: views/rest_views.py:1262
306
306
  #, python-brace-format
307
307
  msgid "{model} {obj} deleted."
308
308
  msgstr "{model} {obj} supprimé."
@@ -25,7 +25,9 @@ class LocalStorage:
25
25
  dirname = Path(settings.STORAGE_LOCAL_ROOT, relative_path)
26
26
  dirname.mkdir(parents=True, exist_ok=True)
27
27
  suffixes = Path(filename).suffixes
28
- if suffixes[-1] in ['gz', 'bz2'] and len(suffixes) > 1:
28
+ if not suffixes:
29
+ ext = ''
30
+ elif suffixes[-1] in ['gz', 'bz2'] and len(suffixes) > 1:
29
31
  ext = ''.join(suffixes[-2:])
30
32
  else:
31
33
  ext = suffixes[-1]
@@ -113,6 +113,7 @@ class ViewField:
113
113
  readonly=False, readonly_create=False, readonly_update=False,
114
114
  choices=None, json_repr=None, media_field_api=None,
115
115
  related_model=None, related_model_api=None, related_fields=None,
116
+ related_filter=None,
116
117
  select_related=None, prefetch_related=None):
117
118
  self.name = name
118
119
  self.alias = alias or name
@@ -131,6 +132,7 @@ class ViewField:
131
132
  if self.related_model and related_fields:
132
133
  self.related_fields = process_fields(
133
134
  self.related_model, related_fields)
135
+ self.related_filter = related_filter
134
136
  self.select_related = select_related or []
135
137
  self.prefetch_related = prefetch_related or []
136
138
  self.model_field = None
@@ -188,7 +190,10 @@ class ViewField:
188
190
  if self.field_type == FieldType.ModelObject:
189
191
  return self._related_json_repr(value)
190
192
  if self.field_type == FieldType.ModelObjectList:
191
- return [self._related_json_repr(o) for o in value.all()]
193
+ qs = (
194
+ value.filter(self.related_filter) if self.related_filter
195
+ else value.all())
196
+ return [self._related_json_repr(o) for o in qs]
192
197
 
193
198
  if self.json_repr:
194
199
  return self.json_repr(value)
@@ -454,8 +459,8 @@ class VF:
454
459
  readonly=False, readonly_create=False, readonly_update=False,
455
460
  choices=None, select_related=None, prefetch_related=None,
456
461
  json_repr=None, related_model=None, related_model_api=None,
457
- field=None, related_fields=None, media_field_api=None,
458
- db_type=None, order=None):
462
+ field=None, related_fields=None, related_filter=None,
463
+ media_field_api=None, db_type=None, order=None):
459
464
  self.kwargs = dict(
460
465
  name=name, verbose_name=verbose_name, field_type=field_type,
461
466
  alias=alias,
@@ -464,7 +469,8 @@ class VF:
464
469
  select_related=select_related, prefetch_related=prefetch_related,
465
470
  json_repr=json_repr, related_model=related_model,
466
471
  related_model_api=related_model_api, field=field,
467
- related_fields=related_fields, media_field_api=media_field_api,
472
+ related_fields=related_fields, related_filter=related_filter,
473
+ media_field_api=media_field_api,
468
474
  db_type=db_type, order=order)
469
475
 
470
476
  def to_field(self, model):
@@ -282,7 +282,7 @@ class ModelResponseMixin(ModelMixin):
282
282
  return vals
283
283
 
284
284
  def get_navigation_meta(self, obj):
285
- raise APIError("navigation data are only available on list view.")
285
+ return {}
286
286
 
287
287
  def response(self, o, **meta):
288
288
  """Build a :class:`JsonResponse` from an object instance.
@@ -391,6 +391,7 @@ class ModelResponseMixin(ModelMixin):
391
391
  save_field = getattr(o, '_save_related', False)
392
392
  if save_field:
393
393
  setattr(o, save_field, obj)
394
+ funcs += self.pre_save(o, created=created)
394
395
  o.save()
395
396
  getattr(obj, k).set(v)
396
397
  self.post_save(obj, created=created, funcs=funcs)
File without changes