django-pfx 1.7.6.dev9__tar.gz → 1.7.6.dev13__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 (314) hide show
  1. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/PKG-INFO +1 -1
  2. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/django_pfx.egg-info/PKG-INFO +1 -1
  3. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/django_pfx.egg-info/SOURCES.txt +1 -0
  4. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/django_pfx.egg-info/scm_file_list.json +1 -0
  5. django_pfx-1.7.6.dev13/django_pfx.egg-info/scm_version.json +8 -0
  6. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +4 -4
  7. django_pfx-1.7.6.dev13/pfx/pfxcore/middleware/ws_cookie_authentication_middleware.py +60 -0
  8. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/media_rest_view_mixin.py +3 -2
  9. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/__init__.py +1 -0
  10. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/basic_api_test.py +35 -0
  11. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_user_job_api.py +1 -1
  12. django_pfx-1.7.6.dev13/tests/tests/test_ws_cookie_middleware.py +30 -0
  13. django_pfx-1.7.6.dev9/django_pfx.egg-info/scm_version.json +0 -8
  14. django_pfx-1.7.6.dev9/pfx/pfxcore/middleware/ws_cookie_authentication_middleware.py +0 -35
  15. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/.gitignore +0 -0
  16. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/.gitlab-ci.yml +0 -0
  17. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/.pre-commit-config.yaml +0 -0
  18. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/LICENSE +0 -0
  19. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/MANIFEST.in +0 -0
  20. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/README.md +0 -0
  21. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/django_pfx.egg-info/dependency_links.txt +0 -0
  22. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/django_pfx.egg-info/requires.txt +0 -0
  23. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/django_pfx.egg-info/top_level.txt +0 -0
  24. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/Makefile +0 -0
  25. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/conf.py +0 -0
  26. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/index.rst +0 -0
  27. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/api.views.rst +0 -0
  28. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/authentication.md +0 -0
  29. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/decorator.md +0 -0
  30. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/generate_openapi.md +0 -0
  31. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/getting_started.md +0 -0
  32. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/internationalisation.md +0 -0
  33. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/model.md +0 -0
  34. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/pfx_views.md +0 -0
  35. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/profiling.md +0 -0
  36. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/settings.md +0 -0
  37. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/testing.md +0 -0
  38. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/doc/source/user_jobs.md +0 -0
  39. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/img/pfx.png +0 -0
  40. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/img/pfx.svg +0 -0
  41. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/make_messages +0 -0
  42. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/manage.py +0 -0
  43. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/__init__.py +0 -0
  44. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/__init__.py +0 -0
  45. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/apps.py +0 -0
  46. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/email_backend/__init__.py +0 -0
  47. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/email_backend/q_mailjet_email_backend.py +0 -0
  48. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/exceptions.py +0 -0
  49. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/mailjet/__init__.py +0 -0
  50. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/mailjet/mailjet.py +0 -0
  51. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/mailjet/message_result.py +0 -0
  52. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/0001_initial.py +0 -0
  53. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/0002_alter_email_headers.py +0 -0
  54. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/0003_alter_email_options.py +0 -0
  55. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/0004_alter_email_mail_from.py +0 -0
  56. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/migrations/__init__.py +0 -0
  57. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/models/__init__.py +0 -0
  58. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/models/email.py +0 -0
  59. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/providers/__init__.py +0 -0
  60. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/providers/email_django_q_executor.py +0 -0
  61. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/shortcuts.py +0 -0
  62. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/tasks.py +0 -0
  63. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/templates/emails/base_template.html +0 -0
  64. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/templates/emails/base_template.txt +0 -0
  65. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/templates/emails/base_template_subject.txt +0 -0
  66. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/urls.py +0 -0
  67. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/views/__init__.py +0 -0
  68. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/emails/views/email_rest_view.py +0 -0
  69. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/__init__.py +0 -0
  70. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/apidoc/__init__.py +0 -0
  71. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/apidoc/parameters.py +0 -0
  72. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/apidoc/schema.py +0 -0
  73. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/apidoc/tags.py +0 -0
  74. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/apps.py +0 -0
  75. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/decorator/__init__.py +0 -0
  76. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/decorator/rest.py +0 -0
  77. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/default_settings.py +0 -0
  78. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/exceptions.py +0 -0
  79. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/fields/__init__.py +0 -0
  80. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/fields/decimal_field.py +0 -0
  81. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/fields/media_field.py +0 -0
  82. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  83. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/fields/rich_text_field.py +0 -0
  84. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/http/__init__.py +0 -0
  85. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/http/json_response.py +0 -0
  86. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  87. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/management/__init__.py +0 -0
  88. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/management/commands/__init__.py +0 -0
  89. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  90. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/management/commands/profile.py +0 -0
  91. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/mfa/__init__.py +0 -0
  92. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/mfa/authenticator.py +0 -0
  93. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/mfa/base.py +0 -0
  94. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/mfa/email.py +0 -0
  95. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/mfa/legacy.py +0 -0
  96. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/mfa/sms.py +0 -0
  97. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/middleware/__init__.py +0 -0
  98. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/middleware/authentication.py +0 -0
  99. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/middleware/locale.py +0 -0
  100. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/middleware/profiling.py +0 -0
  101. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/middleware/request_too_big_middleware.py +0 -0
  102. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  103. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  104. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  105. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0004_alter_loginban_failed_counter_and_more.py +0 -0
  106. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0005_mfadevice_mfadevice_mfa_device_unique_backend.py +0 -0
  107. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0006_alter_pfxuser_managers.py +0 -0
  108. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/0007_alter_pfxuser_options.py +0 -0
  109. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/__init__.py +0 -0
  110. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  111. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  112. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/__init__.py +0 -0
  113. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  114. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/attachment_mixin.py +0 -0
  115. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/cache_mixins.py +0 -0
  116. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/login_ban.py +0 -0
  117. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/mfa_device.py +0 -0
  118. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/mfa_user_mixin.py +0 -0
  119. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/not_null_fields.py +0 -0
  120. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  121. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/pfx_models.py +0 -0
  122. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/pfx_user.py +0 -0
  123. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  124. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/serializers/__init__.py +0 -0
  125. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/serializers/json.py +0 -0
  126. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/settings.py +0 -0
  127. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/shortcuts.py +0 -0
  128. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/sms/__init__.py +0 -0
  129. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/sms/backends/__init__.py +0 -0
  130. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/sms/backends/base.py +0 -0
  131. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/sms/backends/console.py +0 -0
  132. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/storage/__init__.py +0 -0
  133. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/storage/exceptions.py +0 -0
  134. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/storage/local_storage.py +0 -0
  135. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/storage/s3_storage.py +0 -0
  136. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  137. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  138. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  139. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  140. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  141. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  142. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/test.py +0 -0
  143. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/urls.py +0 -0
  144. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/version_check.py +0 -0
  145. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/__init__.py +0 -0
  146. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/authentication_views.py +0 -0
  147. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/fields.py +0 -0
  148. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/filters_views.py +0 -0
  149. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/locale_views.py +0 -0
  150. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/mfa_authentication_views.py +0 -0
  151. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  152. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  153. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  154. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/groups.py +0 -0
  155. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  156. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  157. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  158. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  159. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  160. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  161. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  162. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  163. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  164. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/subset.py +0 -0
  165. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  166. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  167. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  168. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  169. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  170. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/pfxcore/views/rest_views.py +0 -0
  171. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/settings/__init__.py +0 -0
  172. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/settings/dev.py +0 -0
  173. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/__init__.py +0 -0
  174. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/apps.py +0 -0
  175. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/locale/fr/LC_MESSAGES/django.mo +0 -0
  176. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/locale/fr/LC_MESSAGES/django.po +0 -0
  177. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/migrations/0001_initial.py +0 -0
  178. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/migrations/0002_alter_userjob_options_alter_userjob_auto_queued_and_more.py +0 -0
  179. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/migrations/0003_clean_scheduled_tasks.py +0 -0
  180. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/migrations/0004_userjob_summary_url.py +0 -0
  181. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/migrations/0005_swappable_user_job.py +0 -0
  182. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/migrations/__init__.py +0 -0
  183. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/models/__init__.py +0 -0
  184. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/models/user_job.py +0 -0
  185. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/models/user_job_attachment.py +0 -0
  186. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/providers/__init__.py +0 -0
  187. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/providers/user_job_django_q_executor.py +0 -0
  188. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/providers/user_job_websocket_channel_provider.py +0 -0
  189. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/tasks.py +0 -0
  190. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/urls.py +0 -0
  191. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/views/__init__.py +0 -0
  192. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/views/user_job_attachment_view.py +0 -0
  193. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/views/user_job_view.py +0 -0
  194. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pfx/userjobs/views/user_websocket_consumer.py +0 -0
  195. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/pyproject.toml +0 -0
  196. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/requirements.txt +0 -0
  197. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/serve-doc +0 -0
  198. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/setup.cfg +0 -0
  199. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/setup.py +0 -0
  200. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/__init__.py +0 -0
  201. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/apps.py +0 -0
  202. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/channel_group_send_calls.py +0 -0
  203. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  204. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/mfa_urls.py +0 -0
  205. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/migrations/0001_initial.py +0 -0
  206. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/migrations/__init__.py +0 -0
  207. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/models.py +0 -0
  208. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/settings/__init__.py +0 -0
  209. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/settings/ci.py +0 -0
  210. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/settings/common.py +0 -0
  211. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/settings/dev.py +0 -0
  212. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/settings/dev_custom_example.py +0 -0
  213. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/settings/dev_default.py +0 -0
  214. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/basic_api_errors.py +0 -0
  215. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/mfa_test_utils.py +0 -0
  216. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_api_doc.py +0 -0
  217. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_api_doc_search.py +0 -0
  218. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_auth_api.py +0 -0
  219. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_body_mixin.py +0 -0
  220. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_cache.py +0 -0
  221. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_client.py +0 -0
  222. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_emails_email_api.py +0 -0
  223. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_emails_email_model.py +0 -0
  224. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_emails_q_mailjet_email_backend.py +0 -0
  225. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_emails_send_email_message.py +0 -0
  226. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_choices.py +0 -0
  227. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_date.py +0 -0
  228. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_decimal.py +0 -0
  229. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_minutes_duration.py +0 -0
  230. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_one2many.py +0 -0
  231. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_rich_text.py +0 -0
  232. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_fields_time.py +0 -0
  233. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_filters.py +0 -0
  234. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_locale_api.py +0 -0
  235. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_mfa_legacy.py +0 -0
  236. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_mfa_login_api.py +0 -0
  237. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_mfa_setup_api.py +0 -0
  238. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  239. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_perm_tests.py +0 -0
  240. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_permissions.py +0 -0
  241. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_perms_api.py +0 -0
  242. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_post_migrate_groups_update.py +0 -0
  243. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_profiling_middleware.py +0 -0
  244. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_settings.py +0 -0
  245. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_shortcuts.py +0 -0
  246. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_timezone_middleware.py +0 -0
  247. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_tools.py +0 -0
  248. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_user_job_messages.py +0 -0
  249. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_user_job_model.py +0 -0
  250. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_user_queryset.py +0 -0
  251. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_user_websocket.py +0 -0
  252. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_version_check.py +0 -0
  253. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_view_decorators.py +0 -0
  254. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/tests/test_view_fields.py +0 -0
  255. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/urls.py +0 -0
  256. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests/views.py +0 -0
  257. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/__init__.py +0 -0
  258. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/migrations/__init__.py +0 -0
  259. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/settings/__init__.py +0 -0
  260. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/settings/ci.py +0 -0
  261. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/settings/common.py +0 -0
  262. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/settings/dev.py +0 -0
  263. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/settings/dev_custom_example.py +0 -0
  264. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/settings/dev_default.py +0 -0
  265. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/tests/__init__.py +0 -0
  266. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/tests/test_api.py +0 -0
  267. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/tests/test_auth_api.py +0 -0
  268. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/urls.py +0 -0
  269. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_base_user/views.py +0 -0
  270. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/__init__.py +0 -0
  271. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/migrations/0001_initial.py +0 -0
  272. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/migrations/__init__.py +0 -0
  273. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/models.py +0 -0
  274. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/settings/__init__.py +0 -0
  275. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/settings/ci.py +0 -0
  276. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/settings/common.py +0 -0
  277. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/settings/dev.py +0 -0
  278. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/settings/dev_custom_example.py +0 -0
  279. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/settings/dev_default.py +0 -0
  280. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/tests/__init__.py +0 -0
  281. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/tests/test_api.py +0 -0
  282. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/tests/test_auth_api.py +0 -0
  283. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/urls.py +0 -0
  284. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user/views.py +0 -0
  285. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/__init__.py +0 -0
  286. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/migrations/0001_initial.py +0 -0
  287. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/migrations/__init__.py +0 -0
  288. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/models.py +0 -0
  289. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/providers.py +0 -0
  290. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/scope.py +0 -0
  291. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/settings/__init__.py +0 -0
  292. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/settings/ci.py +0 -0
  293. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/settings/common.py +0 -0
  294. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/settings/dev.py +0 -0
  295. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/settings/dev_custom_example.py +0 -0
  296. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/settings/dev_default.py +0 -0
  297. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/tests/__init__.py +0 -0
  298. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/tests/test_user_job.py +0 -0
  299. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_custom_user_job/urls.py +0 -0
  300. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/__init__.py +0 -0
  301. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/migrations/0001_initial.py +0 -0
  302. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/migrations/__init__.py +0 -0
  303. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/models.py +0 -0
  304. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/settings/__init__.py +0 -0
  305. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/settings/ci.py +0 -0
  306. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/settings/common.py +0 -0
  307. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/settings/dev.py +0 -0
  308. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/settings/dev_custom_example.py +0 -0
  309. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/settings/dev_default.py +0 -0
  310. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/tests/__init__.py +0 -0
  311. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/tests/test_api.py +0 -0
  312. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/tests/test_auth_api.py +0 -0
  313. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/urls.py +0 -0
  314. {django_pfx-1.7.6.dev9 → django_pfx-1.7.6.dev13}/tests_user_email_login/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-pfx
3
- Version: 1.7.6.dev9
3
+ Version: 1.7.6.dev13
4
4
  Summary: Django PFX is a toolkit designed to streamline the development of RESTful APIs using the Django framework.
5
5
  Author: Hervé Martinet
6
6
  Author-email: herve.martinet@gmail.com
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-pfx
3
- Version: 1.7.6.dev9
3
+ Version: 1.7.6.dev13
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
@@ -250,6 +250,7 @@ tests/tests/test_user_websocket.py
250
250
  tests/tests/test_version_check.py
251
251
  tests/tests/test_view_decorators.py
252
252
  tests/tests/test_view_fields.py
253
+ tests/tests/test_ws_cookie_middleware.py
253
254
  tests_base_user/__init__.py
254
255
  tests_base_user/urls.py
255
256
  tests_base_user/views.py
@@ -241,6 +241,7 @@
241
241
  "tests/tests/test_version_check.py",
242
242
  "tests/tests/test_view_decorators.py",
243
243
  "tests/tests/test_view_fields.py",
244
+ "tests/tests/test_ws_cookie_middleware.py",
244
245
  "tests/urls.py",
245
246
  "tests/views.py",
246
247
  "tests_base_user/__init__.py",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "1.7.5",
3
+ "distance": 13,
4
+ "node": "ge2688ed2e503d5fd499e73d8edb4fd9f28499922",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-09-24"
8
+ }
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: \n"
9
9
  "Report-Msgid-Bugs-To: \n"
10
- "POT-Creation-Date: 2026-08-12 16:15+0200\n"
10
+ "POT-Creation-Date: 2026-09-24 07:09+0200\n"
11
11
  "PO-Revision-Date: 2021-06-22 23:31+0200\n"
12
12
  "Last-Translator: \n"
13
13
  "Language-Team: \n"
@@ -206,8 +206,8 @@ msgid ""
206
206
  "You’re receiving this email because you requested an authentication code at "
207
207
  "%(site_name)s."
208
208
  msgstr ""
209
- "Vous recevez cet e-mail parce que vous avez demandé un code d’authentification "
210
- "sur %(site_name)s."
209
+ "Vous recevez cet e-mail parce que vous avez demandé un code "
210
+ "d’authentification sur %(site_name)s."
211
211
 
212
212
  #: templates/registration/otp_code_email.txt:4
213
213
  msgid "Authentication code:"
@@ -323,7 +323,7 @@ msgstr ""
323
323
  msgid "Invalid value for {filter} filter"
324
324
  msgstr "Valeur invalide pour le filtre {filter}"
325
325
 
326
- #: views/media_rest_view_mixin.py:37 views/media_rest_view_mixin.py:125
326
+ #: views/media_rest_view_mixin.py:38 views/media_rest_view_mixin.py:126
327
327
  msgid "Unexpected storage error"
328
328
  msgstr "Erreur de stockage inattendue"
329
329
 
@@ -0,0 +1,60 @@
1
+ import logging
2
+
3
+ from django.contrib.auth.models import AnonymousUser
4
+ from django.core.exceptions import ImproperlyConfigured
5
+ from django.http import parse_cookie
6
+
7
+ from pfx.pfxcore.middleware.authentication import JWTTokenDecodeMixin
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+ try:
12
+ from channels.db import database_sync_to_async
13
+ from channels.middleware import BaseMiddleware
14
+ except ImportError as e:
15
+ # Channels is only needed by the projects serving websockets, but
16
+ # naming any middleware of `pfx.pfxcore.middleware` makes Django
17
+ # import the whole package: this module has to stay importable
18
+ # without it. The error is raised when the middleware is used.
19
+ CHANNELS_IMPORT_ERROR = e
20
+ database_sync_to_async = None
21
+ BaseMiddleware = object
22
+ else:
23
+ CHANNELS_IMPORT_ERROR = None
24
+
25
+
26
+ class WSCookieAuthenticationMiddleware(JWTTokenDecodeMixin, BaseMiddleware):
27
+ def __init__(self, *args, **kwargs):
28
+ if CHANNELS_IMPORT_ERROR:
29
+ raise ImproperlyConfigured(
30
+ f'Missing channels: {CHANNELS_IMPORT_ERROR}\n'
31
+ "PFX CONFIGURATION ERROR: You have to install channels "
32
+ "to use [pfx.pfxcore.middleware."
33
+ f"{self.__class__.__name__}]:\n"
34
+ "pip install channels\n"
35
+ "(and a websocket server, for instance with "
36
+ "`pip install channels[daphne]`)"
37
+ ) from CHANNELS_IMPORT_ERROR
38
+ super().__init__(*args, **kwargs)
39
+
40
+ async def __call__(self, scope, receive, send):
41
+ if scope.get("user") is not None:
42
+ return await super().__call__(scope, receive, send)
43
+
44
+ headers = dict(scope.get("headers", []))
45
+ cookies = {}
46
+ if b"cookie" in headers:
47
+ cookies = parse_cookie(headers[b"cookie"].decode())
48
+
49
+ key = cookies.get("token")
50
+ if key:
51
+ try:
52
+ user, __, __ = await database_sync_to_async(
53
+ self.decode_jwt)(key)
54
+ except Exception as e:
55
+ logger.exception(e, exc_info=True)
56
+ user = AnonymousUser()
57
+ else:
58
+ user = AnonymousUser()
59
+ scope['user'] = user
60
+ return await super().__call__(scope, receive, send)
@@ -3,6 +3,7 @@ import logging
3
3
  from django.core.exceptions import FieldDoesNotExist
4
4
  from django.http import FileResponse, HttpResponse
5
5
  from django.shortcuts import redirect
6
+ from django.utils.http import content_disposition_header
6
7
  from django.utils.translation import gettext_lazy as _
7
8
 
8
9
  from pfx.pfxcore.decorator import rest_api
@@ -42,8 +43,8 @@ def get_media_field_response(obj, field, request):
42
43
  inline = get_bool(request.GET, "inline")
43
44
  if settings.STORAGE_LOCAL_X_ACCEL_REDIRECT:
44
45
  response = HttpResponse()
45
- response["Content-Disposition"] = (
46
- f"{"inline" if inline else "attachment"}; filename={filename}")
46
+ response["Content-Disposition"] = content_disposition_header(
47
+ not inline, filename)
47
48
  response["Content-Type"] = attr.get('content-type', '')
48
49
  response['X-Accel-Redirect'] = (
49
50
  f"/filestore/{attr.get('key')}")
@@ -39,3 +39,4 @@ from .test_user_queryset import TestUserQuerySet
39
39
  from .test_user_websocket import TestUserWebsocket
40
40
  from .test_view_decorators import ViewDecoratorTest
41
41
  from .test_view_fields import ViewFieldTest
42
+ from .test_ws_cookie_middleware import TestWSCookieMiddleware
@@ -840,6 +840,41 @@ class BasicAPITest(TestAssertMixin, TestCase):
840
840
  self.assertJE(response, 'local_file', None)
841
841
  self.assertFalse(Path(f'/tmp/django-pfx-filestore/{key2}').exists())
842
842
 
843
+ def test_get_file_content_disposition(self):
844
+ """The file name must survive both local serving paths.
845
+
846
+ The name holds "…", outside latin-1: written by hand into the
847
+ X-Accel header, it made Django MIME-encode the whole value
848
+ (`=?utf-8?q?…?=`), which browsers cannot read, so "inline" was
849
+ lost. The ";" would also have cut the unquoted name short.
850
+ FileResponse is checked too, as both paths must agree.
851
+ """
852
+ response = self.client.post('/api/books', dict(
853
+ name="Test Book",
854
+ author=self.author1.pk,
855
+ pub_date='2000-01-01',
856
+ local_file=dict(
857
+ name='Crédit; école[…].txt',
858
+ base64='data:text/plain;charset=utf-8;'
859
+ 'base64,VGVzdCBjb250ZW50')))
860
+ self.assertRC(response, 200)
861
+ url = f"/api/books/{self.get_val(response, 'pk')}/local_file"
862
+ name = (
863
+ "filename*=utf-8''"
864
+ "Cr%C3%A9dit%3B%20%C3%A9cole%5B%E2%80%A6%5D.txt")
865
+
866
+ for x_accel in (True, False):
867
+ with override_settings(STORAGE_LOCAL_X_ACCEL_REDIRECT=x_accel):
868
+ response = self.client.get(url)
869
+ self.assertRC(response, 200)
870
+ self.assertEqual(
871
+ response['Content-Disposition'], f"attachment; {name}")
872
+
873
+ response = self.client.get(f"{url}?inline=true")
874
+ self.assertRC(response, 200)
875
+ self.assertEqual(
876
+ response['Content-Disposition'], f"inline; {name}")
877
+
843
878
  def test_create_null_values(self):
844
879
  response = self.client.post(
845
880
  '/api/books', dict(
@@ -353,7 +353,7 @@ class TestUserJobApi(TestAssertMixin, TestCase):
353
353
  self.assertRC(response, 200)
354
354
  self.assertEqual(
355
355
  response.headers['Content-Disposition'],
356
- "attachment; filename=test.txt")
356
+ 'attachment; filename="test.txt"')
357
357
  self.assertEqual(
358
358
  response.headers['X-Accel-Redirect'],
359
359
  f"/filestore/{att.file['key']}")
@@ -0,0 +1,30 @@
1
+ import logging
2
+ from unittest.mock import patch
3
+
4
+ from django.core.exceptions import ImproperlyConfigured
5
+ from django.test import TestCase
6
+
7
+ from pfx.pfxcore.middleware import WSCookieAuthenticationMiddleware
8
+ from pfx.pfxcore.middleware import ws_cookie_authentication_middleware as mod
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class TestWSCookieMiddleware(TestCase):
14
+ """Channels is an optional dependency: naming any middleware of
15
+ `pfx.pfxcore.middleware` makes Django import the whole package, so a
16
+ project serving no websocket must not need it installed."""
17
+
18
+ def test_module_is_importable_without_channels(self):
19
+ # The module is already imported: reaching this point at all
20
+ # means the package did not require channels at import time.
21
+ self.assertIsNone(mod.CHANNELS_IMPORT_ERROR)
22
+
23
+ def test_middleware_reports_the_missing_dependency(self):
24
+ error = ImportError("No module named 'channels'")
25
+ with patch.object(mod, 'CHANNELS_IMPORT_ERROR', error):
26
+ with self.assertRaises(ImproperlyConfigured) as ctx:
27
+ WSCookieAuthenticationMiddleware(lambda *a: None)
28
+ message = str(ctx.exception)
29
+ self.assertIn("No module named 'channels'", message)
30
+ self.assertIn('pip install channels', message)
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "1.7.5",
3
- "distance": 9,
4
- "node": "g7626d2f586fb8dbaa121ce3d2676a0e0c185f7fe",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-09-01"
8
- }
@@ -1,35 +0,0 @@
1
- import logging
2
-
3
- from django.contrib.auth.models import AnonymousUser
4
- from django.http import parse_cookie
5
-
6
- from channels.db import database_sync_to_async
7
- from channels.middleware import BaseMiddleware
8
-
9
- from pfx.pfxcore.middleware.authentication import JWTTokenDecodeMixin
10
-
11
- logger = logging.getLogger(__name__)
12
-
13
-
14
- class WSCookieAuthenticationMiddleware(JWTTokenDecodeMixin, BaseMiddleware):
15
- async def __call__(self, scope, receive, send):
16
- if scope.get("user") is not None:
17
- return await super().__call__(scope, receive, send)
18
-
19
- headers = dict(scope.get("headers", []))
20
- cookies = {}
21
- if b"cookie" in headers:
22
- cookies = parse_cookie(headers[b"cookie"].decode())
23
-
24
- key = cookies.get("token")
25
- if key:
26
- try:
27
- user, __, __ = await database_sync_to_async(
28
- self.decode_jwt)(key)
29
- except Exception as e:
30
- logger.exception(e, exc_info=True)
31
- user = AnonymousUser()
32
- else:
33
- user = AnonymousUser()
34
- scope['user'] = user
35
- return await super().__call__(scope, receive, send)