[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 from builtins import object
import logging import logging
from django.contrib.auth.models import User
from haystack.forms import SearchForm from haystack.forms import SearchForm
from haystack.query import SearchQuerySet from haystack.query import SearchQuerySet
from django import forms from django import forms
@ -44,6 +45,22 @@ class UserProfileForm(forms.ModelForm):
return profile 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): class FacetField(forms.MultipleChoiceField):
""" """

View File

@ -18,4 +18,5 @@ urlpatterns = [
'template_name': 'profiles/private/edit_profile.html', 'template_name': 'profiles/private/edit_profile.html',
}, },
name='profiles_profile_edit'), 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.""" """Views for creating, editing and viewing site-specific user profiles."""
from __future__ import absolute_import 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.decorators import login_required
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.http import Http404 from django.http import Http404
from django.http import HttpResponseRedirect 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.shortcuts import render_to_response
from django.template import RequestContext from django.template import RequestContext
from readthedocs.core.forms import UserDeleteForm
def create_profile(request, form_class, success_url=None, def create_profile(request, form_class, success_url=None,
template_name='profiles/private/create_profile.html', 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) 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, def profile_detail(request, username, public_profile_field=None,
template_name='profiles/public/profile_detail.html', template_name='profiles/public/profile_detail.html',
extra_context=None): 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-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-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-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> <li class="{% block profile-admin-gold-edit %}{% endblock %}"><a href="{% url 'gold_detail' %}">{% trans "Gold" %}</a></li>
{% endblock %} {% endblock %}
</ul> </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 %}