diff options
author | Artur Smęt <artur.smet@mirumee.com> | 2016-11-16 14:18:22 +0100 |
---|---|---|
committer | Artur Smęt <artur.smet@mirumee.com> | 2016-11-16 14:18:43 +0100 |
commit | f753d147234cc671358dcd26b2e0f643ea490d6d (patch) | |
tree | 219f7a543c110a082292b3a2bd002684e72f208f /saleor/registration | |
parent | 3beac2881c14c898492f30e711e075971b1a91fa (diff) | |
download | saleor-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__.py | 0 | ||||
-rw-r--r-- | saleor/registration/backends.py | 49 | ||||
-rw-r--r-- | saleor/registration/forms.py | 118 | ||||
-rw-r--r-- | saleor/registration/migrations/0001_initial.py | 54 | ||||
-rw-r--r-- | saleor/registration/migrations/0001_squashed_0002_auto_20151203_1158.py | 56 | ||||
-rw-r--r-- | saleor/registration/migrations/0002_auto_20151203_1158.py | 24 | ||||
-rw-r--r-- | saleor/registration/migrations/__init__.py | 0 | ||||
-rw-r--r-- | saleor/registration/models.py | 72 | ||||
-rw-r--r-- | saleor/registration/urls.py | 21 | ||||
-rw-r--r-- | saleor/registration/utils.py | 208 | ||||
-rw-r--r-- | saleor/registration/views.py | 153 |
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')) |