django-pfx 1.4.dev174__tar.gz → 1.4.dev176__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.dev174 → django_pfx-1.4.dev176}/PKG-INFO +1 -1
  2. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +10 -10
  4. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/shortcuts.py +11 -0
  5. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/storage/local_storage.py +6 -13
  6. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/fields.py +6 -0
  7. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/rest_views.py +0 -1
  8. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/basic_api_test.py +8 -18
  9. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/.gitignore +0 -0
  10. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/.gitlab-ci.yml +0 -0
  11. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/.pre-commit-config.yaml +0 -0
  12. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/LICENSE +0 -0
  13. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/MANIFEST.in +0 -0
  14. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/README.md +0 -0
  15. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/django_pfx.egg-info/SOURCES.txt +0 -0
  16. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/django_pfx.egg-info/dependency_links.txt +0 -0
  17. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/django_pfx.egg-info/requires.txt +0 -0
  18. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/django_pfx.egg-info/top_level.txt +0 -0
  19. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/Makefile +0 -0
  20. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/conf.py +0 -0
  21. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/index.rst +0 -0
  22. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/source/api.views.rst +0 -0
  23. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/source/authentication.md +0 -0
  24. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/source/decorator.md +0 -0
  25. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/source/generate_openapi.md +0 -0
  26. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/source/getting_started.md +0 -0
  27. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/source/internationalisation.md +0 -0
  28. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/source/model.md +0 -0
  29. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/source/pfx_views.md +0 -0
  30. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/source/profiling.md +0 -0
  31. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/source/settings.md +0 -0
  32. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/doc/source/testing.md +0 -0
  33. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/img/pfx.png +0 -0
  34. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/img/pfx.svg +0 -0
  35. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/make_messages +0 -0
  36. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/manage.py +0 -0
  37. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/__init__.py +0 -0
  38. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/__init__.py +0 -0
  39. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/apidoc/__init__.py +0 -0
  40. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/apidoc/parameters.py +0 -0
  41. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/apidoc/schema.py +0 -0
  42. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/apidoc/tags.py +0 -0
  43. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/apps.py +0 -0
  44. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/decorator/__init__.py +0 -0
  45. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/decorator/rest.py +0 -0
  46. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/default_settings.py +0 -0
  47. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/exceptions.py +0 -0
  48. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/fields/__init__.py +0 -0
  49. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/fields/decimal_field.py +0 -0
  50. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/fields/media_field.py +0 -0
  51. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  52. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/fields/rich_text_field.py +0 -0
  53. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/http/__init__.py +0 -0
  54. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/http/json_response.py +0 -0
  55. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  56. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/management/__init__.py +0 -0
  57. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/management/commands/__init__.py +0 -0
  58. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  59. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/management/commands/profile.py +0 -0
  60. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/middleware/__init__.py +0 -0
  61. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/middleware/authentication.py +0 -0
  62. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/middleware/locale.py +0 -0
  63. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/middleware/profiling.py +0 -0
  64. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  65. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  66. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  67. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/migrations/__init__.py +0 -0
  68. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  69. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  70. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/models/__init__.py +0 -0
  71. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  72. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/models/cache_mixins.py +0 -0
  73. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/models/login_ban.py +0 -0
  74. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/models/not_null_fields.py +0 -0
  75. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  76. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  77. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/models/pfx_models.py +0 -0
  78. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/models/pfx_user.py +0 -0
  79. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  80. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/serializers/__init__.py +0 -0
  81. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/serializers/json.py +0 -0
  82. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/settings.py +0 -0
  83. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/storage/__init__.py +0 -0
  84. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/storage/exceptions.py +0 -0
  85. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/storage/s3_storage.py +0 -0
  86. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  87. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  88. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  89. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  90. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  91. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  92. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/test.py +0 -0
  93. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/urls.py +0 -0
  94. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/__init__.py +0 -0
  95. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/authentication_views.py +0 -0
  96. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/filters_views.py +0 -0
  97. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/locale_views.py +0 -0
  98. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
  99. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  100. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  101. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  102. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/groups.py +0 -0
  103. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  104. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  105. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  106. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  107. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  108. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  109. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  110. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  111. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  112. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/subset.py +0 -0
  113. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  114. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  115. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  116. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  117. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  118. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/settings/__init__.py +0 -0
  119. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pfx/settings/dev.py +0 -0
  120. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/pyproject.toml +0 -0
  121. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/requirements.txt +0 -0
  122. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/serve-doc +0 -0
  123. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/setup.cfg +0 -0
  124. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/setup.py +0 -0
  125. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/__init__.py +0 -0
  126. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/apps.py +0 -0
  127. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  128. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/migrations/0001_initial.py +0 -0
  129. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/migrations/0002_alter_book_cover.py +0 -0
  130. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/migrations/0003_book_local_file.py +0 -0
  131. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/migrations/__init__.py +0 -0
  132. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/models.py +0 -0
  133. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/settings/__init__.py +0 -0
  134. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/settings/ci.py +0 -0
  135. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/settings/common.py +0 -0
  136. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/settings/dev.py +0 -0
  137. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/settings/dev_custom_example.py +0 -0
  138. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/settings/dev_default.py +0 -0
  139. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/__init__.py +0 -0
  140. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/basic_api_errors.py +0 -0
  141. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_api_doc.py +0 -0
  142. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_api_doc_search.py +0 -0
  143. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_auth_api.py +0 -0
  144. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_body_mixin.py +0 -0
  145. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_cache.py +0 -0
  146. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_client.py +0 -0
  147. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_fields_choices.py +0 -0
  148. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_fields_date.py +0 -0
  149. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_fields_decimal.py +0 -0
  150. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_fields_minutes_duration.py +0 -0
  151. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_fields_one2many.py +0 -0
  152. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_fields_rich_text.py +0 -0
  153. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_filters.py +0 -0
  154. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_locale_api.py +0 -0
  155. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  156. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_perm_tests.py +0 -0
  157. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_permissions.py +0 -0
  158. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_perms_api.py +0 -0
  159. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_post_migrate_groups_update.py +0 -0
  160. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_profiling_middleware.py +0 -0
  161. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_settings.py +0 -0
  162. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_shortcuts.py +0 -0
  163. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_timezone_middleware.py +0 -0
  164. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_tools.py +0 -0
  165. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_user_queryset.py +0 -0
  166. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_view_decorators.py +0 -0
  167. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/tests/test_view_fields.py +0 -0
  168. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/urls.py +0 -0
  169. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests/views.py +0 -0
  170. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/__init__.py +0 -0
  171. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/migrations/0001_initial.py +0 -0
  172. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/migrations/__init__.py +0 -0
  173. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/settings/__init__.py +0 -0
  174. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/settings/ci.py +0 -0
  175. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/settings/common.py +0 -0
  176. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/settings/dev.py +0 -0
  177. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/settings/dev_custom_example.py +0 -0
  178. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/settings/dev_default.py +0 -0
  179. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/tests/__init__.py +0 -0
  180. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/tests/test_api.py +0 -0
  181. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/tests/test_auth_api.py +0 -0
  182. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/urls.py +0 -0
  183. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_base_user/views.py +0 -0
  184. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/__init__.py +0 -0
  185. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/migrations/0001_initial.py +0 -0
  186. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/migrations/__init__.py +0 -0
  187. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/models.py +0 -0
  188. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/settings/__init__.py +0 -0
  189. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/settings/ci.py +0 -0
  190. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/settings/common.py +0 -0
  191. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/settings/dev.py +0 -0
  192. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/settings/dev_custom_example.py +0 -0
  193. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/settings/dev_default.py +0 -0
  194. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/tests/__init__.py +0 -0
  195. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/tests/test_api.py +0 -0
  196. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/tests/test_auth_api.py +0 -0
  197. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/tests_custom_user/urls.py +0 -0
  198. {django_pfx-1.4.dev174 → django_pfx-1.4.dev176}/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.dev174
3
+ Version: 1.4.dev176
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.dev174
3
+ Version: 1.4.dev176
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-12-18 12:52+0100\n"
10
+ "POT-Creation-Date: 2026-02-11 13:48+0100\n"
11
11
  "PO-Revision-Date: 2021-06-22 23:31+0200\n"
12
12
  "Last-Translator: \n"
13
13
  "Language-Team: \n"
@@ -112,27 +112,27 @@ msgstr "OTP activé"
112
112
  msgid "%(model_name)s with this %(field_labels)s already exists."
113
113
  msgstr "%(model_name)s avec ce/cette %(field_labels)s éxiste déjà."
114
114
 
115
- #: shortcuts.py:51
115
+ #: shortcuts.py:52
116
116
  #, python-brace-format
117
117
  msgid "{key} must be an integer number."
118
118
  msgstr "{key} doit être un nombre entier."
119
119
 
120
- #: shortcuts.py:67
120
+ #: shortcuts.py:68
121
121
  #, python-brace-format
122
122
  msgid "{key} must be a number."
123
123
  msgstr "{key} doit être un nombre."
124
124
 
125
- #: shortcuts.py:83
125
+ #: shortcuts.py:84
126
126
  #, python-brace-format
127
127
  msgid "{key} must be a decimal number."
128
128
  msgstr "{key} doit être un nombre décimal."
129
129
 
130
- #: shortcuts.py:99
130
+ #: shortcuts.py:100
131
131
  #, python-brace-format
132
132
  msgid "{key} must be a date."
133
133
  msgstr "{key} doit être une date."
134
134
 
135
- #: shortcuts.py:120
135
+ #: shortcuts.py:121
136
136
  #, python-brace-format
137
137
  msgid "{key} must be “true”, “false”, “1”, “0” or empty."
138
138
  msgstr "{key} doit être « true », « false », « 1 », « 0 » ou vide"
@@ -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:225 views/rest_views.py:391
289
+ #: views/rest_views.py:225 views/rest_views.py:390
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:355
295
+ #: views/rest_views.py:354
296
296
  #, python-brace-format
297
297
  msgid "{model} {obj} created."
298
298
  msgstr "{model} {obj} créé."
299
299
 
300
- #: views/rest_views.py:356
300
+ #: views/rest_views.py:355
301
301
  #, python-brace-format
302
302
  msgid "{model} {obj} updated."
303
303
  msgstr "{model} {obj} modifié."
304
304
 
305
- #: views/rest_views.py:1270
305
+ #: views/rest_views.py:1269
306
306
  #, python-brace-format
307
307
  msgid "{model} {obj} deleted."
308
308
  msgstr "{model} {obj} supprimé."
@@ -2,6 +2,7 @@
2
2
  import logging
3
3
  from datetime import date
4
4
  from decimal import Decimal as D
5
+ from pathlib import Path
5
6
 
6
7
  from django.core.exceptions import ObjectDoesNotExist
7
8
  from django.utils.translation import gettext_lazy as _
@@ -156,3 +157,13 @@ def permissions(*perms):
156
157
  def model_permissions(model, *actions):
157
158
  meta = model._meta
158
159
  return {f"{meta.app_label}.{a}_{meta.model_name}" for a in actions}
160
+
161
+
162
+ def file_extension(filename):
163
+ suffixes = Path(filename).suffixes
164
+ if not suffixes:
165
+ return ''
166
+ elif suffixes[-1] in ['gz', 'bz2'] and len(suffixes) > 1:
167
+ return ''.join(suffixes[-2:])
168
+ else:
169
+ return suffixes[-1]
@@ -1,10 +1,10 @@
1
- import hashlib
2
1
  import logging
2
+ import uuid
3
3
  from pathlib import Path
4
4
 
5
5
  from django.http import FileResponse
6
6
 
7
- from pfx.pfxcore.shortcuts import settings
7
+ from pfx.pfxcore.shortcuts import file_extension, settings
8
8
 
9
9
  logger = logging.getLogger(__name__)
10
10
 
@@ -24,18 +24,11 @@ class LocalStorage:
24
24
  relative_path = Path(*key_list[:-1])
25
25
  dirname = Path(settings.STORAGE_LOCAL_ROOT, relative_path)
26
26
  dirname.mkdir(parents=True, exist_ok=True)
27
- suffixes = Path(filename).suffixes
28
- if not suffixes:
29
- ext = ''
30
- elif suffixes[-1] in ['gz', 'bz2'] and len(suffixes) > 1:
31
- ext = ''.join(suffixes[-2:])
32
- else:
33
- ext = suffixes[-1]
34
- hashname = f'{hashlib.sha1(file).hexdigest()}{ext}'
35
- final_key = str(Path(relative_path, hashname))
36
- with open(Path(dirname, hashname), 'wb') as f:
27
+ uuidname = f'{uuid.uuid4()}{file_extension(filename)}'
28
+ final_key = str(Path(relative_path, uuidname))
29
+ with open(Path(dirname, uuidname), 'wb') as f:
37
30
  f.write(file)
38
- with open(Path(dirname, hashname), 'rb') as f:
31
+ with open(Path(dirname, uuidname), 'rb') as f:
39
32
  response = FileResponse(
40
33
  f, as_attachment=True, filename=filename)
41
34
  return {
@@ -2,6 +2,10 @@ import inspect
2
2
  import logging
3
3
  import operator
4
4
 
5
+ from django.contrib.contenttypes.fields import (
6
+ GenericForeignKey,
7
+ GenericRelation,
8
+ )
5
9
  from django.core.exceptions import ValidationError
6
10
  from django.db import models
7
11
  from django.db.models.constants import LOOKUP_SEP
@@ -57,6 +61,8 @@ class FieldType:
57
61
  (models.CharField, CharField),
58
62
  (models.URLField, CharField),
59
63
  (models.UUIDField, CharField),
64
+ (GenericRelation, ModelObjectList),
65
+ (GenericForeignKey, ModelObject),
60
66
  (models.ForeignObject, ModelObject),
61
67
  (models.OneToOneRel, ModelObject),
62
68
  (models.ForeignObjectRel, ModelObjectList),
@@ -333,7 +333,6 @@ class ModelResponseMixin(ModelMixin):
333
333
  obj._rel_data = rel_data or {}
334
334
  if errors:
335
335
  try:
336
- obj._rel_data = rel_data
337
336
  obj.full_clean(**kwargs)
338
337
  except ValidationError as e:
339
338
  for k, ms in e.error_dict.items():
@@ -746,15 +746,12 @@ class BasicAPITest(TestAssertMixin, TestCase):
746
746
  self.assertRC(response, 200)
747
747
  self.assertJE(response, 'local_file.content-length', '12')
748
748
  self.assertJE(response, 'local_file.content-type', 'text/plain')
749
- self.assertJE(
750
- response, 'local_file.key',
751
- f"Book/{book_pk}/bca20547e94049e1ffea27223581c567022a5774.txt")
749
+ self.assertJEExists(response, 'local_file.key')
752
750
  self.assertJE(response, 'local_file.name', 'test.txt')
753
751
  self.assertJE(
754
752
  response, 'local_file.url', f"/books/{book_pk}/local_file")
755
- self.assertTrue(Path(
756
- f'/tmp/django-pfx-filestore/Book/{book_pk}/'
757
- 'bca20547e94049e1ffea27223581c567022a5774.txt').exists())
753
+ key1 = self.get_val(response, 'local_file.key')
754
+ self.assertTrue(Path(f'/tmp/django-pfx-filestore/{key1}').exists())
758
755
 
759
756
  # Replace file
760
757
  response = self.client.put(f'/api/books/{book_pk}', dict(
@@ -763,25 +760,18 @@ class BasicAPITest(TestAssertMixin, TestCase):
763
760
  base64='data:text/plain;charset=utf-8;'
764
761
  'base64,TmV3IGNvbnRlbnQ=')))
765
762
  self.assertRC(response, 200)
766
- self.assertJE(
767
- response, 'local_file.key',
768
- f"Book/{book_pk}/af9f06b2b3b1546ac44f4a02994d0ef09e074b91.txt")
763
+ self.assertNJE(response, 'local_file.key', key1)
769
764
  self.assertJE(response, 'local_file.name', 'test2.txt')
770
- self.assertFalse(Path(
771
- f'/tmp/django-pfx-filestore/Book/{book_pk}/'
772
- 'bca20547e94049e1ffea27223581c567022a5774.txt').exists())
773
- self.assertTrue(Path(
774
- f'/tmp/django-pfx-filestore/Book/{book_pk}/'
775
- 'af9f06b2b3b1546ac44f4a02994d0ef09e074b91.txt').exists())
765
+ self.assertFalse(Path(f'/tmp/django-pfx-filestore/{key1}').exists())
766
+ key2 = self.get_val(response, 'local_file.key')
767
+ self.assertTrue(Path(f'/tmp/django-pfx-filestore/{key2}').exists())
776
768
 
777
769
  # Delete file
778
770
  response = self.client.put(f'/api/books/{book_pk}', dict(
779
771
  local_file=None))
780
772
  self.assertRC(response, 200)
781
773
  self.assertJE(response, 'local_file', None)
782
- self.assertFalse(Path(
783
- f'/tmp/django-pfx-filestore/Book/{book_pk}/'
784
- 'af9f06b2b3b1546ac44f4a02994d0ef09e074b91.txt').exists())
774
+ self.assertFalse(Path(f'/tmp/django-pfx-filestore/{key2}').exists())
785
775
 
786
776
  def test_create_null_values(self):
787
777
  response = self.client.post(
File without changes