Last active
August 17, 2023 18:39
-
-
Save abd1rahmane/c75f7c1f8d6c1f81c0e220730a31c9d2 to your computer and use it in GitHub Desktop.
dj_rest_auth custom adapter for all most cases
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import warnings | |
from django.conf import settings | |
from django.template.loader import render_to_string | |
from django.template import TemplateDoesNotExist | |
from django.contrib.sites.models import Site | |
from django.core.mail import EmailMultiAlternatives, EmailMessage | |
from django.utils.translation import ugettext_lazy as _ | |
from django import forms | |
try: | |
from django.utils.encoding import force_text | |
except ImportError: | |
from django.utils.encoding import force_unicode as force_text | |
from ..utils import (import_attribute, get_user_model, | |
generate_unique_username, | |
resolve_url) | |
from . import app_settings | |
class DefaultAccountAdapter(object): | |
def stash_verified_email(self, request, email): | |
request.session['account_verified_email'] = email | |
def unstash_verified_email(self, request): | |
ret = request.session.get('account_verified_email') | |
request.session['account_verified_email'] = None | |
return ret | |
def is_email_verified(self, request, email): | |
""" | |
Checks whether or not the email address is already verified | |
beyond allauth scope, for example, by having accepted an | |
invitation before signing up. | |
""" | |
ret = False | |
verified_email = request.session.get('account_verified_email') | |
if verified_email: | |
ret = verified_email.lower() == email.lower() | |
return ret | |
def format_email_subject(self, subject): | |
prefix = app_settings.EMAIL_SUBJECT_PREFIX | |
if prefix is None: | |
site = Site.objects.get_current() | |
prefix = u"[{name}] ".format(name=site.name) | |
return prefix + force_text(subject) | |
def send_mail(self, template_prefix, email, context): | |
""" | |
Sends an e-mail to `email`. `template_prefix` identifies the | |
e-mail that is to be sent, e.g. "account/email/email_confirmation" | |
""" | |
subject = render_to_string('{0}_subject.txt'.format(template_prefix), | |
context) | |
# remove superfluous line breaks | |
subject = " ".join(subject.splitlines()).strip() | |
subject = self.format_email_subject(subject) | |
bodies = {} | |
for ext in ['html', 'txt']: | |
try: | |
template_name = '{0}_message.{1}'.format(template_prefix, ext) | |
bodies[ext] = render_to_string(template_name, | |
context).strip() | |
except TemplateDoesNotExist: | |
if ext == 'txt' and not bodies: | |
# We need at least one body | |
raise | |
if 'txt' in bodies: | |
msg = EmailMultiAlternatives(subject, | |
bodies['txt'], | |
settings.DEFAULT_FROM_EMAIL, | |
[email]) | |
if 'html' in bodies: | |
msg.attach_alternative(bodies['html'], 'text/html') | |
else: | |
msg = EmailMessage(subject, | |
bodies['html'], | |
settings.DEFAULT_FROM_EMAIL, | |
[email]) | |
msg.content_subtype = 'html' # Main content is now text/html | |
msg.send() | |
def get_login_redirect_url(self, request): | |
""" | |
Returns the default URL to redirect to after logging in. Note | |
that URLs passed explicitly (e.g. by passing along a `next` | |
GET parameter) take precedence over the value returned here. | |
""" | |
assert request.user.is_authenticated() | |
url = getattr(settings, "LOGIN_REDIRECT_URLNAME", None) | |
if url: | |
warnings.warn("LOGIN_REDIRECT_URLNAME is deprecated, simply" | |
" use LOGIN_REDIRECT_URL with a URL name", | |
DeprecationWarning) | |
else: | |
url = settings.LOGIN_REDIRECT_URL | |
return resolve_url(url) | |
def get_logout_redirect_url(self, request): | |
""" | |
Returns the URL to redriect to after the user logs out. Note that | |
this method is also invoked if you attempt to log out while no users | |
is logged in. Therefore, request.user is not guaranteed to be an | |
authenticated user. | |
""" | |
return resolve_url(app_settings.LOGOUT_REDIRECT_URL) | |
def get_email_confirmation_redirect_url(self, request): | |
""" | |
The URL to return to after successful e-mail confirmation. | |
""" | |
if request.user.is_authenticated(): | |
if app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL: | |
return \ | |
app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL | |
else: | |
return self.get_login_redirect_url(request) | |
else: | |
return app_settings.EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL | |
def is_open_for_signup(self, request): | |
""" | |
Checks whether or not the site is open for signups. | |
Next to simply returning True/False you can also intervene the | |
regular flow by raising an ImmediateHttpResponse | |
""" | |
return True | |
def new_user(self, | |
username=None, | |
first_name=None, | |
last_name=None, | |
email=None): | |
""" | |
Spawns a new User instance, populating several common fields. | |
Note that this method assumes that the data is properly | |
validated. For example, if a username is given it must be | |
unique. | |
""" | |
from .utils import user_username, user_email | |
user = get_user_model()() | |
if app_settings.USER_MODEL_USERNAME_FIELD: | |
user_username(user, | |
username or generate_unique_username(first_name or | |
last_name or email)) | |
user_email(user, email) | |
user.first_name = first_name | |
user.last_name = last_name | |
return user | |
def clean_username(self, username): | |
""" | |
Validates the username. You can hook into this if you want to | |
(dynamically) restrict what usernames can be chosen. | |
""" | |
from django.contrib.auth.forms import UserCreationForm | |
USERNAME_REGEX = UserCreationForm().fields['username'].regex | |
if not USERNAME_REGEX.match(username): | |
raise forms.ValidationError(_("Usernames can only contain " | |
"letters, digits and @/./+/-/_.")) | |
# TODO: Add regexp support to USERNAME_BLACKLIST | |
if username in app_settings.USERNAME_BLACKLIST: | |
raise forms.ValidationError(_("Username can not be used. " | |
"Please use other username.")) | |
return username | |
def clean_email(self, email): | |
""" | |
Validates an email value. You can hook into this if you want to | |
(dynamically) restrict what email addresses can be chosen. | |
""" | |
return email | |
def get_adapter(): | |
return import_attribute(app_settings.ADAPTER)() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment