wrap the registration in a transaction

Sometimes when the creation of the person object fails the user get's
created anyway resulting in a user without a user profile.
By wrapping both the user and profile creation in a transaction the
user gets only created if the person profile worked as well.
This commit is contained in:
Andreas Zweili 2018-02-05 21:25:18 +01:00
parent 711e73a8b2
commit e57eafaf9e
1 changed files with 17 additions and 15 deletions

View File

@ -3,6 +3,7 @@ from django.shortcuts import get_object_or_404, render
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.forms import UserCreationForm
from django.db import transaction
from webshop.models import (Article, Category, ArticleStatus, Person, from webshop.models import (Article, Category, ArticleStatus, Person,
City, Picture, CartPosition, ShoppingCart) City, Picture, CartPosition, ShoppingCart)
from webshop.forms import RegistrationForm, AddToCartForm from webshop.forms import RegistrationForm, AddToCartForm
@ -200,21 +201,22 @@ def registration(request):
profile_form = RegistrationForm(request.POST) profile_form = RegistrationForm(request.POST)
user_form = UserCreationForm(request.POST) user_form = UserCreationForm(request.POST)
if (profile_form.is_valid() and user_form.is_valid()): if (profile_form.is_valid() and user_form.is_valid()):
pf = profile_form.cleaned_data with transaction.atomic():
uf = user_form.cleaned_data pf = profile_form.cleaned_data
user = User.objects.create_user(uf['username'], uf = user_form.cleaned_data
pf['email'], user = User.objects.create_user(uf['username'],
uf['password2']) pf['email'],
user.last_name = pf['last_name'] uf['password2'])
user.first_name = pf['first_name'] user.last_name = pf['last_name']
user.save() user.first_name = pf['first_name']
person = Person.objects.create( user.save()
salutation=pf['salutation'], person = Person.objects.create(
city=City.objects.get(zip_code=pf['zip_code'], salutation=pf['salutation'],
name=pf['city']), city=City.objects.get(zip_code=pf['zip_code'],
street_name=pf['street_name'], name=pf['city']),
street_number=pf['street_number'], street_name=pf['street_name'],
user=user) street_number=pf['street_number'],
user=user)
return HttpResponseRedirect('/login/') return HttpResponseRedirect('/login/')
else: else:
profile_form = RegistrationForm profile_form = RegistrationForm