[Fix #3120] Enable users to delete their own account

better-search-logging
Safwan Rahman 2017-10-20 23:25:12 +06:00
parent 0cb36c6d1d
commit f90bbda1ed
5 changed files with 63 additions and 1 deletions

View File

@ -4,6 +4,7 @@ from __future__ import absolute_import
from builtins import object
import logging
from django.contrib.auth.models import User
from haystack.forms import SearchForm
from haystack.query import SearchQuerySet
from django import forms
@ -44,6 +45,22 @@ class UserProfileForm(forms.ModelForm):
return profile
class UserDeleteForm(forms.ModelForm):
username = CharField(label=_('Username'), help_text=_('Please type your username to confirm.'))
class Meta(object):
model = User
fields = ['username']
def clean_username(self):
data = self.cleaned_data['username']
if self.instance.username != data:
raise forms.ValidationError(_("Username does not match!"))
return data
class FacetField(forms.MultipleChoiceField):
"""

View File

@ -18,4 +18,5 @@ urlpatterns = [
'template_name': 'profiles/private/edit_profile.html',
},
name='profiles_profile_edit'),
url(r'^delete/', views.delete_account, name='delete_account')
]

View File

@ -1,16 +1,21 @@
"""Views for creating, editing and viewing site-specific user profiles."""
from __future__ import absolute_import
from django.contrib import messages
from django.contrib.auth import logout
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse
from django.http import Http404
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.shortcuts import get_object_or_404, render, redirect
from django.shortcuts import render_to_response
from django.template import RequestContext
from readthedocs.core.forms import UserDeleteForm
def create_profile(request, form_class, success_url=None,
template_name='profiles/private/create_profile.html',
@ -183,6 +188,27 @@ def edit_profile(request, form_class, success_url=None,
edit_profile = login_required(edit_profile)
@login_required()
def delete_account(request):
form = UserDeleteForm()
template_name = 'profiles/private/delete_account.html'
if request.method == 'POST':
form = UserDeleteForm(instance=request.user, data=request.POST)
if form.is_valid():
# Do not delete the account permanently because it may create disaster
# Inactive the user instead.
request.user.is_active = False
request.user.save()
logout(request)
messages.info(request, 'You have successfully deleted your account')
return redirect('homepage')
return render(request, template_name, {'form': form})
def profile_detail(request, username, public_profile_field=None,
template_name='profiles/public/profile_detail.html',
extra_context=None):

View File

@ -49,6 +49,7 @@
<li class="{% block profile-admin-social-accounts %}{% endblock %}"><a href="{% url 'socialaccount_connections' %}">{% trans "Connected Services" %}</a></li>
<li class="{% block profile-admin-change-password %}{% endblock %}"><a href="{% url 'account_change_password' %}">{% trans "Change Password" %}</a></li>
<li class="{% block profile-admin-change-email %}{% endblock %}"><a href="{% url 'account_email' %}">{% trans "Change Email" %}</a></li>
<li class="{% block profile-admin-delete-account %}{% endblock %}"><a href="{% url 'delete_account' %}">{% trans "Delete Account" %}</a></li>
<li class="{% block profile-admin-gold-edit %}{% endblock %}"><a href="{% url 'gold_detail' %}">{% trans "Gold" %}</a></li>
{% endblock %}
</ul>

View File

@ -0,0 +1,17 @@
{% extends "profiles/base_profile_edit.html" %}
{% load i18n %}
{% block title %}{% trans "Delete Account" %}{% endblock %}
{% block profile-admin-delete-account %}active{% endblock %}
{% block edit_content_header %} {% trans "Delete Account" %} {% endblock %}
{% block edit_content %}
<form method="POST" action=".">
{% csrf_token %}
{{ form }}
<input type="submit" name="submit" value="{% trans "Delete Account" %}" id="submit"/>
</form>
{% endblock %}