Exemple #1
0
def edit_profile(request):
    title = 'Edit profile'

    if request.method == "POST":
        # request.user.username is the original username
        form = EditProfileForm(request.user.username, request.POST,
                               request.FILES)
        if form.is_valid():
            username = form.cleaned_data["username"]
            phone_number = form.cleaned_data["phone_number"]
            location = form.cleaned_data["location"]
            profile_image = form.cleaned_data["profile_image"]
            user = get_object_or_404(User, id=request.user.id)

            # We use a transaction so that if one of the requests below fails all previous ones are canceled
            try:
                with transaction.atomic():
                    edit = Profile.objects.filter(user=user)
                    if edit.exists():
                        edit = Profile.objects.get(user=user)
                        edit.phone_number = phone_number
                        edit.location = location
                        if profile_image:
                            edit.profile_image = request.FILES['profile_image']
                        edit.save()
                        user.username = username
                        user.save()
                    else:
                        edit = Profile(user=user)
                        edit.phone_number = phone_number
                        edit.location = location
                        edit.profile_image = profile_image
                        user.username = username
                        edit.save()
                        user.save()
                    messages.add_message(request, messages.SUCCESS,
                                         'Your changes have been saved.')
                    return redirect('users:profile', username=user.username)
            except IntegrityError:
                form.errors[
                    'internal'] = "An internal error has occurred. Please try your request again."
    else:
        edit = Profile.objects.filter(user=request.user)
        if edit.exists():
            form = EditProfileForm(
                request.user.username, {
                    'username': request.user.username,
                    'phone_number': edit[0].phone_number,
                    'location': edit[0].location
                }, request.FILES)
        else:
            form = EditProfileForm(request.user.username,
                                   {'username': request.user.username},
                                   request.FILES)

    return render(request, 'users/edit_profile.html', {
        'title': title,
        'form': form
    })