django-pfx 1.4.dev38__tar.gz → 1.4.dev42__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 (143) hide show
  1. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/PKG-INFO +1 -1
  2. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/django_pfx.egg-info/PKG-INFO +1 -1
  3. django_pfx-1.4.dev42/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  4. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +8 -8
  5. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/models/login_ban.py +3 -1
  6. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/authentication_views.py +2 -2
  7. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_auth_api.py +20 -4
  8. django_pfx-1.4.dev38/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  9. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/.gitignore +0 -0
  10. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/.gitlab-ci.yml +0 -0
  11. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/.pre-commit-config.yaml +0 -0
  12. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/LICENSE +0 -0
  13. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/MANIFEST.in +0 -0
  14. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/README.md +0 -0
  15. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/django_pfx.egg-info/SOURCES.txt +0 -0
  16. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/django_pfx.egg-info/dependency_links.txt +0 -0
  17. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/django_pfx.egg-info/requires.txt +0 -0
  18. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/django_pfx.egg-info/top_level.txt +0 -0
  19. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/Makefile +0 -0
  20. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/conf.py +0 -0
  21. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/index.rst +0 -0
  22. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/source/api.views.rst +0 -0
  23. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/source/authentication.md +0 -0
  24. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/source/decorator.md +0 -0
  25. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/source/generate_openapi.md +0 -0
  26. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/source/getting_started.md +0 -0
  27. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/source/internationalisation.md +0 -0
  28. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/source/model.md +0 -0
  29. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/source/pfx_views.md +0 -0
  30. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/source/profiling.md +0 -0
  31. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/source/settings.md +0 -0
  32. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/doc/source/testing.md +0 -0
  33. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/img/pfx.png +0 -0
  34. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/img/pfx.svg +0 -0
  35. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/make_messages +0 -0
  36. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/manage.py +0 -0
  37. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/__init__.py +0 -0
  38. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/__init__.py +0 -0
  39. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/apidoc/__init__.py +0 -0
  40. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/apidoc/parameters.py +0 -0
  41. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/apidoc/schema.py +0 -0
  42. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/apidoc/tags.py +0 -0
  43. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/apps.py +0 -0
  44. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/decorator/__init__.py +0 -0
  45. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/decorator/rest.py +0 -0
  46. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/default_settings.py +0 -0
  47. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/exceptions.py +0 -0
  48. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/fields.py +0 -0
  49. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/http/__init__.py +0 -0
  50. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/http/json_response.py +0 -0
  51. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/management/__init__.py +0 -0
  52. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/management/commands/__init__.py +0 -0
  53. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  54. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/management/commands/profile.py +0 -0
  55. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/middleware/__init__.py +0 -0
  56. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/middleware/authentication.py +0 -0
  57. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/middleware/locale.py +0 -0
  58. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/middleware/profiling.py +0 -0
  59. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/migrations/0001_initial.py +0 -0
  60. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/migrations/__init__.py +0 -0
  61. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/models/__init__.py +0 -0
  62. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/models/abstract_pfx_base_user.py +0 -0
  63. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/models/cache_mixins.py +0 -0
  64. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/models/not_null_fields.py +0 -0
  65. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/models/otp_user_mixin.py +0 -0
  66. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/models/pfx_models.py +0 -0
  67. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/models/pfx_user.py +0 -0
  68. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  69. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/serializers/__init__.py +0 -0
  70. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/serializers/json.py +0 -0
  71. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/settings.py +0 -0
  72. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/shortcuts.py +0 -0
  73. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/storage/__init__.py +0 -0
  74. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/storage/s3_storage.py +0 -0
  75. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/templates/registration/otp_code_email.txt +0 -0
  76. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/templates/registration/otp_code_subject.txt +0 -0
  77. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  78. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  79. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  80. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  81. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/test.py +0 -0
  82. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/urls.py +0 -0
  83. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/__init__.py +0 -0
  84. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/fields.py +0 -0
  85. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/filters_views.py +0 -0
  86. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/locale_views.py +0 -0
  87. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  88. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  89. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/groups.py +0 -0
  90. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  91. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  92. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  93. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  94. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  95. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  96. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  97. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  98. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  99. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/subset.py +0 -0
  100. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  101. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  102. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  103. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  104. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  105. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/pfxcore/views/rest_views.py +0 -0
  106. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/settings/__init__.py +0 -0
  107. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pfx/settings/dev.py +0 -0
  108. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/pyproject.toml +0 -0
  109. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/requirements.txt +0 -0
  110. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/serve-doc +0 -0
  111. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/setup.cfg +0 -0
  112. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/setup.py +0 -0
  113. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/__init__.py +0 -0
  114. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  115. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/models.py +0 -0
  116. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/settings/__init__.py +0 -0
  117. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/settings/ci.py +0 -0
  118. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/settings/common.py +0 -0
  119. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/settings/dev.py +0 -0
  120. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/settings/dev_custom_example.py +0 -0
  121. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/settings/dev_default.py +0 -0
  122. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/__init__.py +0 -0
  123. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/basic_api_errors.py +0 -0
  124. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/basic_api_test.py +0 -0
  125. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_api_doc.py +0 -0
  126. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_body_mixin.py +0 -0
  127. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_cache.py +0 -0
  128. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_client.py +0 -0
  129. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_fields.py +0 -0
  130. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_filters.py +0 -0
  131. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_locale_api.py +0 -0
  132. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_perm_tests.py +0 -0
  133. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_perms_api.py +0 -0
  134. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_profiling_middleware.py +0 -0
  135. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_settings.py +0 -0
  136. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_shortcuts.py +0 -0
  137. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_timezone_middleware.py +0 -0
  138. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_tools.py +0 -0
  139. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_user_queryset.py +0 -0
  140. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_view_decorators.py +0 -0
  141. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/tests/test_view_fields.py +0 -0
  142. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/urls.py +0 -0
  143. {django_pfx-1.4.dev38 → django_pfx-1.4.dev42}/tests/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-pfx
3
- Version: 1.4.dev38
3
+ Version: 1.4.dev42
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.1
2
2
  Name: django-pfx
3
- Version: 1.4.dev38
3
+ Version: 1.4.dev42
4
4
  Summary: Django PFX is a toolkit designed to streamline the development of RESTful APIs using the Django framework.
5
5
  Author: Hervé Martinet
6
6
  Author-email: herve.martinet@gmail.com
@@ -7,7 +7,7 @@ msgid ""
7
7
  msgstr ""
8
8
  "Project-Id-Version: \n"
9
9
  "Report-Msgid-Bugs-To: \n"
10
- "POT-Creation-Date: 2024-04-18 14:37+0200\n"
10
+ "POT-Creation-Date: 2024-04-22 11:49+0200\n"
11
11
  "PO-Revision-Date: 2021-06-22 23:31+0200\n"
12
12
  "Last-Translator: \n"
13
13
  "Language-Team: \n"
@@ -59,23 +59,23 @@ msgstr ""
59
59
  "Format non valide, il peut s’agir d’un nombre en heures, « 1:05 », « :05 », "
60
60
  "« 1h 5m », « 1.5h » ou « 30m »."
61
61
 
62
- #: models/login_ban.py:43
62
+ #: models/login_ban.py:45
63
63
  msgid "Username"
64
64
  msgstr "Nom d’utilisateur"
65
65
 
66
- #: models/login_ban.py:44
66
+ #: models/login_ban.py:46
67
67
  msgid "Failed counter"
68
68
  msgstr "Compteur d’échec"
69
69
 
70
- #: models/login_ban.py:45
70
+ #: models/login_ban.py:47
71
71
  msgid "Last failed"
72
72
  msgstr "Dernier échec"
73
73
 
74
- #: models/login_ban.py:50
74
+ #: models/login_ban.py:52
75
75
  msgid "Login ban"
76
76
  msgstr "Login banni"
77
77
 
78
- #: models/login_ban.py:51
78
+ #: models/login_ban.py:53
79
79
  msgid "Login bans"
80
80
  msgstr "Login bannis"
81
81
 
@@ -230,8 +230,8 @@ msgid "OTP is already enabled"
230
230
  msgstr "OTP est déjà activé"
231
231
 
232
232
  #: views/authentication_views.py:490 views/authentication_views.py:524
233
- msgid "Invalid OTP code"
234
- msgstr "Code OTP invalide"
233
+ msgid "Invalid code"
234
+ msgstr "Code invalide"
235
235
 
236
236
  #: views/authentication_views.py:523
237
237
  msgid "OTP disabled"
@@ -17,7 +17,9 @@ class LoginBanQuerySet(models.QuerySet):
17
17
  return False
18
18
  if ban.failed_counter % settings.PFX_LOGIN_BAN_FAILED_NUMBER == 0:
19
19
  seconds = settings.PFX_LOGIN_BAN_SECONDS_START + (
20
- settings.PFX_LOGIN_BAN_SECONDS_STEP * (ban.failed_counter - 1))
20
+ settings.PFX_LOGIN_BAN_SECONDS_STEP * (
21
+ ban.failed_counter //
22
+ settings.PFX_LOGIN_BAN_FAILED_NUMBER - 1))
21
23
  ban_time = ban.last_failed + timedelta(seconds=seconds)
22
24
  now = timezone.now()
23
25
  if now < ban_time:
@@ -487,7 +487,7 @@ class AuthenticationView(
487
487
  data = self.deserialize_body()
488
488
  if self.request.user.confirm_otp(data.get('otp_code')):
489
489
  return JsonResponse(dict(message=_("OTP enabled")))
490
- return JsonResponse(dict(message=_("Invalid OTP code")), status=422)
490
+ return JsonResponse(dict(otp_code=[_("Invalid code")]), status=422)
491
491
 
492
492
  @method_decorator(never_cache)
493
493
  @rest_api("/otp/disable", public=False, method="put", priority_doc=54)
@@ -521,7 +521,7 @@ class AuthenticationView(
521
521
  if self.request.user.is_otp_valid(data.get('otp_code')):
522
522
  self.request.user.disable_otp()
523
523
  return JsonResponse(dict(message=_("OTP disabled")))
524
- return JsonResponse(dict(message=_("Invalid OTP code")), status=422)
524
+ return JsonResponse(dict(otp_code=[_("Invalid code")]), status=422)
525
525
 
526
526
  @method_decorator(never_cache)
527
527
  @rest_api(
@@ -88,7 +88,7 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
88
88
 
89
89
  @override_settings(
90
90
  PFX_TOKEN_SHORT_VALIDITY={'minutes': 30},
91
- PFX_LOGIN_BAN_FAILED_NUMBER=1,
91
+ PFX_LOGIN_BAN_FAILED_NUMBER=2,
92
92
  PFX_LOGIN_BAN_SECONDS_START=30,
93
93
  PFX_LOGIN_BAN_SECONDS_STEP=60)
94
94
  def test_login_ban(self):
@@ -98,6 +98,11 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
98
98
  'username': 'jrr.tolkien',
99
99
  'password': 'BAD PASSWORD'})
100
100
  self.assertRC(response, 422)
101
+ response = self.client.post(
102
+ '/api/auth/login', {
103
+ 'username': 'jrr.tolkien',
104
+ 'password': 'BAD PASSWORD'})
105
+ self.assertRC(response, 422)
101
106
 
102
107
  response = self.client.post(
103
108
  '/api/auth/login', {
@@ -128,6 +133,11 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
128
133
  'username': 'jrr.tolkien',
129
134
  'password': 'BAD PASSWORD'})
130
135
  self.assertRC(response, 422)
136
+ response = self.client.post(
137
+ '/api/auth/login', {
138
+ 'username': 'jrr.tolkien',
139
+ 'password': 'BAD PASSWORD'})
140
+ self.assertRC(response, 422)
131
141
 
132
142
  response = self.client.post(
133
143
  '/api/auth/login', {
@@ -921,7 +931,7 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
921
931
  response = self.client.put('/api/auth/otp/enable', dict(
922
932
  otp_code='-'))
923
933
  self.assertRC(response, 422)
924
- self.assertJE(response, 'message', "Invalid OTP code")
934
+ self.assertJE(response, 'otp_code.@0', "Invalid code")
925
935
  self.user1.refresh_from_db()
926
936
  self.assertIsNone(self.user1.otp_secret_token)
927
937
  self.assertEqual(len(self.user1.otp_secret_token_tmp), 32)
@@ -983,7 +993,7 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
983
993
  response = self.client.put('/api/auth/otp/disable', dict(
984
994
  otp_code='-'))
985
995
  self.assertRC(response, 422)
986
- self.assertJE(response, 'message', "Invalid OTP code")
996
+ self.assertJE(response, 'otp_code.@0', "Invalid code")
987
997
  self.user1.refresh_from_db()
988
998
  self.assertEqual(len(self.user1.otp_secret_token), 32)
989
999
  self.assertIsNone(self.user1.otp_secret_token_tmp)
@@ -1072,7 +1082,7 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
1072
1082
 
1073
1083
  @override_settings(
1074
1084
  PFX_TOKEN_SHORT_VALIDITY={'minutes': 30},
1075
- PFX_LOGIN_BAN_FAILED_NUMBER=1,
1085
+ PFX_LOGIN_BAN_FAILED_NUMBER=2,
1076
1086
  PFX_LOGIN_BAN_SECONDS_START=30,
1077
1087
  PFX_LOGIN_BAN_SECONDS_STEP=60)
1078
1088
  def test_otp_login_ban(self):
@@ -1085,6 +1095,9 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
1085
1095
  self.assertRC(response, 200)
1086
1096
  token = self.get_val(response, 'token')
1087
1097
 
1098
+ response = self.client.post('/api/auth/otp/login', dict(
1099
+ token=token, otp_code='-'))
1100
+ self.assertRC(response, 422)
1088
1101
  response = self.client.post('/api/auth/otp/login', dict(
1089
1102
  token=token, otp_code='-'))
1090
1103
  self.assertRC(response, 422)
@@ -1112,6 +1125,9 @@ class AuthAPITest(TestAssertMixin, TransactionTestCase):
1112
1125
  response = self.client.post('/api/auth/otp/login', dict(
1113
1126
  token=token, otp_code='-'))
1114
1127
  self.assertRC(response, 422)
1128
+ response = self.client.post('/api/auth/otp/login', dict(
1129
+ token=token, otp_code='-'))
1130
+ self.assertRC(response, 422)
1115
1131
 
1116
1132
  response = self.client.post('/api/auth/otp/login', dict(
1117
1133
  token=token, otp_code='-'))
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes