django-pfx 1.4.dev164__tar.gz → 1.4.dev168__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.dev164 → django_pfx-1.4.dev168}/PKG-INFO +1 -1
  2. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/fields/media_field.py +39 -3
  4. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/fields/rich_text_field.py +14 -10
  5. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +2 -2
  6. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/fields.py +10 -4
  7. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/rest_views.py +2 -1
  8. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/.gitignore +0 -0
  9. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/.gitlab-ci.yml +0 -0
  10. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/.pre-commit-config.yaml +0 -0
  11. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/LICENSE +0 -0
  12. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/MANIFEST.in +0 -0
  13. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/README.md +0 -0
  14. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/django_pfx.egg-info/SOURCES.txt +0 -0
  15. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/django_pfx.egg-info/dependency_links.txt +0 -0
  16. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/django_pfx.egg-info/requires.txt +0 -0
  17. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/django_pfx.egg-info/top_level.txt +0 -0
  18. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/Makefile +0 -0
  19. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/conf.py +0 -0
  20. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/index.rst +0 -0
  21. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/source/api.views.rst +0 -0
  22. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/source/authentication.md +0 -0
  23. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/source/decorator.md +0 -0
  24. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/source/generate_openapi.md +0 -0
  25. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/source/getting_started.md +0 -0
  26. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/source/internationalisation.md +0 -0
  27. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/source/model.md +0 -0
  28. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/source/pfx_views.md +0 -0
  29. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/source/profiling.md +0 -0
  30. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/source/settings.md +0 -0
  31. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/doc/source/testing.md +0 -0
  32. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/img/pfx.png +0 -0
  33. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/img/pfx.svg +0 -0
  34. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/make_messages +0 -0
  35. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/manage.py +0 -0
  36. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/__init__.py +0 -0
  37. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/__init__.py +0 -0
  38. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/apidoc/__init__.py +0 -0
  39. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/apidoc/parameters.py +0 -0
  40. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/apidoc/schema.py +0 -0
  41. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/apidoc/tags.py +0 -0
  42. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/apps.py +0 -0
  43. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/decorator/__init__.py +0 -0
  44. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/decorator/rest.py +0 -0
  45. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/default_settings.py +0 -0
  46. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/exceptions.py +0 -0
  47. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/fields/__init__.py +0 -0
  48. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/fields/decimal_field.py +0 -0
  49. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  50. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/http/__init__.py +0 -0
  51. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/http/json_response.py +0 -0
  52. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  53. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/management/__init__.py +0 -0
  54. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/management/commands/__init__.py +0 -0
  55. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  56. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/management/commands/profile.py +0 -0
  57. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/middleware/__init__.py +0 -0
  58. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/middleware/authentication.py +0 -0
  59. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/middleware/locale.py +0 -0
  60. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/middleware/profiling.py +0 -0
  61. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  62. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  63. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  64. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/migrations/__init__.py +0 -0
  65. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  66. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  67. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/models/__init__.py +0 -0
  68. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  69. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/models/cache_mixins.py +0 -0
  70. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/models/login_ban.py +0 -0
  71. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/models/not_null_fields.py +0 -0
  72. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  73. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  74. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/models/pfx_models.py +0 -0
  75. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/models/pfx_user.py +0 -0
  76. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  77. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/serializers/__init__.py +0 -0
  78. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/serializers/json.py +0 -0
  79. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/settings.py +0 -0
  80. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/shortcuts.py +0 -0
  81. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/storage/__init__.py +0 -0
  82. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/storage/exceptions.py +0 -0
  83. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/storage/local_storage.py +0 -0
  84. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/storage/s3_storage.py +0 -0
  85. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  86. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  87. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  88. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  89. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  90. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  91. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/test.py +0 -0
  92. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/urls.py +0 -0
  93. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/__init__.py +0 -0
  94. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/authentication_views.py +0 -0
  95. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/filters_views.py +0 -0
  96. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/locale_views.py +0 -0
  97. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
  98. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  99. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  100. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  101. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/groups.py +0 -0
  102. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  103. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  104. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  105. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  106. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  107. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  108. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  109. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  110. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  111. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/subset.py +0 -0
  112. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  113. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  114. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  115. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  116. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  117. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/settings/__init__.py +0 -0
  118. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pfx/settings/dev.py +0 -0
  119. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/pyproject.toml +0 -0
  120. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/requirements.txt +0 -0
  121. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/serve-doc +0 -0
  122. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/setup.cfg +0 -0
  123. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/setup.py +0 -0
  124. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/__init__.py +0 -0
  125. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/apps.py +0 -0
  126. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  127. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/migrations/0001_initial.py +0 -0
  128. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/migrations/0002_alter_book_cover.py +0 -0
  129. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/migrations/0003_book_local_file.py +0 -0
  130. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/migrations/__init__.py +0 -0
  131. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/models.py +0 -0
  132. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/settings/__init__.py +0 -0
  133. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/settings/ci.py +0 -0
  134. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/settings/common.py +0 -0
  135. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/settings/dev.py +0 -0
  136. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/settings/dev_custom_example.py +0 -0
  137. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/settings/dev_default.py +0 -0
  138. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/__init__.py +0 -0
  139. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/basic_api_errors.py +0 -0
  140. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/basic_api_test.py +0 -0
  141. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_api_doc.py +0 -0
  142. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_api_doc_search.py +0 -0
  143. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_auth_api.py +0 -0
  144. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_body_mixin.py +0 -0
  145. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_cache.py +0 -0
  146. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_client.py +0 -0
  147. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_fields_choices.py +0 -0
  148. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_fields_date.py +0 -0
  149. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_fields_decimal.py +0 -0
  150. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_fields_minutes_duration.py +0 -0
  151. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_fields_one2many.py +0 -0
  152. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_fields_rich_text.py +0 -0
  153. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_filters.py +0 -0
  154. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_locale_api.py +0 -0
  155. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  156. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_perm_tests.py +0 -0
  157. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_permissions.py +0 -0
  158. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_perms_api.py +0 -0
  159. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_post_migrate_groups_update.py +0 -0
  160. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_profiling_middleware.py +0 -0
  161. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_settings.py +0 -0
  162. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_shortcuts.py +0 -0
  163. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_timezone_middleware.py +0 -0
  164. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_tools.py +0 -0
  165. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_user_queryset.py +0 -0
  166. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_view_decorators.py +0 -0
  167. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/tests/test_view_fields.py +0 -0
  168. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/urls.py +0 -0
  169. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests/views.py +0 -0
  170. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/__init__.py +0 -0
  171. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/migrations/0001_initial.py +0 -0
  172. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/migrations/__init__.py +0 -0
  173. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/settings/__init__.py +0 -0
  174. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/settings/ci.py +0 -0
  175. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/settings/common.py +0 -0
  176. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/settings/dev.py +0 -0
  177. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/settings/dev_custom_example.py +0 -0
  178. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/settings/dev_default.py +0 -0
  179. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/tests/__init__.py +0 -0
  180. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/tests/test_api.py +0 -0
  181. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/tests/test_auth_api.py +0 -0
  182. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/urls.py +0 -0
  183. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_base_user/views.py +0 -0
  184. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/__init__.py +0 -0
  185. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/migrations/0001_initial.py +0 -0
  186. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/migrations/__init__.py +0 -0
  187. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/models.py +0 -0
  188. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/settings/__init__.py +0 -0
  189. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/settings/ci.py +0 -0
  190. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/settings/common.py +0 -0
  191. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/settings/dev.py +0 -0
  192. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/settings/dev_custom_example.py +0 -0
  193. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/settings/dev_default.py +0 -0
  194. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/tests/__init__.py +0 -0
  195. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/tests/test_api.py +0 -0
  196. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/tests/test_auth_api.py +0 -0
  197. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/tests_custom_user/urls.py +0 -0
  198. {django_pfx-1.4.dev164 → django_pfx-1.4.dev168}/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.dev164
3
+ Version: 1.4.dev168
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.dev164
3
+ Version: 1.4.dev168
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
@@ -2,6 +2,7 @@ import logging
2
2
  from importlib import import_module
3
3
  from urllib.request import urlopen
4
4
 
5
+ from django.core.exceptions import ValidationError
5
6
  from django.db import models
6
7
  from django.db.models.signals import post_delete, post_init
7
8
  from django.dispatch import receiver
@@ -10,6 +11,8 @@ from pfx.pfxcore.shortcuts import settings
10
11
 
11
12
  logger = logging.getLogger(__name__)
12
13
 
14
+ DEFAULT_KEYS = {"key", "name", "content-type", "content-length"}
15
+
13
16
 
14
17
  def get_storage_class(class_path):
15
18
  ps = class_path.split('.')
@@ -19,7 +22,7 @@ def get_storage_class(class_path):
19
22
  class MediaField(models.JSONField):
20
23
  def __init__(
21
24
  self, *args, max_length=255, get_key=None, storage=None,
22
- auto_delete=False, **kwargs):
25
+ auto_delete=False, extra_keys=None, **kwargs):
23
26
  self.get_key = get_key or self.get_default_key
24
27
  if not storage and not settings.STORAGE_DEFAULT:
25
28
  raise Exception(
@@ -27,14 +30,47 @@ class MediaField(models.JSONField):
27
30
  "class on the field or define STORAGE_DEFAULT settings.")
28
31
  self.storage = storage or get_storage_class(settings.STORAGE_DEFAULT)
29
32
  self.auto_delete = auto_delete
33
+ self.allowed_keys = DEFAULT_KEYS.union(extra_keys or set())
30
34
  self._db_value = None
31
- super().__init__(
32
- *args, max_length=max_length, **kwargs)
35
+
36
+ # Inject validator
37
+ kwargs.setdefault("validators", [])
38
+ kwargs["validators"].append(self.validate_keys)
39
+
40
+ super().__init__(*args, max_length=max_length, **kwargs)
33
41
 
34
42
  @staticmethod
35
43
  def get_default_key(obj, filename):
36
44
  return f"{type(obj).__name__}/{obj.pk}/{filename}"
37
45
 
46
+ def validate_keys(self, value):
47
+ if isinstance(value, dict):
48
+ missing_keys = []
49
+ if value.get('key'):
50
+ # Empty dict or empty key is allowed to save
51
+ # and object without file to have a pk to determine the key.
52
+ # When the key is set, other required keys must be present.
53
+ if not value.get('name'):
54
+ missing_keys.append('name')
55
+ if not value.get('content-type'):
56
+ missing_keys.append('content-type')
57
+ if not value.get('content-length'):
58
+ missing_keys.append('content-length')
59
+ if missing_keys:
60
+ raise ValidationError(
61
+ f"Missing required keys: {', '.join(missing_keys)}")
62
+ else:
63
+ raise ValidationError("Value must be a dictionary.")
64
+
65
+ def clean_value(self, value):
66
+ if isinstance(value, dict):
67
+ return {k: v for k, v in value.items() if k in self.allowed_keys}
68
+ return value
69
+
70
+ def get_prep_value(self, value):
71
+ value = self.clean_value(value)
72
+ return super().get_prep_value(value)
73
+
38
74
  def media_pre_save(self, obj):
39
75
  def save_file(obj, file, name):
40
76
  setattr(obj, self.name, self.upload(obj, file, name))
@@ -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é."
@@ -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