django-pfx 1.7.6.dev27__tar.gz → 1.7.6.dev31__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 (328) hide show
  1. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/PKG-INFO +1 -1
  2. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/django_pfx.egg-info/PKG-INFO +1 -1
  3. django_pfx-1.7.6.dev31/django_pfx.egg-info/scm_version.json +8 -0
  4. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/shortcuts.py +17 -3
  5. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/test.py +10 -0
  6. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +8 -8
  7. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/models/abstract_pfx_base_user.py +3 -1
  8. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/shortcuts.py +2 -1
  9. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/__init__.py +4 -0
  10. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_auth_api.py +4 -4
  11. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_emails_q_mailjet_email_backend.py +2 -2
  12. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_emails_send_email_message.py +30 -7
  13. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_emails_test_tools.py +4 -1
  14. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/tests/test_auth_api.py +2 -2
  15. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/tests/test_auth_api.py +2 -3
  16. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/tests/test_auth_api.py +4 -4
  17. django_pfx-1.7.6.dev27/django_pfx.egg-info/scm_version.json +0 -8
  18. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/.gitignore +0 -0
  19. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/.gitlab-ci.yml +0 -0
  20. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/.pre-commit-config.yaml +0 -0
  21. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/LICENSE +0 -0
  22. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/MANIFEST.in +0 -0
  23. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/README.md +0 -0
  24. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/django_pfx.egg-info/SOURCES.txt +0 -0
  25. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/django_pfx.egg-info/dependency_links.txt +0 -0
  26. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/django_pfx.egg-info/requires.txt +0 -0
  27. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/django_pfx.egg-info/scm_file_list.json +0 -0
  28. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/django_pfx.egg-info/top_level.txt +0 -0
  29. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/Makefile +0 -0
  30. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/conf.py +0 -0
  31. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/index.rst +0 -0
  32. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/source/api.views.rst +0 -0
  33. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/source/authentication.md +0 -0
  34. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/source/decorator.md +0 -0
  35. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/source/generate_openapi.md +0 -0
  36. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/source/getting_started.md +0 -0
  37. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/source/internationalisation.md +0 -0
  38. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/source/model.md +0 -0
  39. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/source/pfx_views.md +0 -0
  40. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/source/profiling.md +0 -0
  41. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/source/settings.md +0 -0
  42. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/source/testing.md +0 -0
  43. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/doc/source/user_jobs.md +0 -0
  44. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/img/pfx.png +0 -0
  45. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/img/pfx.svg +0 -0
  46. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/make_messages +0 -0
  47. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/manage.py +0 -0
  48. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/__init__.py +0 -0
  49. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/__init__.py +0 -0
  50. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/apps.py +0 -0
  51. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/email_backend/__init__.py +0 -0
  52. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/email_backend/memory_email_backend.py +0 -0
  53. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/email_backend/q_mailjet_email_backend.py +0 -0
  54. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/exceptions.py +0 -0
  55. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/locale/fr/LC_MESSAGES/django.mo +0 -0
  56. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/locale/fr/LC_MESSAGES/django.po +0 -0
  57. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/mailjet/__init__.py +0 -0
  58. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/mailjet/mailjet.py +0 -0
  59. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/mailjet/message_result.py +0 -0
  60. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/migrations/0001_initial.py +0 -0
  61. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/migrations/0002_alter_email_headers.py +0 -0
  62. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/migrations/0003_alter_email_options.py +0 -0
  63. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/migrations/0004_alter_email_mail_from.py +0 -0
  64. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/migrations/0005_lowercase_verbose_names.py +0 -0
  65. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/migrations/0006_alter_email_attachments.py +0 -0
  66. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/migrations/__init__.py +0 -0
  67. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/models/__init__.py +0 -0
  68. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/models/email.py +0 -0
  69. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/providers/__init__.py +0 -0
  70. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/providers/email_django_q_executor.py +0 -0
  71. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/tasks.py +0 -0
  72. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/templates/emails/base_template.html +0 -0
  73. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/templates/emails/base_template.txt +0 -0
  74. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/templates/emails/base_template_subject.txt +0 -0
  75. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/urls.py +0 -0
  76. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/views/__init__.py +0 -0
  77. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/emails/views/email_rest_view.py +0 -0
  78. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/__init__.py +0 -0
  79. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/apidoc/__init__.py +0 -0
  80. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/apidoc/parameters.py +0 -0
  81. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/apidoc/schema.py +0 -0
  82. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/apidoc/tags.py +0 -0
  83. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/apps.py +0 -0
  84. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/decorator/__init__.py +0 -0
  85. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/decorator/rest.py +0 -0
  86. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/default_settings.py +0 -0
  87. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/exceptions.py +0 -0
  88. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/fields/__init__.py +0 -0
  89. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/fields/decimal_field.py +0 -0
  90. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/fields/media_field.py +0 -0
  91. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  92. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/fields/rich_text_field.py +0 -0
  93. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/http/__init__.py +0 -0
  94. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/http/json_response.py +0 -0
  95. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  96. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/management/__init__.py +0 -0
  97. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/management/commands/__init__.py +0 -0
  98. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  99. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/management/commands/profile.py +0 -0
  100. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/mfa/__init__.py +0 -0
  101. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/mfa/authenticator.py +0 -0
  102. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/mfa/base.py +0 -0
  103. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/mfa/email.py +0 -0
  104. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/mfa/legacy.py +0 -0
  105. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/mfa/sms.py +0 -0
  106. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/middleware/__init__.py +0 -0
  107. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/middleware/authentication.py +0 -0
  108. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/middleware/locale.py +0 -0
  109. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/middleware/profiling.py +0 -0
  110. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/middleware/request_too_big_middleware.py +0 -0
  111. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/middleware/ws_cookie_authentication_middleware.py +0 -0
  112. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  113. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  114. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  115. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/migrations/0004_alter_loginban_failed_counter_and_more.py +0 -0
  116. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/migrations/0005_mfadevice_mfadevice_mfa_device_unique_backend.py +0 -0
  117. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/migrations/0006_alter_pfxuser_managers.py +0 -0
  118. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/migrations/0007_alter_pfxuser_options.py +0 -0
  119. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/migrations/0008_lowercase_verbose_names.py +0 -0
  120. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/migrations/__init__.py +0 -0
  121. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  122. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  123. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/models/__init__.py +0 -0
  124. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/models/attachment_mixin.py +0 -0
  125. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/models/cache_mixins.py +0 -0
  126. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/models/login_ban.py +0 -0
  127. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/models/mfa_device.py +0 -0
  128. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/models/mfa_user_mixin.py +0 -0
  129. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/models/not_null_fields.py +0 -0
  130. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  131. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/models/pfx_models.py +0 -0
  132. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/models/pfx_user.py +0 -0
  133. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  134. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/serializers/__init__.py +0 -0
  135. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/serializers/json.py +0 -0
  136. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/settings.py +0 -0
  137. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/sms/__init__.py +0 -0
  138. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/sms/backends/__init__.py +0 -0
  139. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/sms/backends/base.py +0 -0
  140. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/sms/backends/console.py +0 -0
  141. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/sms/backends/memory.py +0 -0
  142. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/storage/__init__.py +0 -0
  143. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/storage/exceptions.py +0 -0
  144. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/storage/local_storage.py +0 -0
  145. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/storage/s3_storage.py +0 -0
  146. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  147. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  148. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  149. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  150. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  151. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  152. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/test.py +0 -0
  153. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/urls.py +0 -0
  154. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/version_check.py +0 -0
  155. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/__init__.py +0 -0
  156. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/authentication_views.py +0 -0
  157. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/fields.py +0 -0
  158. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/filters_views.py +0 -0
  159. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/locale_views.py +0 -0
  160. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
  161. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/mfa_authentication_views.py +0 -0
  162. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  163. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  164. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  165. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/groups.py +0 -0
  166. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  167. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  168. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  169. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  170. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  171. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  172. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  173. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  174. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  175. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/subset.py +0 -0
  176. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  177. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  178. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  179. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  180. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  181. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/views/rest_views.py +0 -0
  182. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/pfxcore/xml_test_runner.py +0 -0
  183. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/settings/__init__.py +0 -0
  184. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/settings/dev.py +0 -0
  185. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/__init__.py +0 -0
  186. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/apps.py +0 -0
  187. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/locale/fr/LC_MESSAGES/django.mo +0 -0
  188. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/locale/fr/LC_MESSAGES/django.po +0 -0
  189. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/migrations/0001_initial.py +0 -0
  190. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/migrations/0002_alter_userjob_options_alter_userjob_auto_queued_and_more.py +0 -0
  191. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/migrations/0003_clean_scheduled_tasks.py +0 -0
  192. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/migrations/0004_userjob_summary_url.py +0 -0
  193. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/migrations/0005_swappable_user_job.py +0 -0
  194. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/migrations/0006_lowercase_verbose_names.py +0 -0
  195. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/migrations/__init__.py +0 -0
  196. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/models/__init__.py +0 -0
  197. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/models/user_job.py +0 -0
  198. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/models/user_job_attachment.py +0 -0
  199. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/providers/__init__.py +0 -0
  200. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/providers/user_job_django_q_executor.py +0 -0
  201. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/providers/user_job_websocket_channel_provider.py +0 -0
  202. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/tasks.py +0 -0
  203. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/urls.py +0 -0
  204. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/views/__init__.py +0 -0
  205. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/views/user_job_attachment_view.py +0 -0
  206. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/views/user_job_view.py +0 -0
  207. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pfx/userjobs/views/user_websocket_consumer.py +0 -0
  208. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/pyproject.toml +0 -0
  209. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/requirements.txt +0 -0
  210. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/serve-doc +0 -0
  211. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/setup.cfg +0 -0
  212. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/setup.py +0 -0
  213. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/__init__.py +0 -0
  214. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/apps.py +0 -0
  215. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/channel_group_send_calls.py +0 -0
  216. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  217. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/mfa_urls.py +0 -0
  218. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/migrations/0001_initial.py +0 -0
  219. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/migrations/__init__.py +0 -0
  220. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/models.py +0 -0
  221. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/settings/__init__.py +0 -0
  222. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/settings/ci.py +0 -0
  223. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/settings/common.py +0 -0
  224. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/settings/dev.py +0 -0
  225. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/settings/dev_custom_example.py +0 -0
  226. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/settings/dev_default.py +0 -0
  227. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/basic_api_errors.py +0 -0
  228. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/basic_api_test.py +0 -0
  229. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/mfa_test_utils.py +0 -0
  230. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_api_doc.py +0 -0
  231. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_api_doc_search.py +0 -0
  232. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_body_mixin.py +0 -0
  233. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_cache.py +0 -0
  234. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_client.py +0 -0
  235. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_emails_email_api.py +0 -0
  236. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_emails_email_model.py +0 -0
  237. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_fields_choices.py +0 -0
  238. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_fields_date.py +0 -0
  239. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_fields_decimal.py +0 -0
  240. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_fields_help_text.py +0 -0
  241. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_fields_minutes_duration.py +0 -0
  242. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_fields_one2many.py +0 -0
  243. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_fields_rich_text.py +0 -0
  244. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_fields_time.py +0 -0
  245. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_filters.py +0 -0
  246. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_locale_api.py +0 -0
  247. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_mfa_legacy.py +0 -0
  248. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_mfa_login_api.py +0 -0
  249. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_mfa_setup_api.py +0 -0
  250. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  251. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_perm_tests.py +0 -0
  252. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_permissions.py +0 -0
  253. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_perms_api.py +0 -0
  254. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_post_migrate_groups_update.py +0 -0
  255. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_profiling_middleware.py +0 -0
  256. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_settings.py +0 -0
  257. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_shortcuts.py +0 -0
  258. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_test_runner.py +0 -0
  259. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_timezone_middleware.py +0 -0
  260. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_tools.py +0 -0
  261. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_user_job_api.py +0 -0
  262. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_user_job_messages.py +0 -0
  263. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_user_job_model.py +0 -0
  264. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_user_queryset.py +0 -0
  265. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_user_websocket.py +0 -0
  266. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_verbose_names.py +0 -0
  267. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_version_check.py +0 -0
  268. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_view_decorators.py +0 -0
  269. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_view_fields.py +0 -0
  270. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/tests/test_ws_cookie_middleware.py +0 -0
  271. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/urls.py +0 -0
  272. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests/views.py +0 -0
  273. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/__init__.py +0 -0
  274. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/migrations/__init__.py +0 -0
  275. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/settings/__init__.py +0 -0
  276. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/settings/ci.py +0 -0
  277. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/settings/common.py +0 -0
  278. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/settings/dev.py +0 -0
  279. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/settings/dev_custom_example.py +0 -0
  280. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/settings/dev_default.py +0 -0
  281. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/tests/__init__.py +0 -0
  282. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/tests/test_api.py +0 -0
  283. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/urls.py +0 -0
  284. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_base_user/views.py +0 -0
  285. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/__init__.py +0 -0
  286. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/migrations/0001_initial.py +0 -0
  287. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/migrations/__init__.py +0 -0
  288. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/models.py +0 -0
  289. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/settings/__init__.py +0 -0
  290. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/settings/ci.py +0 -0
  291. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/settings/common.py +0 -0
  292. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/settings/dev.py +0 -0
  293. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/settings/dev_custom_example.py +0 -0
  294. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/settings/dev_default.py +0 -0
  295. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/tests/__init__.py +0 -0
  296. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/tests/test_api.py +0 -0
  297. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/urls.py +0 -0
  298. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user/views.py +0 -0
  299. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/__init__.py +0 -0
  300. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/migrations/0001_initial.py +0 -0
  301. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/migrations/0002_lowercase_verbose_names.py +0 -0
  302. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/migrations/__init__.py +0 -0
  303. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/models.py +0 -0
  304. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/providers.py +0 -0
  305. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/scope.py +0 -0
  306. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/settings/__init__.py +0 -0
  307. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/settings/ci.py +0 -0
  308. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/settings/common.py +0 -0
  309. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/settings/dev.py +0 -0
  310. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/settings/dev_custom_example.py +0 -0
  311. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/settings/dev_default.py +0 -0
  312. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/tests/__init__.py +0 -0
  313. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/tests/test_user_job.py +0 -0
  314. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_custom_user_job/urls.py +0 -0
  315. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/__init__.py +0 -0
  316. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/migrations/0001_initial.py +0 -0
  317. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/migrations/__init__.py +0 -0
  318. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/models.py +0 -0
  319. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/settings/__init__.py +0 -0
  320. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/settings/ci.py +0 -0
  321. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/settings/common.py +0 -0
  322. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/settings/dev.py +0 -0
  323. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/settings/dev_custom_example.py +0 -0
  324. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/settings/dev_default.py +0 -0
  325. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/tests/__init__.py +0 -0
  326. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/tests/test_api.py +0 -0
  327. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/tests_user_email_login/urls.py +0 -0
  328. {django_pfx-1.7.6.dev27 → django_pfx-1.7.6.dev31}/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.dev27
3
+ Version: 1.7.6.dev31
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.dev27
3
+ Version: 1.7.6.dev31
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
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "1.7.5",
3
+ "distance": 31,
4
+ "node": "gc20f1b5b51acb97a77634b4c145fe90573edd05e",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-10-06"
8
+ }
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ import mimetypes
2
3
  from pathlib import Path
3
4
 
4
5
  from django.conf import settings
@@ -105,7 +106,9 @@ def send_email_message(
105
106
 
106
107
  if attachments:
107
108
  for att in attachments:
108
- if {'key', 'name', 'content-type'} <= att.file.keys():
109
+ if (isinstance(getattr(att, 'file', None), dict) and
110
+ {'key', 'name', 'content-type'} <= att.file.keys()):
111
+ # Is a JSON (equivalent to MediaField)
109
112
  fp = Path(settings.STORAGE_LOCAL_ROOT, att.file['key'])
110
113
  if attachment_file_name and callable(attachment_file_name):
111
114
  name = attachment_file_name(att)
@@ -118,9 +121,20 @@ def send_email_message(
118
121
  except Exception as e:
119
122
  logger.error(
120
123
  "Error attaching file %s: %s", fp, str(e), exc_info=e)
124
+ elif isinstance(att, (tuple, list)):
125
+ # Is a tuple name, content, (mimetype)
126
+ if len(att) < 2:
127
+ logger.error(
128
+ "Tuple attachment must have min 2 values : %s values",
129
+ len(att))
130
+ name, content, *rest = att
131
+ mimetype = rest[0] if rest else mimetypes.guess_type(name)[0]
132
+ email.attach(
133
+ name, content, mimetype or 'application/octet-stream')
121
134
  else:
122
135
  logger.error(
123
- "Attachment pk=%s missing required file keys: %s",
124
- att.pk, att.file.keys())
136
+ "Attachment is invalid (must be a "
137
+ "JSON MediaField or a tuple): %s",
138
+ repr(att)[:100])
125
139
 
126
140
  email.send()
@@ -1,3 +1,5 @@
1
+ from email.utils import formataddr
2
+
1
3
  from django.conf import settings
2
4
  from django.utils.module_loading import import_string
3
5
 
@@ -33,6 +35,14 @@ class EmailTestMixin:
33
35
  """The addresses of the ``To`` of ``email``, without the names."""
34
36
  return [r['Email'] for r in email.mail_to]
35
37
 
38
+ @classmethod
39
+ def email_to_rfc(cls, email):
40
+ """The addresses of the ``To`` of ``email``, with the names."""
41
+ return [
42
+ formataddr((r['Name'], r['Email'])) if r.get('Name')
43
+ else r['Email']
44
+ for r in email.mail_to]
45
+
36
46
  @classmethod
37
47
  def get_email_html(cls, email):
38
48
  if not email.html_part:
@@ -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-10-01 06:30+0200\n"
10
+ "POT-Creation-Date: 2026-10-05 17:02+0200\n"
11
11
  "PO-Revision-Date: 2021-06-22 23:31+0200\n"
12
12
  "Last-Translator: \n"
13
13
  "Language-Team: \n"
@@ -66,11 +66,11 @@ msgstr ""
66
66
  msgid "Your {site_name} verification code: {otp_code}"
67
67
  msgstr "Votre code pour {site_name} : {otp_code}"
68
68
 
69
- #: models/abstract_pfx_base_user.py:89
69
+ #: models/abstract_pfx_base_user.py:91
70
70
  msgid "User"
71
71
  msgstr "Utilisateur"
72
72
 
73
- #: models/abstract_pfx_base_user.py:90
73
+ #: models/abstract_pfx_base_user.py:92
74
74
  msgid "Users"
75
75
  msgstr "Utilisateurs"
76
76
 
@@ -180,27 +180,27 @@ msgstr "séquence"
180
180
  msgid "%(model_name)s with this %(field_labels)s already exists."
181
181
  msgstr "%(model_name)s avec ce/cette %(field_labels)s existe déjà."
182
182
 
183
- #: shortcuts.py:52
183
+ #: shortcuts.py:53
184
184
  #, python-brace-format
185
185
  msgid "{key} must be an integer number."
186
186
  msgstr "{key} doit être un nombre entier."
187
187
 
188
- #: shortcuts.py:68
188
+ #: shortcuts.py:69
189
189
  #, python-brace-format
190
190
  msgid "{key} must be a number."
191
191
  msgstr "{key} doit être un nombre."
192
192
 
193
- #: shortcuts.py:84
193
+ #: shortcuts.py:85
194
194
  #, python-brace-format
195
195
  msgid "{key} must be a decimal number."
196
196
  msgstr "{key} doit être un nombre décimal."
197
197
 
198
- #: shortcuts.py:100
198
+ #: shortcuts.py:101
199
199
  #, python-brace-format
200
200
  msgid "{key} must be a date."
201
201
  msgstr "{key} doit être une date."
202
202
 
203
- #: shortcuts.py:121
203
+ #: shortcuts.py:122
204
204
  #, python-brace-format
205
205
  msgid "{key} must be “true”, “false”, “1”, “0” or empty."
206
206
  msgstr "{key} doit être « true », « false », « 1 », « 0 » ou vide"
@@ -1,3 +1,5 @@
1
+ from email.utils import formataddr
2
+
1
3
  from django.contrib.auth.models import (
2
4
  AbstractBaseUser,
3
5
  AbstractUser,
@@ -37,7 +39,7 @@ class AbstractPFXBaseUser(PFXModelMixin, AbstractBaseUser):
37
39
  def get_email_rfc(self):
38
40
  name = self.get_email_name()
39
41
  email = getattr(self, self.get_email_field_name())
40
- return f'"{name}" <{email}>'
42
+ return formataddr((name, email))
41
43
 
42
44
  def auth_json_repr(self, **kw):
43
45
  res = self.json_repr(
@@ -2,6 +2,7 @@
2
2
  import logging
3
3
  from datetime import date
4
4
  from decimal import Decimal as D
5
+ from email.utils import formataddr
5
6
  from pathlib import Path
6
7
 
7
8
  from django.core.exceptions import ObjectDoesNotExist
@@ -183,5 +184,5 @@ def default_mail_from():
183
184
  def default_mail_from_rfc():
184
185
  name, email = default_mail_from()
185
186
  if name:
186
- return f'"{name}" <{email}>'
187
+ return formataddr((name, email))
187
188
  return email
@@ -10,6 +10,10 @@ from .test_emails_email_api import TestEmailsEmailApi
10
10
  from .test_emails_email_model import TestEmailsEmailModel
11
11
  from .test_emails_q_mailjet_email_backend import TestEmailsQMailjetEmailBackend
12
12
  from .test_emails_send_email_message import TestEmailsSendEmailMessage
13
+ from .test_emails_test_tools import (
14
+ TestEmailTestMixinWithLocmem,
15
+ TestMemoryEmailBackend,
16
+ )
13
17
  from .test_fields_choices import TestFieldsChoices
14
18
  from .test_fields_date import TestFieldsDate
15
19
  from .test_fields_decimal import TestFieldsDecimal
@@ -758,8 +758,8 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
758
758
 
759
759
  # Must send a welcome email
760
760
  email = mail.outbox[0]
761
- self.assertEqual(email.from_email, '"PFX" <pfx@example.com>')
762
- self.assertEqual(email.to, ['"Isaac Asimov" <isaac.asimov@bu.edu>'])
761
+ self.assertEqual(email.from_email, 'PFX <pfx@example.com>')
762
+ self.assertEqual(email.to, ['Isaac Asimov <isaac.asimov@bu.edu>'])
763
763
  self.assertEqual(email.subject, f'Welcome on {settings.PFX_SITE_NAME}')
764
764
 
765
765
  self.client.logout()
@@ -817,9 +817,9 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
817
817
  # Must send a reset password email
818
818
  self.assertEqual(len(mail.outbox), 1)
819
819
  email = mail.outbox[0]
820
- self.assertEqual(email.from_email, '"PFX" <pfx@example.com>')
820
+ self.assertEqual(email.from_email, 'PFX <pfx@example.com>')
821
821
  self.assertEqual(email.to, [
822
- '"John Ronald Reuel Tolkien" <jrr.tolkien@oxford.com>'])
822
+ 'John Ronald Reuel Tolkien <jrr.tolkien@oxford.com>'])
823
823
  self.assertEqual(
824
824
  email.subject, f'Password reset on {settings.PFX_SITE_NAME}')
825
825
 
@@ -32,8 +32,8 @@ class TestEmailsQMailjetEmailBackend(TestAssertMixin, TestCase):
32
32
  send_mail(
33
33
  'This is a test email',
34
34
  'This is the mail content.',
35
- '"Fred" <from@example.com>',
36
- ['"AL" <to@example.com>'],
35
+ 'Fred <from@example.com>',
36
+ ['AL <to@example.com>'],
37
37
  fail_silently=False)
38
38
  mail = Email.objects.get(subject='This is a test email')
39
39
  self.assertEqual(mail.text_part, 'This is the mail content.')
@@ -52,6 +52,29 @@ class TestEmailsSendEmailMessage(TestAssertMixin, TestCase):
52
52
  self.assertEqual(mail.outbox[0].attachments, [
53
53
  ('test.txt', 'A test file content.', 'text/plain')])
54
54
 
55
+ def test_send_email_message_in_memory_attachment(self):
56
+ att = "test.txt", b"A test file content.", "text/plain"
57
+
58
+ send_email_message(
59
+ 'test@example.org', 'base_template',
60
+ data={'subject': "Test message"}, attachments=[att])
61
+
62
+ # Test first message
63
+ m = mail.outbox[0]
64
+ self.assertEqual(m.subject, "Test message")
65
+ self.assertEqual(m.to[0], 'test@example.org')
66
+ txt_msg = m.body
67
+ html_msg = m.alternatives[0][0]
68
+ self.assertIn(
69
+ '<img src="http://example.org/logo.png" alt="PFX"', html_msg)
70
+ self.assertIn(
71
+ 'PFX, a DJango rest framework<br />', html_msg)
72
+ self.assertIn(
73
+ 'PFX, a DJango rest framework', txt_msg)
74
+
75
+ self.assertEqual(mail.outbox[0].attachments, [
76
+ ('test.txt', 'A test file content.', 'text/plain')])
77
+
55
78
  def test_send_email_message_to_formats(self):
56
79
 
57
80
  send_email_message(
@@ -62,29 +85,29 @@ class TestEmailsSendEmailMessage(TestAssertMixin, TestCase):
62
85
  'base_template',
63
86
  data={'subject': "Test message"})
64
87
  m = mail.outbox[0]
65
- self.assertEqual(m.to[0], '"Test User 2" <test2@example.org>')
88
+ self.assertEqual(m.to[0], 'Test User 2 <test2@example.org>')
66
89
 
67
90
  send_email_message(
68
91
  SimpleNamespace(
69
- get_email_rfc=lambda: '"Test 2" <test2@example.org>'),
92
+ get_email_rfc=lambda: 'Test 2 <test2@example.org>'),
70
93
  'base_template',
71
94
  data={'subject': "Test message"})
72
95
  m = mail.outbox[1]
73
- self.assertEqual(m.to[0], '"Test 2" <test2@example.org>')
96
+ self.assertEqual(m.to[0], 'Test 2 <test2@example.org>')
74
97
 
75
98
  send_email_message(
76
- SimpleNamespace(email_rfc='"Test 1" <test1@example.org>'),
99
+ SimpleNamespace(email_rfc='Test 1 <test1@example.org>'),
77
100
  'base_template',
78
101
  data={'subject': "Test message"})
79
102
  m = mail.outbox[2]
80
- self.assertEqual(m.to[0], '"Test 1" <test1@example.org>')
103
+ self.assertEqual(m.to[0], 'Test 1 <test1@example.org>')
81
104
 
82
105
  send_email_message(
83
- SimpleNamespace(email_rfc=lambda: '"Test 1" <test1@example.org>'),
106
+ SimpleNamespace(email_rfc=lambda: 'Test 1 <test1@example.org>'),
84
107
  'base_template',
85
108
  data={'subject': "Test message"})
86
109
  m = mail.outbox[3]
87
- self.assertEqual(m.to[0], '"Test 1" <test1@example.org>')
110
+ self.assertEqual(m.to[0], 'Test 1 <test1@example.org>')
88
111
 
89
112
  send_email_message(
90
113
  SimpleNamespace(email='test3@example.org'),
@@ -30,7 +30,7 @@ class TestMemoryEmailBackend(EmailTestMixin, TestCase):
30
30
  def test_outbox_helpers(self):
31
31
  send_mail(
32
32
  'First', 'Content', 'from@example.com',
33
- ['"Jean Dupont" <jean@example.com>', 'paul@example.com'])
33
+ ['Jean Dupont <jean@example.com>', 'paul@example.com'])
34
34
  message = EmailMultiAlternatives(
35
35
  'Second', 'Text', 'from@example.com', ['marie@example.com'])
36
36
  message.attach_alternative('<p>HTML</p>', 'text/html')
@@ -41,6 +41,9 @@ class TestMemoryEmailBackend(EmailTestMixin, TestCase):
41
41
  [first.subject, second.subject], ['First', 'Second'])
42
42
  self.assertEqual(
43
43
  self.email_to(first), ['jean@example.com', 'paul@example.com'])
44
+ self.assertEqual(
45
+ self.email_to_rfc(first),
46
+ ['Jean Dupont <jean@example.com>', 'paul@example.com'])
44
47
  self.assertEqual(self.get_email_html(second), '<p>HTML</p>')
45
48
  with self.assertRaises(AssertionError):
46
49
  self.get_email_html(first)
@@ -159,9 +159,9 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
159
159
  # Must send a reset password email
160
160
  self.assertEqual(len(mail.outbox), 1)
161
161
  email = mail.outbox[0]
162
- self.assertEqual(email.from_email, '"PFX" <pfx@example.com>')
162
+ self.assertEqual(email.from_email, 'PFX <pfx@example.com>')
163
163
  self.assertEqual(email.to, [
164
- '"John Ronald Reuel Tolkien" <jrr.tolkien@oxford.com>'])
164
+ 'John Ronald Reuel Tolkien <jrr.tolkien@oxford.com>'])
165
165
  self.assertEqual(
166
166
  email.subject, f'Password reset on {settings.PFX_SITE_NAME}')
167
167
 
@@ -6,7 +6,6 @@ from datetime import timedelta as td
6
6
  from django.conf import settings
7
7
  from django.contrib.auth.hashers import make_password
8
8
  from django.core import mail
9
- # from django.core import mail
10
9
  from django.test import TransactionTestCase, override_settings
11
10
  from django.utils import timezone as tz
12
11
 
@@ -136,7 +135,7 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
136
135
  # Must send a reset password email
137
136
  self.assertEqual(len(mail.outbox), 1)
138
137
  email = mail.outbox[0]
139
- self.assertEqual(email.from_email, '"PFX" <pfx@example.com>')
138
+ self.assertEqual(email.from_email, 'PFX <pfx@example.com>')
140
139
  self.assertEqual(email.to, ['"jrr.tolkien" <jrr.tolkien@oxford.com>'])
141
140
  self.assertEqual(
142
141
  email.subject, f'Password reset on {settings.PFX_SITE_NAME}')
@@ -175,7 +174,7 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
175
174
  # Must send a reset password email
176
175
  self.assertEqual(len(mail.outbox), 1)
177
176
  email = mail.outbox[0]
178
- self.assertEqual(email.from_email, '"PFX" <pfx@example.com>')
177
+ self.assertEqual(email.from_email, 'PFX <pfx@example.com>')
179
178
  self.assertEqual(email.to, ['"jrr.tolkien" <jrr.tolkien@oxford.com>'])
180
179
  self.assertEqual(
181
180
  email.subject, f'Password reset on {settings.PFX_SITE_NAME}')
@@ -136,8 +136,8 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
136
136
  # Must send a reset password email
137
137
  self.assertEqual(len(mail.outbox), 1)
138
138
  email = mail.outbox[0]
139
- self.assertEqual(email.from_email, '"PFX" <pfx@example.com>')
140
- self.assertEqual(email.to, ['"JRR Tolkien" <jrr.tolkien@oxford.com>'])
139
+ self.assertEqual(email.from_email, 'PFX <pfx@example.com>')
140
+ self.assertEqual(email.to, ['JRR Tolkien <jrr.tolkien@oxford.com>'])
141
141
  self.assertEqual(
142
142
  email.subject, f'Password reset on {settings.PFX_SITE_NAME}')
143
143
 
@@ -175,8 +175,8 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
175
175
  # Must send a reset password email
176
176
  self.assertEqual(len(mail.outbox), 1)
177
177
  email = mail.outbox[0]
178
- self.assertEqual(email.from_email, '"PFX" <pfx@example.com>')
179
- self.assertEqual(email.to, ['"JRR Tolkien" <jrr.tolkien@oxford.com>'])
178
+ self.assertEqual(email.from_email, 'PFX <pfx@example.com>')
179
+ self.assertEqual(email.to, ['JRR Tolkien <jrr.tolkien@oxford.com>'])
180
180
  self.assertEqual(
181
181
  email.subject, f'Password reset on {settings.PFX_SITE_NAME}')
182
182
 
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "1.7.5",
3
- "distance": 27,
4
- "node": "g805fe3e9400fc8312cc217f4cd37c07c7024a3ef",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-10-05"
8
- }