django-pfx 1.7.3.dev41__tar.gz → 1.7.4.dev2__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 (283) hide show
  1. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/PKG-INFO +1 -1
  2. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/django_pfx.egg-info/PKG-INFO +1 -1
  3. django_pfx-1.7.4.dev2/django_pfx.egg-info/scm_version.json +8 -0
  4. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +12 -12
  5. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/models/abstract_pfx_base_user.py +9 -0
  6. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/shortcuts.py +6 -0
  7. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/authentication_views.py +7 -5
  8. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_auth_api.py +17 -7
  9. django_pfx-1.7.3.dev41/django_pfx.egg-info/scm_version.json +0 -8
  10. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/.gitignore +0 -0
  11. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/.gitlab-ci.yml +0 -0
  12. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/.pre-commit-config.yaml +0 -0
  13. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/LICENSE +0 -0
  14. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/MANIFEST.in +0 -0
  15. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/README.md +0 -0
  16. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/django_pfx.egg-info/SOURCES.txt +0 -0
  17. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/django_pfx.egg-info/dependency_links.txt +0 -0
  18. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/django_pfx.egg-info/requires.txt +0 -0
  19. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/django_pfx.egg-info/scm_file_list.json +0 -0
  20. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/django_pfx.egg-info/top_level.txt +0 -0
  21. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/Makefile +0 -0
  22. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/conf.py +0 -0
  23. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/index.rst +0 -0
  24. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/source/api.views.rst +0 -0
  25. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/source/authentication.md +0 -0
  26. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/source/decorator.md +0 -0
  27. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/source/generate_openapi.md +0 -0
  28. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/source/getting_started.md +0 -0
  29. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/source/internationalisation.md +0 -0
  30. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/source/model.md +0 -0
  31. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/source/pfx_views.md +0 -0
  32. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/source/profiling.md +0 -0
  33. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/source/settings.md +0 -0
  34. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/doc/source/testing.md +0 -0
  35. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/img/pfx.png +0 -0
  36. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/img/pfx.svg +0 -0
  37. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/make_messages +0 -0
  38. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/manage.py +0 -0
  39. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/__init__.py +0 -0
  40. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/__init__.py +0 -0
  41. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/apps.py +0 -0
  42. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/email_backend/__init__.py +0 -0
  43. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/email_backend/q_mailjet_email_backend.py +0 -0
  44. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/exceptions.py +0 -0
  45. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/mailjet/__init__.py +0 -0
  46. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/mailjet/mailjet.py +0 -0
  47. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/mailjet/message_result.py +0 -0
  48. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/migrations/0001_initial.py +0 -0
  49. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/migrations/0002_alter_email_headers.py +0 -0
  50. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/migrations/0003_alter_email_options.py +0 -0
  51. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/migrations/__init__.py +0 -0
  52. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/models/__init__.py +0 -0
  53. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/models/email.py +0 -0
  54. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/providers/__init__.py +0 -0
  55. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/providers/email_django_q_executor.py +0 -0
  56. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/shortcuts.py +0 -0
  57. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/tasks.py +0 -0
  58. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/templates/emails/base_template.html +0 -0
  59. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/templates/emails/base_template.txt +0 -0
  60. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/templates/emails/base_template_subject.txt +0 -0
  61. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/urls.py +0 -0
  62. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/views/__init__.py +0 -0
  63. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/emails/views/email_rest_view.py +0 -0
  64. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/__init__.py +0 -0
  65. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/apidoc/__init__.py +0 -0
  66. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/apidoc/parameters.py +0 -0
  67. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/apidoc/schema.py +0 -0
  68. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/apidoc/tags.py +0 -0
  69. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/apps.py +0 -0
  70. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/decorator/__init__.py +0 -0
  71. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/decorator/rest.py +0 -0
  72. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/default_settings.py +0 -0
  73. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/exceptions.py +0 -0
  74. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/fields/__init__.py +0 -0
  75. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/fields/decimal_field.py +0 -0
  76. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/fields/media_field.py +0 -0
  77. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  78. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/fields/rich_text_field.py +0 -0
  79. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/http/__init__.py +0 -0
  80. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/http/json_response.py +0 -0
  81. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  82. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/management/__init__.py +0 -0
  83. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/management/commands/__init__.py +0 -0
  84. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  85. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/management/commands/profile.py +0 -0
  86. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/mfa/__init__.py +0 -0
  87. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/mfa/authenticator.py +0 -0
  88. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/mfa/base.py +0 -0
  89. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/mfa/email.py +0 -0
  90. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/mfa/legacy.py +0 -0
  91. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/mfa/sms.py +0 -0
  92. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/middleware/__init__.py +0 -0
  93. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/middleware/authentication.py +0 -0
  94. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/middleware/locale.py +0 -0
  95. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/middleware/profiling.py +0 -0
  96. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/middleware/request_too_big_middleware.py +0 -0
  97. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/middleware/ws_cookie_authentication_middleware.py +0 -0
  98. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  99. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  100. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  101. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/migrations/0004_alter_loginban_failed_counter_and_more.py +0 -0
  102. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/migrations/0005_mfadevice_mfadevice_mfa_device_unique_backend.py +0 -0
  103. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/migrations/__init__.py +0 -0
  104. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  105. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  106. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/models/__init__.py +0 -0
  107. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/models/attachment_mixin.py +0 -0
  108. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/models/cache_mixins.py +0 -0
  109. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/models/login_ban.py +0 -0
  110. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/models/mfa_device.py +0 -0
  111. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/models/mfa_user_mixin.py +0 -0
  112. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/models/not_null_fields.py +0 -0
  113. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  114. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/models/pfx_models.py +0 -0
  115. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/models/pfx_user.py +0 -0
  116. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  117. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/serializers/__init__.py +0 -0
  118. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/serializers/json.py +0 -0
  119. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/settings.py +0 -0
  120. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/sms/__init__.py +0 -0
  121. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/sms/backends/__init__.py +0 -0
  122. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/sms/backends/base.py +0 -0
  123. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/sms/backends/console.py +0 -0
  124. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/storage/__init__.py +0 -0
  125. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/storage/exceptions.py +0 -0
  126. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/storage/local_storage.py +0 -0
  127. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/storage/s3_storage.py +0 -0
  128. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  129. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  130. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  131. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  132. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  133. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  134. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/test.py +0 -0
  135. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/urls.py +0 -0
  136. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/__init__.py +0 -0
  137. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/fields.py +0 -0
  138. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/filters_views.py +0 -0
  139. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/locale_views.py +0 -0
  140. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
  141. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/mfa_authentication_views.py +0 -0
  142. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  143. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  144. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  145. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/groups.py +0 -0
  146. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  147. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  148. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  149. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  150. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  151. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  152. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  153. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  154. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  155. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/subset.py +0 -0
  156. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  157. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  158. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  159. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  160. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  161. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/pfxcore/views/rest_views.py +0 -0
  162. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/settings/__init__.py +0 -0
  163. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/settings/dev.py +0 -0
  164. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/__init__.py +0 -0
  165. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/apps.py +0 -0
  166. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/locale/fr/LC_MESSAGES/django.mo +0 -0
  167. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/locale/fr/LC_MESSAGES/django.po +0 -0
  168. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/migrations/0001_initial.py +0 -0
  169. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/migrations/0002_alter_userjob_options_alter_userjob_auto_queued_and_more.py +0 -0
  170. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/migrations/0003_clean_scheduled_tasks.py +0 -0
  171. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/migrations/0004_userjob_summary_url.py +0 -0
  172. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/migrations/__init__.py +0 -0
  173. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/models/__init__.py +0 -0
  174. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/models/user_job.py +0 -0
  175. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/models/user_job_attachment.py +0 -0
  176. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/providers/__init__.py +0 -0
  177. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/providers/user_job_django_q_executor.py +0 -0
  178. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/providers/user_job_websocket_channel_provider.py +0 -0
  179. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/tasks.py +0 -0
  180. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/urls.py +0 -0
  181. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/views/__init__.py +0 -0
  182. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/views/user_job_attachment_view.py +0 -0
  183. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/views/user_job_view.py +0 -0
  184. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pfx/userjobs/views/user_websocket_consumer.py +0 -0
  185. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/pyproject.toml +0 -0
  186. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/requirements.txt +0 -0
  187. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/serve-doc +0 -0
  188. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/setup.cfg +0 -0
  189. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/setup.py +0 -0
  190. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/__init__.py +0 -0
  191. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/apps.py +0 -0
  192. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/channel_group_send_calls.py +0 -0
  193. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  194. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/mfa_urls.py +0 -0
  195. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/migrations/0001_initial.py +0 -0
  196. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/migrations/0002_alter_book_cover.py +0 -0
  197. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/migrations/0003_book_local_file.py +0 -0
  198. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/migrations/0004_mfausermixin_fields.py +0 -0
  199. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/migrations/0005_mfausermixin_fields_fix.py +0 -0
  200. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/migrations/0006_rename_otp_enabled_user_mfa_authenticator_enabled_and_more.py +0 -0
  201. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/migrations/0007_attachment.py +0 -0
  202. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/migrations/0008_remove_user_hotp_count_remove_user_hotp_expiry_and_more.py +0 -0
  203. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/migrations/__init__.py +0 -0
  204. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/models.py +0 -0
  205. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/settings/__init__.py +0 -0
  206. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/settings/ci.py +0 -0
  207. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/settings/common.py +0 -0
  208. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/settings/dev.py +0 -0
  209. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/settings/dev_custom_example.py +0 -0
  210. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/settings/dev_default.py +0 -0
  211. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/__init__.py +0 -0
  212. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/basic_api_errors.py +0 -0
  213. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/basic_api_test.py +0 -0
  214. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/mfa_test_utils.py +0 -0
  215. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_api_doc.py +0 -0
  216. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_api_doc_search.py +0 -0
  217. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_body_mixin.py +0 -0
  218. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_cache.py +0 -0
  219. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_client.py +0 -0
  220. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_emails_email_api.py +0 -0
  221. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_emails_email_model.py +0 -0
  222. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_emails_q_mailjet_email_backend.py +0 -0
  223. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_emails_send_email_message.py +0 -0
  224. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_fields_choices.py +0 -0
  225. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_fields_date.py +0 -0
  226. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_fields_decimal.py +0 -0
  227. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_fields_minutes_duration.py +0 -0
  228. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_fields_one2many.py +0 -0
  229. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_fields_rich_text.py +0 -0
  230. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_fields_time.py +0 -0
  231. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_filters.py +0 -0
  232. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_locale_api.py +0 -0
  233. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_mfa_legacy.py +0 -0
  234. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_mfa_login_api.py +0 -0
  235. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_mfa_setup_api.py +0 -0
  236. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  237. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_perm_tests.py +0 -0
  238. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_permissions.py +0 -0
  239. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_perms_api.py +0 -0
  240. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_post_migrate_groups_update.py +0 -0
  241. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_profiling_middleware.py +0 -0
  242. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_settings.py +0 -0
  243. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_shortcuts.py +0 -0
  244. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_timezone_middleware.py +0 -0
  245. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_tools.py +0 -0
  246. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_user_job_api.py +0 -0
  247. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_user_job_messages.py +0 -0
  248. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_user_job_model.py +0 -0
  249. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_user_queryset.py +0 -0
  250. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_user_websocket.py +0 -0
  251. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_view_decorators.py +0 -0
  252. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/tests/test_view_fields.py +0 -0
  253. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/urls.py +0 -0
  254. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests/views.py +0 -0
  255. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/__init__.py +0 -0
  256. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/migrations/0001_initial.py +0 -0
  257. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/migrations/__init__.py +0 -0
  258. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/settings/__init__.py +0 -0
  259. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/settings/ci.py +0 -0
  260. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/settings/common.py +0 -0
  261. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/settings/dev.py +0 -0
  262. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/settings/dev_custom_example.py +0 -0
  263. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/settings/dev_default.py +0 -0
  264. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/tests/__init__.py +0 -0
  265. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/tests/test_api.py +0 -0
  266. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/tests/test_auth_api.py +0 -0
  267. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/urls.py +0 -0
  268. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_base_user/views.py +0 -0
  269. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/__init__.py +0 -0
  270. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/migrations/0001_initial.py +0 -0
  271. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/migrations/__init__.py +0 -0
  272. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/models.py +0 -0
  273. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/settings/__init__.py +0 -0
  274. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/settings/ci.py +0 -0
  275. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/settings/common.py +0 -0
  276. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/settings/dev.py +0 -0
  277. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/settings/dev_custom_example.py +0 -0
  278. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/settings/dev_default.py +0 -0
  279. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/tests/__init__.py +0 -0
  280. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/tests/test_api.py +0 -0
  281. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/tests/test_auth_api.py +0 -0
  282. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/tests_custom_user/urls.py +0 -0
  283. {django_pfx-1.7.3.dev41 → django_pfx-1.7.4.dev2}/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.7.3.dev41
3
+ Version: 1.7.4.dev2
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.3.dev41
3
+ Version: 1.7.4.dev2
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.3",
3
+ "distance": 2,
4
+ "node": "g15eb0c06bfab2204f4fb2b90e4dedf18971179e8",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-07-29"
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-07-08 16:13+0200\n"
10
+ "POT-Creation-Date: 2026-07-29 14:36+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:52
69
+ #: models/abstract_pfx_base_user.py:58
70
70
  msgid "user"
71
71
  msgstr "utilisateur"
72
72
 
73
- #: models/abstract_pfx_base_user.py:53
73
+ #: models/abstract_pfx_base_user.py:59
74
74
  msgid "users"
75
75
  msgstr "utilisateurs"
76
76
 
@@ -276,11 +276,11 @@ msgstr "Bienvenue sur %(site_name)s."
276
276
  msgid "Welcome on %(site_name)s"
277
277
  msgstr "Bienvenue sur %(site_name)s"
278
278
 
279
- #: views/authentication_views.py:80
279
+ #: views/authentication_views.py:84
280
280
  msgid "Login failed"
281
281
  msgstr "La connexion a échoué"
282
282
 
283
- #: views/authentication_views.py:89
283
+ #: views/authentication_views.py:93
284
284
  #, python-brace-format
285
285
  msgid ""
286
286
  "Your connection is temporarily disabled after several unsuccessful attempts, "
@@ -289,31 +289,31 @@ msgstr ""
289
289
  "Votre connexion est temporairement désactivée après plusieurs tentatives "
290
290
  "infructueuses, veuillez réessayer dans {seconds} secondes."
291
291
 
292
- #: views/authentication_views.py:181
292
+ #: views/authentication_views.py:185
293
293
  msgid "Successful login"
294
294
  msgstr "Connexion réussie"
295
295
 
296
- #: views/authentication_views.py:255 views/authentication_views.py:423
296
+ #: views/authentication_views.py:259 views/authentication_views.py:427
297
297
  msgid "password updated successfully"
298
298
  msgstr "le mot de passe a été mis à jour avec succès"
299
299
 
300
- #: views/authentication_views.py:260
300
+ #: views/authentication_views.py:264
301
301
  msgid "Incorrect password"
302
302
  msgstr "Mot de passe incorrect"
303
303
 
304
- #: views/authentication_views.py:263 views/authentication_views.py:432
304
+ #: views/authentication_views.py:267 views/authentication_views.py:436
305
305
  msgid "Empty password is not allowed"
306
306
  msgstr "Un mot de passe vide n’est pas autorisé"
307
307
 
308
- #: views/authentication_views.py:352
308
+ #: views/authentication_views.py:356
309
309
  msgid "User and token are valid"
310
310
  msgstr "L’utilisateur et le token sont valides"
311
311
 
312
- #: views/authentication_views.py:354
312
+ #: views/authentication_views.py:358
313
313
  msgid "User or token is invalid"
314
314
  msgstr "L’utilisateur ou le token est invalide"
315
315
 
316
- #: views/authentication_views.py:631
316
+ #: views/authentication_views.py:633
317
317
  msgid ""
318
318
  "If the email address you entered is correct, you will receive an email from "
319
319
  "us with instructions to reset your password."
@@ -14,6 +14,9 @@ class AbstractPFXBaseUser(PFXModelMixin, AbstractBaseUser):
14
14
  class Meta:
15
15
  abstract = True
16
16
 
17
+ def __str__(self):
18
+ return self.get_username()
19
+
17
20
  def auth_json_repr(self, **kw):
18
21
  res = self.json_repr(
19
22
  username=self.get_username(),
@@ -27,6 +30,9 @@ class AbstractPFXBaseUser(PFXModelMixin, AbstractBaseUser):
27
30
  res['permissions'] = list(self.get_all_permissions())
28
31
  return res
29
32
 
33
+ def get_email_rfc(self):
34
+ return f'"{self}" <{getattr(self, self.get_email_field_name())}>'
35
+
30
36
  @classmethod
31
37
  def auth_json_repr_schema(cls):
32
38
  return cls.json_repr_schema()
@@ -53,6 +59,9 @@ class AbstractPFXUser(AbstractUser, AbstractPFXBaseUser):
53
59
  verbose_name_plural = _("users")
54
60
  abstract = True
55
61
 
62
+ def __str__(self):
63
+ return f"{self.first_name} {self.last_name}"
64
+
56
65
  def auth_json_repr(self, **kw):
57
66
  res = super().auth_json_repr(
58
67
  first_name=self.first_name,
@@ -172,3 +172,9 @@ def file_extension(filename):
172
172
  def get_system_error_user_message(context=None):
173
173
  # use str() to force lazy gettext string to be translated.
174
174
  return str(settings.PFX_SYSTEM_ERROR_USER_MESSAGE)
175
+
176
+
177
+ def default_from_email_rfc():
178
+ return (
179
+ f'"{settings.PFX_EMAILS_DEFAULT_FROM_NAME}" '
180
+ f'<{settings.PFX_EMAILS_DEFAULT_FROM_EMAIL}>')
@@ -31,7 +31,11 @@ from pfx.pfxcore.middleware.authentication import JWTTokenDecodeMixin
31
31
  from pfx.pfxcore.models import CacheableMixin
32
32
  from pfx.pfxcore.models.login_ban import LoginBan
33
33
  from pfx.pfxcore.settings import settings
34
- from pfx.pfxcore.shortcuts import delete_token_cookie, f
34
+ from pfx.pfxcore.shortcuts import (
35
+ default_from_email_rfc,
36
+ delete_token_cookie,
37
+ f,
38
+ )
35
39
 
36
40
  from .rest_views import (
37
41
  BaseRestView,
@@ -494,8 +498,6 @@ class SendMessageTokenMixin:
494
498
  from_email = None
495
499
  #: The HTML email template.
496
500
  html_email_template_name = None
497
- #: The email field of user model.
498
- email_field = 'email'
499
501
  #: The language field of user model
500
502
  language_field = 'language'
501
503
 
@@ -524,8 +526,8 @@ class SendMessageTokenMixin:
524
526
  subject = ''.join(subject.splitlines())
525
527
  body = loader.render_to_string(self.email_template_name, data)
526
528
  email_message = EmailMultiAlternatives(
527
- subject, body, self.from_email,
528
- [getattr(user, self.email_field)])
529
+ subject, body, self.from_email or default_from_email_rfc(),
530
+ [user.get_email_rfc()])
529
531
  if self.html_email_template_name is not None:
530
532
  html_email = loader.render_to_string(
531
533
  self.html_email_template_name, data)
@@ -595,6 +595,9 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
595
595
  'Set-Cookie: token=""; expires=Thu, 01 Jan 1970 00:00:00 GMT; '
596
596
  'Max-Age=0; Path=/; SameSite=None; Secure')
597
597
 
598
+ @override_settings(
599
+ PFX_EMAILS_DEFAULT_FROM_NAME="PFX",
600
+ PFX_EMAILS_DEFAULT_FROM_EMAIL="pfx@example.com")
598
601
  def test_signup(self):
599
602
  # Try to create with an existing username
600
603
  response = self.client.post(
@@ -621,15 +624,16 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
621
624
  self.assertRC(response, 200)
622
625
 
623
626
  # Must send a welcome email
624
- self.assertEqual(
625
- mail.outbox[0].subject,
626
- f'Welcome on {settings.PFX_SITE_NAME}')
627
+ email = mail.outbox[0]
628
+ self.assertEqual(email.from_email, '"PFX" <pfx@example.com>')
629
+ self.assertEqual(email.to, ['"Isaac Asimov" <isaac.asimov@bu.edu>'])
630
+ self.assertEqual(email.subject, f'Welcome on {settings.PFX_SITE_NAME}')
627
631
 
628
632
  self.client.logout()
629
633
 
630
634
  # Test that the token and uid are valid.
631
635
  regex = r"token=(.*)&uidb64=(.*)"
632
- token, uidb64 = re.findall(regex, mail.outbox[0].body)[0]
636
+ token, uidb64 = re.findall(regex, email.body)[0]
633
637
  response = self.client.post(
634
638
  '/api/auth/set-password', {
635
639
  'token': token,
@@ -646,6 +650,9 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
646
650
  self.assertRC(response, 422)
647
651
  self.assertJE(response, 'username.@0', 'This field cannot be blank.')
648
652
 
653
+ @override_settings(
654
+ PFX_EMAILS_DEFAULT_FROM_NAME="PFX",
655
+ PFX_EMAILS_DEFAULT_FROM_EMAIL="pfx@example.com")
649
656
  def test_forgotten_password(self):
650
657
  # Try with an nonexistent email
651
658
  response = self.client.post(
@@ -672,15 +679,18 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
672
679
  'instructions to reset your password.')
673
680
 
674
681
  # Must send a reset password email
682
+ email = mail.outbox[0]
683
+ self.assertEqual(email.from_email, '"PFX" <pfx@example.com>')
684
+ self.assertEqual(email.to, [
685
+ '"John Ronald Reuel Tolkien" <jrr.tolkien@oxford.com>'])
675
686
  self.assertEqual(
676
- mail.outbox[0].subject,
677
- f'Password reset on {settings.PFX_SITE_NAME}')
687
+ email.subject, f'Password reset on {settings.PFX_SITE_NAME}')
678
688
 
679
689
  self.client.logout()
680
690
 
681
691
  # Test that the token and uid are valid.
682
692
  regex = r"token=(.*)&uidb64=(.*)"
683
- token, uidb64 = re.findall(regex, mail.outbox[0].body)[0]
693
+ token, uidb64 = re.findall(regex, email.body)[0]
684
694
  response = self.client.post(
685
695
  '/api/auth/set-password', {
686
696
  'token': token,
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "1.7.2",
3
- "distance": 41,
4
- "node": "g5546a817c1462a2ee070ac76715c941a3fb13435",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-07-22"
8
- }