authmixin.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from django.contrib.auth import authenticate, get_user_model
  2. from django.core.exceptions import ValidationError
  3. from django.utils.translation import ugettext_lazy, ugettext as _
  4. from misago.core.exceptions import Banned
  5. from misago.users.bans import get_user_ban
  6. UserModel = get_user_model()
  7. class AuthMixin(object):
  8. """
  9. Mixin with utils for Auth forms and serializers
  10. """
  11. auth_messages = {
  12. 'empty_data': ugettext_lazy("Fill out both fields."),
  13. 'invalid_login': ugettext_lazy("Login or password is incorrect."),
  14. 'inactive_user': ugettext_lazy("You have to activate your account before you will be able to sign in."),
  15. 'inactive_admin': ugettext_lazy(
  16. "Your account has to be activated by Administrator before you will be able to sign in."
  17. ),
  18. }
  19. def authenticate(self, username, password):
  20. if username and password:
  21. user = authenticate(username=username, password=password)
  22. if user is None or not user.is_active:
  23. self.raise_for_code('invalid_login')
  24. else:
  25. self.raise_for_code('empty_data')
  26. return user
  27. def get_user_by_email(self, email):
  28. if not email:
  29. return None
  30. try:
  31. user = UserModel.objects.get_by_email(email)
  32. if not user.is_active:
  33. raise UserModel.DoesNotExist()
  34. return user
  35. except UserModel.DoesNotExist:
  36. raise ValidationError(_("No user with this e-mail exists."))
  37. def confirm_login_allowed(self, user):
  38. self.confirm_user_active(user)
  39. self.confirm_user_not_banned(user)
  40. def confirm_user_active(self, user):
  41. if user.requires_activation_by_admin:
  42. self.raise_for_code('inactive_admin')
  43. if user.requires_activation_by_user:
  44. self.raise_for_code('inactive_user')
  45. def confirm_user_not_banned(self, user):
  46. ban = self.get_user_ban(user)
  47. if ban:
  48. raise Banned(ban=ban)
  49. def get_user_ban(self, user):
  50. if user.is_staff:
  51. return None
  52. return get_user_ban(user)
  53. def raise_if_banned(self):
  54. user = self.validated_data.get('user')
  55. self.confirm_user_not_banned(user)
  56. def raise_for_code(self, code):
  57. raise ValidationError(self.auth_messages[code], code=code)