django-pfx 1.7.3.dev22__tar.gz → 1.7.3.dev26__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 (282) hide show
  1. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/PKG-INFO +2 -2
  2. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/django_pfx.egg-info/PKG-INFO +2 -2
  3. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/django_pfx.egg-info/SOURCES.txt +15 -0
  4. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/django_pfx.egg-info/requires.txt +1 -1
  5. django_pfx-1.7.3.dev26/django_pfx.egg-info/scm_file_list.json +273 -0
  6. django_pfx-1.7.3.dev26/django_pfx.egg-info/scm_version.json +8 -0
  7. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/source/api.views.rst +14 -6
  8. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/source/authentication.md +97 -38
  9. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/shortcuts.py +2 -1
  10. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/default_settings.py +4 -1
  11. django_pfx-1.7.3.dev26/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  12. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +121 -75
  13. django_pfx-1.7.3.dev26/pfx/pfxcore/mfa/__init__.py +61 -0
  14. django_pfx-1.7.3.dev26/pfx/pfxcore/mfa/authenticator.py +35 -0
  15. django_pfx-1.7.3.dev26/pfx/pfxcore/mfa/base.py +67 -0
  16. django_pfx-1.7.3.dev26/pfx/pfxcore/mfa/email.py +94 -0
  17. django_pfx-1.7.3.dev26/pfx/pfxcore/mfa/legacy.py +89 -0
  18. django_pfx-1.7.3.dev26/pfx/pfxcore/mfa/sms.py +50 -0
  19. django_pfx-1.7.3.dev26/pfx/pfxcore/migrations/0005_mfadevice_mfadevice_mfa_device_unique_backend.py +40 -0
  20. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/models/__init__.py +2 -1
  21. django_pfx-1.7.3.dev26/pfx/pfxcore/models/mfa_device.py +96 -0
  22. django_pfx-1.7.3.dev26/pfx/pfxcore/models/mfa_user_mixin.py +110 -0
  23. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/urls.py +1 -2
  24. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/__init__.py +0 -1
  25. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/authentication_views.py +151 -520
  26. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/requirements.txt +1 -1
  27. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/setup.cfg +1 -1
  28. django_pfx-1.7.3.dev26/tests/migrations/0008_remove_user_hotp_count_remove_user_hotp_expiry_and_more.py +55 -0
  29. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/models.py +2 -2
  30. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/__init__.py +4 -1
  31. django_pfx-1.7.3.dev26/tests/tests/mfa_test_utils.py +64 -0
  32. django_pfx-1.7.3.dev26/tests/tests/test_auth_api.py +912 -0
  33. django_pfx-1.7.3.dev26/tests/tests/test_mfa_legacy.py +112 -0
  34. django_pfx-1.7.3.dev26/tests/tests/test_mfa_login_api.py +451 -0
  35. django_pfx-1.7.3.dev26/tests/tests/test_mfa_setup_api.py +382 -0
  36. django_pfx-1.7.3.dev22/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  37. django_pfx-1.7.3.dev22/pfx/pfxcore/models/mfa_user_mixin.py +0 -293
  38. django_pfx-1.7.3.dev22/tests/tests/test_auth_api.py +0 -2035
  39. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/.gitignore +0 -0
  40. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/.gitlab-ci.yml +0 -0
  41. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/.pre-commit-config.yaml +0 -0
  42. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/LICENSE +0 -0
  43. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/MANIFEST.in +0 -0
  44. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/README.md +0 -0
  45. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/django_pfx.egg-info/dependency_links.txt +0 -0
  46. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/django_pfx.egg-info/top_level.txt +0 -0
  47. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/Makefile +0 -0
  48. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/conf.py +0 -0
  49. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/index.rst +0 -0
  50. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/source/decorator.md +0 -0
  51. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/source/generate_openapi.md +0 -0
  52. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/source/getting_started.md +0 -0
  53. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/source/internationalisation.md +0 -0
  54. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/source/model.md +0 -0
  55. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/source/pfx_views.md +0 -0
  56. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/source/profiling.md +0 -0
  57. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/source/settings.md +0 -0
  58. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/doc/source/testing.md +0 -0
  59. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/img/pfx.png +0 -0
  60. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/img/pfx.svg +0 -0
  61. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/make_messages +0 -0
  62. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/manage.py +0 -0
  63. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/__init__.py +0 -0
  64. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/__init__.py +0 -0
  65. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/apps.py +0 -0
  66. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/email_backend/__init__.py +0 -0
  67. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/email_backend/q_mailjet_email_backend.py +0 -0
  68. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/exceptions.py +0 -0
  69. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/mailjet/__init__.py +0 -0
  70. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/mailjet/mailjet.py +0 -0
  71. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/mailjet/message_result.py +0 -0
  72. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/migrations/0001_initial.py +0 -0
  73. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/migrations/0002_alter_email_headers.py +0 -0
  74. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/migrations/0003_alter_email_options.py +0 -0
  75. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/migrations/__init__.py +0 -0
  76. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/models/__init__.py +0 -0
  77. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/models/email.py +0 -0
  78. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/providers/__init__.py +0 -0
  79. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/providers/email_django_q_executor.py +0 -0
  80. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/tasks.py +0 -0
  81. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/templates/emails/base_template.html +0 -0
  82. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/templates/emails/base_template.txt +0 -0
  83. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/templates/emails/base_template_subject.txt +0 -0
  84. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/urls.py +0 -0
  85. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/views/__init__.py +0 -0
  86. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/emails/views/email_rest_view.py +0 -0
  87. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/__init__.py +0 -0
  88. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/apidoc/__init__.py +0 -0
  89. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/apidoc/parameters.py +0 -0
  90. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/apidoc/schema.py +0 -0
  91. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/apidoc/tags.py +0 -0
  92. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/apps.py +0 -0
  93. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/decorator/__init__.py +0 -0
  94. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/decorator/rest.py +0 -0
  95. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/exceptions.py +0 -0
  96. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/fields/__init__.py +0 -0
  97. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/fields/decimal_field.py +0 -0
  98. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/fields/media_field.py +0 -0
  99. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/fields/minutes_duration_field.py +0 -0
  100. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/fields/rich_text_field.py +0 -0
  101. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/http/__init__.py +0 -0
  102. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/http/json_response.py +0 -0
  103. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/management/__init__.py +0 -0
  104. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/management/commands/__init__.py +0 -0
  105. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  106. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/management/commands/profile.py +0 -0
  107. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/middleware/__init__.py +0 -0
  108. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/middleware/authentication.py +0 -0
  109. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/middleware/locale.py +0 -0
  110. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/middleware/profiling.py +0 -0
  111. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/middleware/request_too_big_middleware.py +0 -0
  112. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/middleware/ws_cookie_authentication_middleware.py +0 -0
  113. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  114. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/migrations/0002_pfxpermissionsuser.py +0 -0
  115. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py +0 -0
  116. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/migrations/0004_alter_loginban_failed_counter_and_more.py +0 -0
  117. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/migrations/__init__.py +0 -0
  118. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/migrations/operations/__init__.py +0 -0
  119. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/migrations/operations/permissions.py +0 -0
  120. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  121. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/models/attachment_mixin.py +0 -0
  122. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/models/cache_mixins.py +0 -0
  123. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/models/login_ban.py +0 -0
  124. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/models/not_null_fields.py +0 -0
  125. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/models/ordered_model_mixin.py +0 -0
  126. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/models/pfx_models.py +0 -0
  127. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/models/pfx_user.py +0 -0
  128. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  129. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/serializers/__init__.py +0 -0
  130. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/serializers/json.py +0 -0
  131. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/settings.py +0 -0
  132. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/shortcuts.py +0 -0
  133. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/sms/__init__.py +0 -0
  134. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/sms/backends/__init__.py +0 -0
  135. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/sms/backends/base.py +0 -0
  136. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/sms/backends/console.py +0 -0
  137. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/storage/__init__.py +0 -0
  138. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/storage/exceptions.py +0 -0
  139. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/storage/local_storage.py +0 -0
  140. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/storage/s3_storage.py +0 -0
  141. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  142. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  143. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  144. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  145. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  146. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  147. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/test.py +0 -0
  148. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/fields.py +0 -0
  149. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/filters_views.py +0 -0
  150. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/locale_views.py +0 -0
  151. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/media_rest_view_mixin.py +0 -0
  152. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/ordered_rest_view_mixin.py +0 -0
  153. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  154. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  155. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/groups.py +0 -0
  156. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  157. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  158. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  159. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  160. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  161. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  162. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  163. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  164. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  165. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/subset.py +0 -0
  166. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  167. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  168. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  169. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  170. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  171. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/pfxcore/views/rest_views.py +0 -0
  172. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/settings/__init__.py +0 -0
  173. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/settings/dev.py +0 -0
  174. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/__init__.py +0 -0
  175. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/apps.py +0 -0
  176. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/locale/fr/LC_MESSAGES/django.mo +0 -0
  177. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/locale/fr/LC_MESSAGES/django.po +0 -0
  178. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/migrations/0001_initial.py +0 -0
  179. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/migrations/0002_alter_userjob_options_alter_userjob_auto_queued_and_more.py +0 -0
  180. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/migrations/0003_clean_scheduled_tasks.py +0 -0
  181. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/migrations/__init__.py +0 -0
  182. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/models/__init__.py +0 -0
  183. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/models/user_job.py +0 -0
  184. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/models/user_job_attachment.py +0 -0
  185. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/providers/__init__.py +0 -0
  186. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/providers/user_job_django_q_executor.py +0 -0
  187. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/providers/user_job_websocket_channel_provider.py +0 -0
  188. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/tasks.py +0 -0
  189. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/urls.py +0 -0
  190. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/views/__init__.py +0 -0
  191. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/views/user_job_attachment_view.py +0 -0
  192. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/views/user_job_view.py +0 -0
  193. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pfx/userjobs/views/user_websocket_consumer.py +0 -0
  194. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/pyproject.toml +0 -0
  195. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/serve-doc +0 -0
  196. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/setup.py +0 -0
  197. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/__init__.py +0 -0
  198. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/apps.py +0 -0
  199. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/channel_group_send_calls.py +0 -0
  200. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  201. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/migrations/0001_initial.py +0 -0
  202. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/migrations/0002_alter_book_cover.py +0 -0
  203. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/migrations/0003_book_local_file.py +0 -0
  204. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/migrations/0004_mfausermixin_fields.py +0 -0
  205. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/migrations/0005_mfausermixin_fields_fix.py +0 -0
  206. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/migrations/0006_rename_otp_enabled_user_mfa_authenticator_enabled_and_more.py +0 -0
  207. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/migrations/0007_attachment.py +0 -0
  208. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/migrations/__init__.py +0 -0
  209. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/settings/__init__.py +0 -0
  210. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/settings/ci.py +0 -0
  211. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/settings/common.py +0 -0
  212. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/settings/dev.py +0 -0
  213. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/settings/dev_custom_example.py +0 -0
  214. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/settings/dev_default.py +0 -0
  215. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/basic_api_errors.py +0 -0
  216. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/basic_api_test.py +0 -0
  217. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_api_doc.py +0 -0
  218. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_api_doc_search.py +0 -0
  219. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_body_mixin.py +0 -0
  220. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_cache.py +0 -0
  221. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_client.py +0 -0
  222. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_emails_email_api.py +0 -0
  223. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_emails_email_model.py +0 -0
  224. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_emails_q_mailjet_email_backend.py +0 -0
  225. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_emails_send_email_message.py +0 -0
  226. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_fields_choices.py +0 -0
  227. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_fields_date.py +0 -0
  228. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_fields_decimal.py +0 -0
  229. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_fields_minutes_duration.py +0 -0
  230. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_fields_one2many.py +0 -0
  231. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_fields_rich_text.py +0 -0
  232. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_fields_time.py +0 -0
  233. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_filters.py +0 -0
  234. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_locale_api.py +0 -0
  235. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_ordered_rest_view_mixin.py +0 -0
  236. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_perm_tests.py +0 -0
  237. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_permissions.py +0 -0
  238. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_perms_api.py +0 -0
  239. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_post_migrate_groups_update.py +0 -0
  240. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_profiling_middleware.py +0 -0
  241. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_settings.py +0 -0
  242. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_shortcuts.py +0 -0
  243. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_timezone_middleware.py +0 -0
  244. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_tools.py +0 -0
  245. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_user_job_api.py +0 -0
  246. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_user_job_messages.py +0 -0
  247. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_user_job_model.py +0 -0
  248. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_user_queryset.py +0 -0
  249. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_user_websocket.py +0 -0
  250. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_view_decorators.py +0 -0
  251. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/tests/test_view_fields.py +0 -0
  252. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/urls.py +0 -0
  253. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests/views.py +0 -0
  254. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/__init__.py +0 -0
  255. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/migrations/0001_initial.py +0 -0
  256. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/migrations/__init__.py +0 -0
  257. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/settings/__init__.py +0 -0
  258. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/settings/ci.py +0 -0
  259. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/settings/common.py +0 -0
  260. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/settings/dev.py +0 -0
  261. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/settings/dev_custom_example.py +0 -0
  262. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/settings/dev_default.py +0 -0
  263. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/tests/__init__.py +0 -0
  264. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/tests/test_api.py +0 -0
  265. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/tests/test_auth_api.py +0 -0
  266. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/urls.py +0 -0
  267. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_base_user/views.py +0 -0
  268. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/__init__.py +0 -0
  269. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/migrations/0001_initial.py +0 -0
  270. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/migrations/__init__.py +0 -0
  271. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/models.py +0 -0
  272. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/settings/__init__.py +0 -0
  273. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/settings/ci.py +0 -0
  274. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/settings/common.py +0 -0
  275. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/settings/dev.py +0 -0
  276. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/settings/dev_custom_example.py +0 -0
  277. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/settings/dev_default.py +0 -0
  278. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/tests/__init__.py +0 -0
  279. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/tests/test_api.py +0 -0
  280. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/tests/test_auth_api.py +0 -0
  281. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/tests_custom_user/urls.py +0 -0
  282. {django_pfx-1.7.3.dev22 → django_pfx-1.7.3.dev26}/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.dev22
3
+ Version: 1.7.3.dev26
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
@@ -36,7 +36,7 @@ Requires-Dist: pytz
36
36
  Requires-Dist: dill
37
37
  Requires-Dist: nh3
38
38
  Provides-Extra: otp
39
- Requires-Dist: pyotp; extra == "otp"
39
+ Requires-Dist: pyotp>=2.10.0; extra == "otp"
40
40
  Provides-Extra: heic-converter
41
41
  Requires-Dist: python-magic; extra == "heic-converter"
42
42
  Requires-Dist: pillow-heif; extra == "heic-converter"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-pfx
3
- Version: 1.7.3.dev22
3
+ Version: 1.7.3.dev26
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
@@ -36,7 +36,7 @@ Requires-Dist: pytz
36
36
  Requires-Dist: dill
37
37
  Requires-Dist: nh3
38
38
  Provides-Extra: otp
39
- Requires-Dist: pyotp; extra == "otp"
39
+ Requires-Dist: pyotp>=2.10.0; extra == "otp"
40
40
  Provides-Extra: heic-converter
41
41
  Requires-Dist: python-magic; extra == "heic-converter"
42
42
  Requires-Dist: pillow-heif; extra == "heic-converter"
@@ -15,6 +15,8 @@ django_pfx.egg-info/PKG-INFO
15
15
  django_pfx.egg-info/SOURCES.txt
16
16
  django_pfx.egg-info/dependency_links.txt
17
17
  django_pfx.egg-info/requires.txt
18
+ django_pfx.egg-info/scm_file_list.json
19
+ django_pfx.egg-info/scm_version.json
18
20
  django_pfx.egg-info/top_level.txt
19
21
  doc/Makefile
20
22
  doc/conf.py
@@ -84,6 +86,12 @@ pfx/pfxcore/management/__init__.py
84
86
  pfx/pfxcore/management/commands/__init__.py
85
87
  pfx/pfxcore/management/commands/makeapidoc.py
86
88
  pfx/pfxcore/management/commands/profile.py
89
+ pfx/pfxcore/mfa/__init__.py
90
+ pfx/pfxcore/mfa/authenticator.py
91
+ pfx/pfxcore/mfa/base.py
92
+ pfx/pfxcore/mfa/email.py
93
+ pfx/pfxcore/mfa/legacy.py
94
+ pfx/pfxcore/mfa/sms.py
87
95
  pfx/pfxcore/middleware/__init__.py
88
96
  pfx/pfxcore/middleware/authentication.py
89
97
  pfx/pfxcore/middleware/locale.py
@@ -94,6 +102,7 @@ pfx/pfxcore/migrations/0001_initial.py
94
102
  pfx/pfxcore/migrations/0002_pfxpermissionsuser.py
95
103
  pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py
96
104
  pfx/pfxcore/migrations/0004_alter_loginban_failed_counter_and_more.py
105
+ pfx/pfxcore/migrations/0005_mfadevice_mfadevice_mfa_device_unique_backend.py
97
106
  pfx/pfxcore/migrations/__init__.py
98
107
  pfx/pfxcore/migrations/operations/__init__.py
99
108
  pfx/pfxcore/migrations/operations/permissions.py
@@ -102,6 +111,7 @@ pfx/pfxcore/models/abstract_pfx_base_user.py
102
111
  pfx/pfxcore/models/attachment_mixin.py
103
112
  pfx/pfxcore/models/cache_mixins.py
104
113
  pfx/pfxcore/models/login_ban.py
114
+ pfx/pfxcore/models/mfa_device.py
105
115
  pfx/pfxcore/models/mfa_user_mixin.py
106
116
  pfx/pfxcore/models/not_null_fields.py
107
117
  pfx/pfxcore/models/ordered_model_mixin.py
@@ -186,6 +196,7 @@ tests/migrations/0004_mfausermixin_fields.py
186
196
  tests/migrations/0005_mfausermixin_fields_fix.py
187
197
  tests/migrations/0006_rename_otp_enabled_user_mfa_authenticator_enabled_and_more.py
188
198
  tests/migrations/0007_attachment.py
199
+ tests/migrations/0008_remove_user_hotp_count_remove_user_hotp_expiry_and_more.py
189
200
  tests/migrations/__init__.py
190
201
  tests/settings/__init__.py
191
202
  tests/settings/ci.py
@@ -196,6 +207,7 @@ tests/settings/dev_default.py
196
207
  tests/tests/__init__.py
197
208
  tests/tests/basic_api_errors.py
198
209
  tests/tests/basic_api_test.py
210
+ tests/tests/mfa_test_utils.py
199
211
  tests/tests/test_api_doc.py
200
212
  tests/tests/test_api_doc_search.py
201
213
  tests/tests/test_auth_api.py
@@ -215,6 +227,9 @@ tests/tests/test_fields_rich_text.py
215
227
  tests/tests/test_fields_time.py
216
228
  tests/tests/test_filters.py
217
229
  tests/tests/test_locale_api.py
230
+ tests/tests/test_mfa_legacy.py
231
+ tests/tests/test_mfa_login_api.py
232
+ tests/tests/test_mfa_setup_api.py
218
233
  tests/tests/test_ordered_rest_view_mixin.py
219
234
  tests/tests/test_perm_tests.py
220
235
  tests/tests/test_permissions.py
@@ -14,4 +14,4 @@ python-magic
14
14
  pillow-heif
15
15
 
16
16
  [otp]
17
- pyotp
17
+ pyotp>=2.10.0
@@ -0,0 +1,273 @@
1
+ {
2
+ "files": [
3
+ ".gitignore",
4
+ ".gitlab-ci.yml",
5
+ ".pre-commit-config.yaml",
6
+ "make_messages",
7
+ "MANIFEST.in",
8
+ "manage.py",
9
+ "serve-doc",
10
+ "requirements.txt",
11
+ "README.md",
12
+ "pyproject.toml",
13
+ "LICENSE",
14
+ "setup.py",
15
+ "setup.cfg",
16
+ "tests/channel_group_send_calls.py",
17
+ "tests/urls.py",
18
+ "tests/views.py",
19
+ "tests/__init__.py",
20
+ "tests/models.py",
21
+ "tests/apps.py",
22
+ "tests/tests/test_fields_one2many.py",
23
+ "tests/tests/test_api_doc_search.py",
24
+ "tests/tests/basic_api_errors.py",
25
+ "tests/tests/test_fields_rich_text.py",
26
+ "tests/tests/test_tools.py",
27
+ "tests/tests/mfa_test_utils.py",
28
+ "tests/tests/test_fields_minutes_duration.py",
29
+ "tests/tests/test_body_mixin.py",
30
+ "tests/tests/test_auth_api.py",
31
+ "tests/tests/test_fields_choices.py",
32
+ "tests/tests/test_user_job_api.py",
33
+ "tests/tests/test_user_job_model.py",
34
+ "tests/tests/test_timezone_middleware.py",
35
+ "tests/tests/test_mfa_login_api.py",
36
+ "tests/tests/test_perm_tests.py",
37
+ "tests/tests/test_perms_api.py",
38
+ "tests/tests/test_view_decorators.py",
39
+ "tests/tests/test_client.py",
40
+ "tests/tests/test_user_websocket.py",
41
+ "tests/tests/test_emails_email_model.py",
42
+ "tests/tests/__init__.py",
43
+ "tests/tests/test_fields_date.py",
44
+ "tests/tests/test_user_job_messages.py",
45
+ "tests/tests/test_filters.py",
46
+ "tests/tests/test_permissions.py",
47
+ "tests/tests/test_user_queryset.py",
48
+ "tests/tests/test_settings.py",
49
+ "tests/tests/test_ordered_rest_view_mixin.py",
50
+ "tests/tests/test_mfa_setup_api.py",
51
+ "tests/tests/test_emails_email_api.py",
52
+ "tests/tests/test_locale_api.py",
53
+ "tests/tests/test_shortcuts.py",
54
+ "tests/tests/test_profiling_middleware.py",
55
+ "tests/tests/test_mfa_legacy.py",
56
+ "tests/tests/test_post_migrate_groups_update.py",
57
+ "tests/tests/test_view_fields.py",
58
+ "tests/tests/basic_api_test.py",
59
+ "tests/tests/test_fields_time.py",
60
+ "tests/tests/test_emails_send_email_message.py",
61
+ "tests/tests/test_api_doc.py",
62
+ "tests/tests/test_cache.py",
63
+ "tests/tests/test_emails_q_mailjet_email_backend.py",
64
+ "tests/tests/test_fields_decimal.py",
65
+ "tests/settings/dev.py",
66
+ "tests/settings/common.py",
67
+ "tests/settings/dev_default.py",
68
+ "tests/settings/__init__.py",
69
+ "tests/settings/dev_custom_example.py",
70
+ "tests/settings/ci.py",
71
+ "tests/migrations/0004_mfausermixin_fields.py",
72
+ "tests/migrations/0006_rename_otp_enabled_user_mfa_authenticator_enabled_and_more.py",
73
+ "tests/migrations/0008_remove_user_hotp_count_remove_user_hotp_expiry_and_more.py",
74
+ "tests/migrations/__init__.py",
75
+ "tests/migrations/0002_alter_book_cover.py",
76
+ "tests/migrations/0001_initial.py",
77
+ "tests/migrations/0007_attachment.py",
78
+ "tests/migrations/0005_mfausermixin_fields_fix.py",
79
+ "tests/migrations/0003_book_local_file.py",
80
+ "tests/locale/fr/LC_MESSAGES/django.po",
81
+ "doc/conf.py",
82
+ "doc/index.rst",
83
+ "doc/Makefile",
84
+ "doc/source/authentication.md",
85
+ "doc/source/generate_openapi.md",
86
+ "doc/source/api.views.rst",
87
+ "doc/source/decorator.md",
88
+ "doc/source/settings.md",
89
+ "doc/source/testing.md",
90
+ "doc/source/profiling.md",
91
+ "doc/source/getting_started.md",
92
+ "doc/source/pfx_views.md",
93
+ "doc/source/internationalisation.md",
94
+ "doc/source/model.md",
95
+ "img/pfx.svg",
96
+ "img/pfx.png",
97
+ "pfx/__init__.py",
98
+ "pfx/pfxcore/test.py",
99
+ "pfx/pfxcore/exceptions.py",
100
+ "pfx/pfxcore/urls.py",
101
+ "pfx/pfxcore/__init__.py",
102
+ "pfx/pfxcore/default_settings.py",
103
+ "pfx/pfxcore/settings.py",
104
+ "pfx/pfxcore/apps.py",
105
+ "pfx/pfxcore/shortcuts.py",
106
+ "pfx/pfxcore/decorator/rest.py",
107
+ "pfx/pfxcore/decorator/__init__.py",
108
+ "pfx/pfxcore/models/mfa_device.py",
109
+ "pfx/pfxcore/models/ordered_model_mixin.py",
110
+ "pfx/pfxcore/models/pfx_models.py",
111
+ "pfx/pfxcore/models/mfa_user_mixin.py",
112
+ "pfx/pfxcore/models/user_filtered_queryset_mixin.py",
113
+ "pfx/pfxcore/models/__init__.py",
114
+ "pfx/pfxcore/models/pfx_user.py",
115
+ "pfx/pfxcore/models/login_ban.py",
116
+ "pfx/pfxcore/models/attachment_mixin.py",
117
+ "pfx/pfxcore/models/cache_mixins.py",
118
+ "pfx/pfxcore/models/abstract_pfx_base_user.py",
119
+ "pfx/pfxcore/models/not_null_fields.py",
120
+ "pfx/pfxcore/middleware/ws_cookie_authentication_middleware.py",
121
+ "pfx/pfxcore/middleware/authentication.py",
122
+ "pfx/pfxcore/middleware/locale.py",
123
+ "pfx/pfxcore/middleware/__init__.py",
124
+ "pfx/pfxcore/middleware/profiling.py",
125
+ "pfx/pfxcore/middleware/request_too_big_middleware.py",
126
+ "pfx/pfxcore/views/authentication_views.py",
127
+ "pfx/pfxcore/views/filters_views.py",
128
+ "pfx/pfxcore/views/media_rest_view_mixin.py",
129
+ "pfx/pfxcore/views/locale_views.py",
130
+ "pfx/pfxcore/views/rest_views.py",
131
+ "pfx/pfxcore/views/ordered_rest_view_mixin.py",
132
+ "pfx/pfxcore/views/__init__.py",
133
+ "pfx/pfxcore/views/fields.py",
134
+ "pfx/pfxcore/views/parameters/subset_page_subset.py",
135
+ "pfx/pfxcore/views/parameters/meta_fields.py",
136
+ "pfx/pfxcore/views/parameters/list_mode.py",
137
+ "pfx/pfxcore/views/parameters/list_count.py",
138
+ "pfx/pfxcore/views/parameters/media_redirect.py",
139
+ "pfx/pfxcore/views/parameters/meta_orders.py",
140
+ "pfx/pfxcore/views/parameters/date_format.py",
141
+ "pfx/pfxcore/views/parameters/subset_limit.py",
142
+ "pfx/pfxcore/views/parameters/list_search.py",
143
+ "pfx/pfxcore/views/parameters/subset_page_size.py",
144
+ "pfx/pfxcore/views/parameters/__init__.py",
145
+ "pfx/pfxcore/views/parameters/subset_page.py",
146
+ "pfx/pfxcore/views/parameters/list_items.py",
147
+ "pfx/pfxcore/views/parameters/list_order.py",
148
+ "pfx/pfxcore/views/parameters/subset_offset.py",
149
+ "pfx/pfxcore/views/parameters/groups.py",
150
+ "pfx/pfxcore/views/parameters/meta_filters.py",
151
+ "pfx/pfxcore/views/parameters/subset.py",
152
+ "pfx/pfxcore/serializers/__init__.py",
153
+ "pfx/pfxcore/serializers/json.py",
154
+ "pfx/pfxcore/mfa/authenticator.py",
155
+ "pfx/pfxcore/mfa/base.py",
156
+ "pfx/pfxcore/mfa/sms.py",
157
+ "pfx/pfxcore/mfa/__init__.py",
158
+ "pfx/pfxcore/mfa/email.py",
159
+ "pfx/pfxcore/mfa/legacy.py",
160
+ "pfx/pfxcore/templates/registration/password_reset_email.txt",
161
+ "pfx/pfxcore/templates/registration/password_reset_subject.txt",
162
+ "pfx/pfxcore/templates/registration/welcome_email.txt",
163
+ "pfx/pfxcore/templates/registration/welcome_subject.txt",
164
+ "pfx/pfxcore/templates/registration/otp_code_subject.txt",
165
+ "pfx/pfxcore/templates/registration/otp_code_email.txt",
166
+ "pfx/pfxcore/migrations/0003_delete_pfxpermissionsuser.py",
167
+ "pfx/pfxcore/migrations/__init__.py",
168
+ "pfx/pfxcore/migrations/0005_mfadevice_mfadevice_mfa_device_unique_backend.py",
169
+ "pfx/pfxcore/migrations/0001_initial.py",
170
+ "pfx/pfxcore/migrations/0004_alter_loginban_failed_counter_and_more.py",
171
+ "pfx/pfxcore/migrations/0002_pfxpermissionsuser.py",
172
+ "pfx/pfxcore/migrations/operations/permissions.py",
173
+ "pfx/pfxcore/migrations/operations/__init__.py",
174
+ "pfx/pfxcore/apidoc/schema.py",
175
+ "pfx/pfxcore/apidoc/tags.py",
176
+ "pfx/pfxcore/apidoc/__init__.py",
177
+ "pfx/pfxcore/apidoc/parameters.py",
178
+ "pfx/pfxcore/storage/exceptions.py",
179
+ "pfx/pfxcore/storage/local_storage.py",
180
+ "pfx/pfxcore/storage/__init__.py",
181
+ "pfx/pfxcore/storage/s3_storage.py",
182
+ "pfx/pfxcore/fields/minutes_duration_field.py",
183
+ "pfx/pfxcore/fields/rich_text_field.py",
184
+ "pfx/pfxcore/fields/media_field.py",
185
+ "pfx/pfxcore/fields/__init__.py",
186
+ "pfx/pfxcore/fields/decimal_field.py",
187
+ "pfx/pfxcore/http/__init__.py",
188
+ "pfx/pfxcore/http/json_response.py",
189
+ "pfx/pfxcore/locale/fr/LC_MESSAGES/django.po",
190
+ "pfx/pfxcore/sms/__init__.py",
191
+ "pfx/pfxcore/sms/backends/base.py",
192
+ "pfx/pfxcore/sms/backends/__init__.py",
193
+ "pfx/pfxcore/sms/backends/console.py",
194
+ "pfx/pfxcore/management/__init__.py",
195
+ "pfx/pfxcore/management/commands/__init__.py",
196
+ "pfx/pfxcore/management/commands/makeapidoc.py",
197
+ "pfx/pfxcore/management/commands/profile.py",
198
+ "pfx/userjobs/urls.py",
199
+ "pfx/userjobs/tasks.py",
200
+ "pfx/userjobs/__init__.py",
201
+ "pfx/userjobs/apps.py",
202
+ "pfx/userjobs/models/__init__.py",
203
+ "pfx/userjobs/models/user_job_attachment.py",
204
+ "pfx/userjobs/models/user_job.py",
205
+ "pfx/userjobs/views/__init__.py",
206
+ "pfx/userjobs/views/user_websocket_consumer.py",
207
+ "pfx/userjobs/views/user_job_view.py",
208
+ "pfx/userjobs/views/user_job_attachment_view.py",
209
+ "pfx/userjobs/migrations/0002_alter_userjob_options_alter_userjob_auto_queued_and_more.py",
210
+ "pfx/userjobs/migrations/__init__.py",
211
+ "pfx/userjobs/migrations/0003_clean_scheduled_tasks.py",
212
+ "pfx/userjobs/migrations/0001_initial.py",
213
+ "pfx/userjobs/providers/__init__.py",
214
+ "pfx/userjobs/providers/user_job_django_q_executor.py",
215
+ "pfx/userjobs/providers/user_job_websocket_channel_provider.py",
216
+ "pfx/userjobs/locale/fr/LC_MESSAGES/django.po",
217
+ "pfx/settings/dev.py",
218
+ "pfx/settings/__init__.py",
219
+ "pfx/emails/exceptions.py",
220
+ "pfx/emails/urls.py",
221
+ "pfx/emails/tasks.py",
222
+ "pfx/emails/__init__.py",
223
+ "pfx/emails/apps.py",
224
+ "pfx/emails/shortcuts.py",
225
+ "pfx/emails/models/__init__.py",
226
+ "pfx/emails/models/email.py",
227
+ "pfx/emails/mailjet/__init__.py",
228
+ "pfx/emails/mailjet/message_result.py",
229
+ "pfx/emails/mailjet/mailjet.py",
230
+ "pfx/emails/views/__init__.py",
231
+ "pfx/emails/views/email_rest_view.py",
232
+ "pfx/emails/templates/emails/base_template.txt",
233
+ "pfx/emails/templates/emails/base_template_subject.txt",
234
+ "pfx/emails/templates/emails/base_template.html",
235
+ "pfx/emails/migrations/0003_alter_email_options.py",
236
+ "pfx/emails/migrations/0002_alter_email_headers.py",
237
+ "pfx/emails/migrations/__init__.py",
238
+ "pfx/emails/migrations/0001_initial.py",
239
+ "pfx/emails/providers/email_django_q_executor.py",
240
+ "pfx/emails/providers/__init__.py",
241
+ "pfx/emails/email_backend/q_mailjet_email_backend.py",
242
+ "pfx/emails/email_backend/__init__.py",
243
+ "tests_custom_user/urls.py",
244
+ "tests_custom_user/views.py",
245
+ "tests_custom_user/__init__.py",
246
+ "tests_custom_user/models.py",
247
+ "tests_custom_user/tests/test_api.py",
248
+ "tests_custom_user/tests/test_auth_api.py",
249
+ "tests_custom_user/tests/__init__.py",
250
+ "tests_custom_user/settings/dev.py",
251
+ "tests_custom_user/settings/common.py",
252
+ "tests_custom_user/settings/dev_default.py",
253
+ "tests_custom_user/settings/__init__.py",
254
+ "tests_custom_user/settings/dev_custom_example.py",
255
+ "tests_custom_user/settings/ci.py",
256
+ "tests_custom_user/migrations/__init__.py",
257
+ "tests_custom_user/migrations/0001_initial.py",
258
+ "tests_base_user/urls.py",
259
+ "tests_base_user/views.py",
260
+ "tests_base_user/__init__.py",
261
+ "tests_base_user/tests/test_api.py",
262
+ "tests_base_user/tests/test_auth_api.py",
263
+ "tests_base_user/tests/__init__.py",
264
+ "tests_base_user/settings/dev.py",
265
+ "tests_base_user/settings/common.py",
266
+ "tests_base_user/settings/dev_default.py",
267
+ "tests_base_user/settings/__init__.py",
268
+ "tests_base_user/settings/dev_custom_example.py",
269
+ "tests_base_user/settings/ci.py",
270
+ "tests_base_user/migrations/__init__.py",
271
+ "tests_base_user/migrations/0001_initial.py"
272
+ ]
273
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "1.7.2",
3
+ "distance": 26,
4
+ "node": "ge35090d63d10899b464e568fee4a253f5d289cdf",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-06-23"
8
+ }
@@ -36,7 +36,11 @@ API Reference
36
36
  :members:
37
37
  :show-inheritance:
38
38
 
39
- .. autoclass:: pfx.pfxcore.models.OtpUserMixin
39
+ .. autoclass:: pfx.pfxcore.models.MFAUserMixin
40
+ :members:
41
+ :show-inheritance:
42
+
43
+ .. autoclass:: pfx.pfxcore.models.MFADevice
40
44
  :members:
41
45
  :show-inheritance:
42
46
 
@@ -44,6 +48,15 @@ API Reference
44
48
  :members:
45
49
  :show-inheritance:
46
50
 
51
+ ``pfx.pfxcore.mfa``
52
+ *******************
53
+
54
+ .. autoclass:: pfx.pfxcore.mfa.MFABackend
55
+ :members:
56
+ :show-inheritance:
57
+
58
+ .. autofunction:: pfx.pfxcore.mfa.legacy.port_legacy_mfa
59
+
47
60
  ``pfx.pfxcore.views``
48
61
  *********************
49
62
 
@@ -148,11 +161,6 @@ Base services
148
161
  :undoc-members:
149
162
  :show-inheritance:
150
163
 
151
- .. autoclass:: pfx.pfxcore.views.OtpEmailView
152
- :members:
153
- :undoc-members:
154
- :show-inheritance:
155
-
156
164
  .. autoclass:: pfx.pfxcore.views.LocaleRestView
157
165
  :members:
158
166
  :undoc-members: