aboutsummaryrefslogtreecommitdiff
path: root/saleor/registration
diff options
context:
space:
mode:
authorArtur Smęt <artur.smet@mirumee.com>2016-11-16 14:18:22 +0100
committerArtur Smęt <artur.smet@mirumee.com>2016-11-16 14:18:43 +0100
commitf753d147234cc671358dcd26b2e0f643ea490d6d (patch)
tree219f7a543c110a082292b3a2bd002684e72f208f /saleor/registration
parent3beac2881c14c898492f30e711e075971b1a91fa (diff)
downloadsaleor-frontend-f753d147234cc671358dcd26b2e0f643ea490d6d.tar.gz
saleor-frontend-f753d147234cc671358dcd26b2e0f643ea490d6d.tar.bz2
saleor-frontend-f753d147234cc671358dcd26b2e0f643ea490d6d.zip
Drop old registration app
Diffstat (limited to 'saleor/registration')
-rw-r--r--saleor/registration/__init__.py0
-rw-r--r--saleor/registration/backends.py49
-rw-r--r--saleor/registration/forms.py118
-rw-r--r--saleor/registration/migrations/0001_initial.py54
-rw-r--r--saleor/registration/migrations/0001_squashed_0002_auto_20151203_1158.py56
-rw-r--r--saleor/registration/migrations/0002_auto_20151203_1158.py24
-rw-r--r--saleor/registration/migrations/__init__.py0
-rw-r--r--saleor/registration/models.py72
-rw-r--r--saleor/registration/urls.py21
-rw-r--r--saleor/registration/utils.py208
-rw-r--r--saleor/registration/views.py153
11 files changed, 0 insertions, 755 deletions
diff --git a/saleor/registration/__init__.py b/saleor/registration/__init__.py
deleted file mode 100644
index e69de29b..00000000
--- a/saleor/registration/__init__.py
+++ /dev/null
diff --git a/saleor/registration/backends.py b/saleor/registration/backends.py
deleted file mode 100644
index 456def0f..00000000
--- a/saleor/registration/backends.py
+++ /dev/null
@@ -1,49 +0,0 @@
-from django.contrib.auth import get_user_model
-from django.contrib.auth.backends import ModelBackend
-
-from .models import ExternalUserData
-
-User = get_user_model()
-
-
-class Backend(ModelBackend):
-
- def get_user(self, user_id):
- try:
- return User.objects.get(pk=user_id)
- except User.DoesNotExist:
- return None
-
-
-class EmailPasswordBackend(Backend):
- """Authentication backend that expects an email in username parameter."""
-
- def authenticate(self, username=None, password=None, **_kwargs):
- try:
- user = User.objects.get(email=username)
- except User.DoesNotExist:
- return None
- if user.check_password(password):
- return user
-
-
-class ExternalLoginBackend(Backend):
- """Authenticate with external service id."""
-
- def authenticate(self, service=None, username=None, **_kwargs):
- try:
- user_data = (ExternalUserData.objects
- .select_related('user')
- .get(service=service,
- username=username))
- return user_data.user
- except ExternalUserData.DoesNotExist:
- return None
-
-
-class TrivialBackend(Backend):
- """Authenticate with user instance."""
-
- def authenticate(self, user=None, **_kwargs):
- if isinstance(user, User):
- return user
diff --git a/saleor/registration/forms.py b/saleor/registration/forms.py
deleted file mode 100644
index 539eaeef..00000000
--- a/saleor/registration/forms.py
+++ /dev/null
@@ -1,118 +0,0 @@
-from __future__ import unicode_literals
-
-import emailit.api
-from django import forms
-from django.contrib.auth import authenticate, get_user_model
-from django.contrib.auth.forms import AuthenticationForm, SetPasswordForm
-from django.utils.translation import pgettext_lazy, ugettext
-
-from .models import (EmailChangeRequest, EmailConfirmationRequest,
- ExternalUserData)
-from .utils import get_client_class_for_service
-
-User = get_user_model()
-
-
-class LoginForm(AuthenticationForm):
-
- username = forms.EmailField(label=pgettext_lazy('Form field', 'Email'),
- max_length=75)
-
- def __init__(self, request=None, *args, **kwargs):
- super(LoginForm, self).__init__(request=request, *args, **kwargs)
- if request:
- email = request.GET.get('email')
- if email:
- self.fields['username'].initial = email
-
-
-class SetOrRemovePasswordForm(SetPasswordForm):
-
- def __init__(self, *args, **kwargs):
- super(SetOrRemovePasswordForm, self).__init__(*args, **kwargs)
- if 'new_password1' not in self.data.keys():
- self.fields['new_password1'].required = False
- self.fields['new_password2'].required = False
-
- def save(self, commit=True):
- if self.cleaned_data.get('new_password1'):
- return super(SetOrRemovePasswordForm, self).save(commit)
- else:
- self.user.set_unusable_password()
- return self.user
-
-
-class RequestEmailConfirmationForm(forms.Form):
-
- email = forms.EmailField()
-
- template = 'registration/emails/confirm_email'
-
- def __init__(self, local_host=None, data=None):
- self.local_host = local_host
- super(RequestEmailConfirmationForm, self).__init__(data)
-
- def send(self):
- email = self.cleaned_data['email']
- request = self.create_request_instance()
- confirmation_url = self.local_host + request.get_confirmation_url()
- context = {'confirmation_url': confirmation_url}
- emailit.api.send_mail(email, context, self.template)
-
- def create_request_instance(self):
- email = self.cleaned_data['email']
- EmailConfirmationRequest.objects.filter(email=email).delete()
- return EmailConfirmationRequest.objects.create(
- email=self.cleaned_data['email'])
-
-
-class RequestEmailChangeForm(RequestEmailConfirmationForm):
-
- template = 'registration/emails/change_email'
-
- def __init__(self, user=None, *args, **kwargs):
- self.user = user
- super(RequestEmailChangeForm, self).__init__(*args, **kwargs)
-
- def clean_email(self):
- email = self.cleaned_data['email']
- if User.objects.filter(email=email).exists():
- raise forms.ValidationError(
- ugettext('Account with this email already exists'))
- return self.cleaned_data['email']
-
- def create_request_instance(self):
- EmailChangeRequest.objects.filter(user=self.user).delete()
- return EmailChangeRequest.objects.create(
- email=self.cleaned_data['email'], user=self.user)
-
-
-class OAuth2CallbackForm(forms.Form):
-
- code = forms.CharField()
- error_code = forms.CharField(required=False)
- error_message = forms.CharField(required=False)
-
- def __init__(self, service, local_host, data):
- self.service = service
- self.local_host = local_host
- super(OAuth2CallbackForm, self).__init__(data)
-
- def clean_error_message(self):
- error_message = self.cleaned_data.get('error_message')
- if error_message:
- raise forms.ValidationError(error_message)
-
- def get_authenticated_user(self):
- code = self.cleaned_data.get('code')
- client_class = get_client_class_for_service(self.service)
- client = client_class(local_host=self.local_host, code=code)
- user_info = client.get_user_info()
- user = authenticate(service=self.service, username=user_info['id'])
- if not user:
- user, _ = User.objects.get_or_create(
- email=user_info['email'])
- ExternalUserData.objects.create(
- service=self.service, username=user_info['id'], user=user)
- user = authenticate(user=user)
- return user
diff --git a/saleor/registration/migrations/0001_initial.py b/saleor/registration/migrations/0001_initial.py
deleted file mode 100644
index ddd59f98..00000000
--- a/saleor/registration/migrations/0001_initial.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import unicode_literals
-
-from django.db import models, migrations
-from django.conf import settings
-import saleor.registration.models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
- ]
-
- operations = [
- migrations.CreateModel(
- name='EmailChangeRequest',
- fields=[
- ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
- ('token', models.CharField(unique=True, max_length=36)),
- ('valid_until', models.DateTimeField(default=saleor.registration.models.default_valid_date)),
- ('email', models.EmailField(max_length=254)),
- ('user', models.ForeignKey(related_name='email_change_requests', to=settings.AUTH_USER_MODEL)),
- ],
- options={
- 'abstract': False,
- },
- ),
- migrations.CreateModel(
- name='EmailConfirmationRequest',
- fields=[
- ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
- ('token', models.CharField(unique=True, max_length=36)),
- ('valid_until', models.DateTimeField(default=saleor.registration.models.default_valid_date)),
- ('email', models.EmailField(max_length=254)),
- ],
- options={
- 'abstract': False,
- },
- ),
- migrations.CreateModel(
- name='ExternalUserData',
- fields=[
- ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
- ('service', models.TextField(db_index=True)),
- ('username', models.TextField(db_index=True)),
- ('user', models.ForeignKey(related_name='external_ids', to=settings.AUTH_USER_MODEL)),
- ],
- ),
- migrations.AlterUniqueTogether(
- name='externaluserdata',
- unique_together=set([('service', 'username')]),
- ),
- ]
diff --git a/saleor/registration/migrations/0001_squashed_0002_auto_20151203_1158.py b/saleor/registration/migrations/0001_squashed_0002_auto_20151203_1158.py
deleted file mode 100644
index 06fe3acb..00000000
--- a/saleor/registration/migrations/0001_squashed_0002_auto_20151203_1158.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import unicode_literals
-
-from django.db import migrations, models
-from django.conf import settings
-import saleor.registration.models
-
-
-class Migration(migrations.Migration):
-
- replaces = [('registration', '0001_initial'), ('registration', '0002_auto_20151203_1158')]
-
- dependencies = [
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
- ]
-
- operations = [
- migrations.CreateModel(
- name='EmailChangeRequest',
- fields=[
- ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
- ('token', models.CharField(unique=True, max_length=36)),
- ('valid_until', models.DateTimeField(default=saleor.registration.models.default_valid_date)),
- ('email', models.EmailField(max_length=254)),
- ('user', models.ForeignKey(related_name='email_change_requests', to=settings.AUTH_USER_MODEL)),
- ],
- options={
- 'abstract': False,
- },
- ),
- migrations.CreateModel(
- name='EmailConfirmationRequest',
- fields=[
- ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
- ('token', models.CharField(unique=True, max_length=36)),
- ('valid_until', models.DateTimeField(default=saleor.registration.models.default_valid_date)),
- ('email', models.EmailField(max_length=254)),
- ],
- options={
- 'abstract': False,
- },
- ),
- migrations.CreateModel(
- name='ExternalUserData',
- fields=[
- ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
- ('service', models.CharField(max_length=255, db_index=True)),
- ('username', models.CharField(max_length=255, db_index=True)),
- ('user', models.ForeignKey(related_name='external_ids', to=settings.AUTH_USER_MODEL)),
- ],
- ),
- migrations.AlterUniqueTogether(
- name='externaluserdata',
- unique_together=set([('service', 'username')]),
- ),
- ]
diff --git a/saleor/registration/migrations/0002_auto_20151203_1158.py b/saleor/registration/migrations/0002_auto_20151203_1158.py
deleted file mode 100644
index 29c4d91f..00000000
--- a/saleor/registration/migrations/0002_auto_20151203_1158.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# -*- coding: utf-8 -*-
-from __future__ import unicode_literals
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('registration', '0001_initial'),
- ]
-
- operations = [
- migrations.AlterField(
- model_name='externaluserdata',
- name='service',
- field=models.CharField(max_length=255, db_index=True),
- ),
- migrations.AlterField(
- model_name='externaluserdata',
- name='username',
- field=models.CharField(max_length=255, db_index=True),
- ),
- ]
diff --git a/saleor/registration/migrations/__init__.py b/saleor/registration/migrations/__init__.py
deleted file mode 100644
index e69de29b..00000000
--- a/saleor/registration/migrations/__init__.py
+++ /dev/null
diff --git a/saleor/registration/models.py b/saleor/registration/models.py
deleted file mode 100644
index f8cedc1e..00000000
--- a/saleor/registration/models.py
+++ /dev/null
@@ -1,72 +0,0 @@
-from __future__ import unicode_literals
-from datetime import timedelta
-from uuid import uuid4
-
-from django.db import models
-from django.contrib.auth import authenticate, get_user_model
-from django.conf import settings
-from django.core.urlresolvers import reverse
-from django.utils import timezone
-
-now = timezone.now
-
-
-def default_valid_date():
- return now() + timedelta(settings.ACCOUNT_ACTIVATION_DAYS)
-
-
-class ExternalUserData(models.Model):
- user = models.ForeignKey(
- settings.AUTH_USER_MODEL, related_name='external_ids')
- service = models.CharField(db_index=True, max_length=255)
- username = models.CharField(db_index=True, max_length=255)
-
- class Meta:
- unique_together = [['service', 'username']]
-
-
-class UniqueTokenManager(models.Manager): # this might end up in `utils`
- def __init__(self, token_field):
- self.token_field = token_field
- super(UniqueTokenManager, self).__init__()
-
- def create(self, **kwargs):
- assert self.token_field not in kwargs, 'Token field already filled.'
- kwargs[self.token_field] = str(uuid4())
- return super(UniqueTokenManager, self).create(**kwargs)
-
-
-class AbstractToken(models.Model):
- token = models.CharField(max_length=36, unique=True)
- valid_until = models.DateTimeField(default=default_valid_date)
-
- objects = UniqueTokenManager(token_field='token')
-
- class Meta:
- abstract = True
-
-
-class EmailConfirmationRequest(AbstractToken):
- email = models.EmailField()
-
- def get_authenticated_user(self):
- user, dummy_created = get_user_model().objects.get_or_create(
- email=self.email, defaults={'is_active': True})
- if not user.is_active:
- # you shouldn't be able to log in if your account is disabled
- return
- return authenticate(user=user)
-
- def get_confirmation_url(self):
- return reverse('registration:confirm_email',
- kwargs={'token': self.token})
-
-
-class EmailChangeRequest(AbstractToken):
- user = models.ForeignKey(
- settings.AUTH_USER_MODEL, related_name='email_change_requests')
- email = models.EmailField() # email address that user is switching to
-
- def get_confirmation_url(self):
- return reverse('registration:change_email',
- kwargs={'token': self.token})
diff --git a/saleor/registration/urls.py b/saleor/registration/urls.py
deleted file mode 100644
index 03484098..00000000
--- a/saleor/registration/urls.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from django.conf.urls import url
-
-from ..core import TOKEN_PATTERN
-from . import views
-
-
-urlpatterns = [
- url(r'^login/$', views.login, name='login'),
- url(r'^logout/$', views.logout, name='logout'),
- url(r'^oauth_callback/(?P<service>\w+)/$', views.oauth_callback,
- name='oauth_callback'),
- url(r'^change_password/$', views.change_password,
- name='change_password'),
- url(r'^request_email_confirmation/$', views.request_email_confirmation,
- name='request_email_confirmation'),
- url(r'^confirm_email/%s/$' % (TOKEN_PATTERN,), views.confirm_email,
- name='confirm_email'),
- url(r'^request_email_change/$', views.request_email_change,
- name='request_email_change'),
- url(r'^change_email/%s/$' % (TOKEN_PATTERN,), views.change_email,
- name='change_email')]
diff --git a/saleor/registration/utils.py b/saleor/registration/utils.py
deleted file mode 100644
index 8e9bc17b..00000000
--- a/saleor/registration/utils.py
+++ /dev/null
@@ -1,208 +0,0 @@
-import hashlib
-import hmac
-import logging
-try:
- from urllib.parse import parse_qs, urlencode, urljoin, urlunparse
-except ImportError:
- from urllib import urlencode
- from urlparse import parse_qs, urljoin, urlunparse
-
-from django.core.urlresolvers import reverse
-from django.conf import settings
-import requests
-
-
-GOOGLE, FACEBOOK = 'google', 'facebook'
-JSON_MIME_TYPE = 'application/json'
-logger = logging.getLogger('saleor.registration')
-
-
-def get_local_host(request):
- scheme = 'http' + ('s' if request.is_secure() else '')
- return url(scheme=scheme, host=request.get_host())
-
-
-def url(scheme='', host='', path='', params='', query='', fragment=''):
- return urlunparse((scheme, host, path, params, query, fragment))
-
-
-def get_client_class_for_service(service):
- return {GOOGLE: GoogleClient, FACEBOOK: FacebookClient}[service]
-
-
-def get_google_login_url(local_host):
- if settings.GOOGLE_CLIENT_ID:
- client_class = get_client_class_for_service(GOOGLE)(local_host)
- return client_class.get_login_uri()
-
-
-def get_facebook_login_url(local_host):
- if settings.FACEBOOK_APP_ID:
- client_class = get_client_class_for_service(FACEBOOK)(local_host)
- return client_class.get_login_uri()
-
-
-def parse_response(response):
- if JSON_MIME_TYPE in response.headers['Content-Type']:
- return response.json()
- else:
- content = parse_qs(response.text)
- content = dict((x, y[0] if len(y) == 1 else y)
- for x, y in content.items())
- return content
-
-
-class OAuth2RequestAuthorizer(requests.auth.AuthBase):
-
- def __init__(self, access_token):
- self.access_token = access_token
-
- def __call__(self, request):
- request.headers['Authorization'] = 'Bearer %s' % (self.access_token,)
- return request
-
-
-class OAuth2Client(object):
-
- service = None
-
- client_id = None
- client_secret = None
-
- auth_uri = None
- token_uri = None
- user_info_uri = None
-
- scope = None
-
- def __init__(self, local_host, code=None,
- client_id=None, client_secret=None):
- self.local_host = local_host
-
- if client_id and client_secret:
- self.client_id = client_id
- self.client_secret = client_secret
-
- if code:
- access_token = self.get_access_token(code)
- self.authorizer = OAuth2RequestAuthorizer(
- access_token=access_token)
- else:
- self.authorizer = None
-
- def get_redirect_uri(self):
- kwargs = {'service': self.service}
- path = reverse('registration:oauth_callback', kwargs=kwargs)
- return urljoin(self.local_host, path)
-
- def get_login_uri(self):
- data = {'response_type': 'code',
- 'scope': self.scope,
- 'redirect_uri': self.get_redirect_uri(),
- 'client_id': self.client_id}
- query = urlencode(data)
- return urljoin(self.auth_uri, url(query=query))
-
- def get_access_token(self, code):
- data = {'grant_type': 'authorization_code',
- 'client_id': self.client_id,
- 'client_secret': self.client_secret,
- 'code': code,
- 'redirect_uri': self.get_redirect_uri(),
- 'scope': self.scope}
- response = self.post(self.token_uri, data=data, authorize=False)
- return response['access_token']
-
- def get_user_info(self):
- return self.get(self.user_info_uri)
-
- def get_request_params(self, data=None, authorize=True):
- auth = self.authorizer if authorize else None
- return data, auth
-
- def get(self, address, params=None, authorize=True):
- params, auth = self.get_request_params(params, authorize)
- response = requests.get(address, params=params, auth=auth)
- return self.handle_response(response)
-
- def post(self, address, data=None, authorize=True):
- data, auth = self.get_request_params(data, authorize)
- response = requests.post(address, data=data, auth=auth)
- return self.handle_response(response)
-
- def handle_response(self, response):
- response_content = parse_response(response)
- if response.status_code == requests.codes.ok:
- return response_content
- else:
- logger.error('[%s]: %s', response.status_code, response.text)
- error = self.extract_error_from_response(response_content)
- raise ValueError(error)
-
- def extract_error_from_response(self, response_content):
- raise NotImplementedError()
-
-
-class GoogleClient(OAuth2Client):
-
- service = GOOGLE
-
- auth_uri = 'https://accounts.google.com/o/oauth2/auth'
- token_uri = 'https://accounts.google.com/o/oauth2/token'
- user_info_uri = 'https://www.googleapis.com/oauth2/v1/userinfo'
-
- scope = ' '.join(['https://www.googleapis.com/auth/userinfo.email',
- 'https://www.googleapis.com/auth/plus.me'])
-
- def __init__(self, *args, **kwargs):
- if not self.client_id and not self.client_secret:
- self.client_id = settings.GOOGLE_CLIENT_ID
- self.client_secret = settings.GOOGLE_CLIENT_SECRET
- super(GoogleClient, self).__init__(*args, **kwargs)
-
- def get_user_info(self):
- response = super(GoogleClient, self).get_user_info()
- if response.get('verified_email'):
- return response
- else:
- raise ValueError('Google account not verified.')
-
- def extract_error_from_response(self, response_content):
- return response_content['error']
-
-
-class FacebookClient(OAuth2Client):
-
- service = FACEBOOK
-
- auth_uri = 'https://www.facebook.com/dialog/oauth'
- token_uri = 'https://graph.facebook.com/oauth/access_token'
- user_info_uri = 'https://graph.facebook.com/me?fields=name,email,verified'
-
- scope = ','.join(['email'])
-
- def __init__(self, *args, **kwargs):
- if not self.client_id and not self.client_secret:
- self.client_id = settings.FACEBOOK_APP_ID
- self.client_secret = settings.FACEBOOK_SECRET
- super(FacebookClient, self).__init__(*args, **kwargs)
-
- def get_request_params(self, data=None, authorize=True):
- data = data or {}
- if authorize:
- data.update({'appsecret_proof': hmac.new(
- settings.FACEBOOK_SECRET.encode('utf8'),
- msg=self.authorizer.access_token.encode('utf8'),
- digestmod=hashlib.sha256).hexdigest()})
- return super(FacebookClient, self).get_request_params(data, authorize)
-
- def get_user_info(self):
- response = super(FacebookClient, self).get_user_info()
- if not response.get('verified'):
- raise ValueError('Facebook account not verified.')
- if not response.get('email'):
- raise ValueError('Access to your email address is required.')
- return response
-
- def extract_error_from_response(self, response_content):
- return response_content['error']['message']
diff --git a/saleor/registration/views.py b/saleor/registration/views.py
deleted file mode 100644
index 5b97bab8..00000000
--- a/saleor/registration/views.py
+++ /dev/null
@@ -1,153 +0,0 @@
-try:
- from urllib.parse import urlencode
-except ImportError:
- from urllib import urlencode
-
-from django.conf import settings
-from django.contrib import messages
-from django.contrib.auth import login as auth_login, logout as auth_logout
-from django.contrib.auth.decorators import login_required
-from django.contrib.auth.views import (
- login as django_login_view, password_change)
-from django.core.urlresolvers import reverse
-from django.shortcuts import redirect
-from django.template.response import TemplateResponse
-from django.utils import timezone
-from django.utils.encoding import smart_text
-from django.utils.translation import ugettext_lazy as _
-
-from . import forms
-from .models import EmailConfirmationRequest, EmailChangeRequest
-from . import utils
-from ..cart.decorators import assign_anonymous_cart
-
-now = timezone.now
-
-
-@assign_anonymous_cart
-def login(request):
- local_host = utils.get_local_host(request)
- ctx = {
- 'facebook_login_url': utils.get_facebook_login_url(local_host),
- 'google_login_url': utils.get_google_login_url(local_host)}
- return django_login_view(request, authentication_form=forms.LoginForm,
- extra_context=ctx)
-
-
-def logout(request):
- auth_logout(request)
- messages.success(request, _('You have been successfully logged out.'))
- return redirect(settings.LOGIN_REDIRECT_URL)
-
-
-def oauth_callback(request, service):
- local_host = utils.get_local_host(request)
- form = forms.OAuth2CallbackForm(service=service, local_host=local_host,
- data=request.GET)
- if form.is_valid():
- try:
- user = form.get_authenticated_user()
- except ValueError as e:
- messages.error(request, smart_text(e))
- else:
- auth_login(request, user=user)
- messages.success(request, _('You are now logged in.'))
- return redirect(settings.LOGIN_REDIRECT_URL)
- else:
- for dummy_field, errors in form.errors.items():
- for error in errors:
- messages.error(request, error)
- return redirect('registration:login')
-
-
-def request_email_confirmation(request):
- local_host = utils.get_local_host(request)
- form = forms.RequestEmailConfirmationForm(local_host=local_host,
- data=request.POST or None)
- if form.is_valid():
- form.send()
- msg = _('Confirmation email has been sent. '
- 'Please check your inbox.')
- messages.success(request, msg)
- return redirect(settings.LOGIN_REDIRECT_URL)
-
- return TemplateResponse(request,
- 'registration/request_email_confirmation.html',
- {'form': form})
-
-
-@login_required
-def request_email_change(request):
- form = forms.RequestEmailChangeForm(
- local_host=utils.get_local_host(request), user=request.user,
- data=request.POST or None)
- if form.is_valid():
- form.send()
- msg = _('Confirmation email has been sent. '
- 'Please check your inbox.')
- messages.success(request, msg)
- return redirect(settings.LOGIN_REDIRECT_URL)
-
- return TemplateResponse(
- request, 'registration/request_email_confirmation.html',
- {'form': form})
-
-
-def confirm_email(request, token):
- if not request.POST:
- try:
- email_confirmation_request = EmailConfirmationRequest.objects.get(
- token=token, valid_until__gte=now())
- # TODO: cronjob (celery task) to delete stale tokens
- except EmailConfirmationRequest.DoesNotExist:
- return TemplateResponse(request, 'registration/invalid_token.html')
- user = email_confirmation_request.get_authenticated_user()
- if user is None:
- return TemplateResponse(request, 'registration/invalid_token.html')
- email_confirmation_request.delete()
- auth_login(request, user)
- messages.success(request, _('You are now logged in.'))
-
- form = forms.SetOrRemovePasswordForm(user=request.user,
- data=request.POST or None)
- if form.is_valid():
- form.save()
- messages.success(request, _('Password has been successfully changed.'))
- return redirect(settings.LOGIN_REDIRECT_URL)
-
- return TemplateResponse(
- request, 'registration/set_password.html', {'form': form})
-
-
-def change_email(request, token):
- try:
- email_change_request = EmailChangeRequest.objects.get(
- token=token, valid_until__gte=now())
- # TODO: cronjob (celery task) to delete stale tokens
- except EmailChangeRequest.DoesNotExist:
- return TemplateResponse(request, 'registration/invalid_token.html')
-
- # if another user is logged in, we need to log him out, to allow the email
- # owner confirm his identity
- if (request.user.is_authenticated() and
- request.user != email_change_request.user):
- auth_logout(request)
- if not request.user.is_authenticated():
- query = urlencode({
- 'next': request.get_full_path(),
- 'email': email_change_request.user.email})
- login_url = utils.url(path=settings.LOGIN_URL, query=query)
- return redirect(login_url)
-
- request.user.email = email_change_request.email
- request.user.save()
- email_change_request.delete()
-
- messages.success(request, _('Your email has been successfully changed'))
- return redirect(settings.LOGIN_REDIRECT_URL)
-
-
-def change_password(request):
- return password_change(
- request, template_name='registration/change_password.html',
- post_change_redirect=reverse('profile:details'))