12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- from __future__ import unicode_literals
- from django.contrib.auth import get_user_model
- from django.contrib.auth.backends import ModelBackend
- from django.contrib.auth.tokens import default_token_generator
- from django.db.models import Q
- from django.utils.http import base36_to_int
- User = get_user_model()
- class MezzanineBackend(ModelBackend):
- """
- Extends Django's ``ModelBackend`` to allow login via username,
- email, or verification token.
- Args are either ``username`` and ``password``, or ``uidb36``
- and ``token``. In either case, ``is_active`` can also be given.
- For login, is_active is not given, so that the login form can
- raise a specific error for inactive users.
- For password reset, True is given for is_active.
- For signup verficiation, False is given for is_active.
- """
- def authenticate(self, **kwargs):
- if kwargs:
- username = kwargs.pop("username", None)
- if username:
- username_or_email = Q(username=username) | Q(email=username)
- password = kwargs.pop("password", None)
- try:
- user = User.objects.get(username_or_email, **kwargs)
- except User.DoesNotExist:
- pass
- else:
- if user.check_password(password):
- return user
- else:
- if 'uidb36' not in kwargs:
- return
- kwargs["id"] = base36_to_int(kwargs.pop("uidb36"))
- token = kwargs.pop("token")
- try:
- user = User.objects.get(**kwargs)
- except User.DoesNotExist:
- pass
- else:
- if default_token_generator.check_token(user, token):
- return user
|