Added form for users to delete their accounts.

Closes #10
This commit is contained in:
Johannes Erwerle 2026-10-02 20:32:37 +02:00
parent 16fe53cd32
commit dc0149560c
6 changed files with 76 additions and 1 deletions

View file

@ -2,6 +2,7 @@ from django.test import TestCase
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from webui.models import BorgRepository from webui.models import BorgRepository
from django.test import Client
class BorgRepositoryTestCase(TestCase): class BorgRepositoryTestCase(TestCase):
@ -52,3 +53,38 @@ class BorgRepositoryTestCase(TestCase):
user=user, user=user,
) )
repo.full_clean() repo.full_clean()
class UserDeleteTestCase(TestCase):
def test_user_delete(self):
password = "12345"
user = User.objects.create_user(username="deleteme", password=password)
self.assertEqual(
BorgRepository.objects.filter(name="test_repo_for_deletion").count(), 0
)
# create a repository
BorgRepository.objects.create(
name="test_repo_for_deletion",
key="ssh-ed25519 lkjasdlkjaslkdjaslkjd",
user=user,
)
# create a session for the user
c = Client()
# log in
self.assertTrue(c.login(username=user.username, password=password))
# delete the account
response = c.post("/delete/", {"confirm": "on"}, follow=True)
self.assertEqual(response.status_code, 200)
# check that there is nothing left of the user
self.assertEqual(User.objects.filter(username="deleteme").count(), 0)
self.assertEqual(
BorgRepository.objects.filter(name="test_repo_for_deletion").count(), 0
)

View file

@ -38,3 +38,7 @@ class RegisterUserForm(UserCreationForm):
class Meta(UserCreationForm.Meta): class Meta(UserCreationForm.Meta):
fields = ("username", "email") fields = ("username", "email")
class DeleteUserForm(forms.Form):
confirm = forms.BooleanField(label="I want to delete my account")

View file

@ -58,6 +58,7 @@
<button type="submit" class="navbar-item">Logout</button> <button type="submit" class="navbar-item">Logout</button>
</form> </form>
<a class="navbar-item" href="{% url 'password_change' %}">Change Password</a> <a class="navbar-item" href="{% url 'password_change' %}">Change Password</a>
<a class="navbar-item" href="{% url 'delete' %}">Delete Account</a>
{% if user.is_staff %} {% if user.is_staff %}
<hr class="navbar-divider"> <hr class="navbar-divider">
<a class="navbar-item" href="{% url 'admin:index' %}">Admin</a> <a class="navbar-item" href="{% url 'admin:index' %}">Admin</a>

View file

@ -0,0 +1,22 @@
{% extends "base.html" %}
{% load crispy_forms_tags %}
{% block content %}
{% if next %}
{% if user.is_authenticated %}
<p>Your account doesn't have access to this page. To proceed,
please login with an account that has access.</p>
{% else %}
<p>Please login to see this page.</p>
{% endif %}
{% endif %}
<form method="post" action="{% url 'delete' %}">
{% csrf_token %}
{{ form|crispy }}
<input class="button is-danger" type="submit" value="Delete Account">
<input type="hidden" name="next" value="{{ next }}">
</form>
{% endblock %}

View file

@ -17,5 +17,6 @@ urlpatterns = [
name="borg_delete", name="borg_delete",
), ),
path("register/", views.RegisterUserView.as_view(), name="register"), path("register/", views.RegisterUserView.as_view(), name="register"),
path("delete/", views.DeleteUserView.as_view(), name="delete"),
path("imprint/", views.ImprintView.as_view(), name="imprint"), path("imprint/", views.ImprintView.as_view(), name="imprint"),
] ]

View file

@ -12,7 +12,7 @@ from django.core.exceptions import ValidationError
import markdown2 import markdown2
from .models import BorgRepository, Voucher from .models import BorgRepository, Voucher
from .forms import BorgRepositoryForm, RegisterUserForm from .forms import BorgRepositoryForm, RegisterUserForm, DeleteUserForm
class UserOwnsRepositoryMixin(UserPassesTestMixin): class UserOwnsRepositoryMixin(UserPassesTestMixin):
@ -70,6 +70,17 @@ class RegisterUserView(FormView):
return super().form_valid(form) return super().form_valid(form)
class DeleteUserView(LoginRequiredMixin, FormView):
template_name = "delete.html"
form_class = DeleteUserForm
success_url = "/"
def form_valid(self, form):
user = self.request.user
user.delete()
return super().form_valid(form)
class BorgRepositoryCreateView(LoginRequiredMixin, CreateView): class BorgRepositoryCreateView(LoginRequiredMixin, CreateView):
model = BorgRepository model = BorgRepository
success_url = "/borg/" success_url = "/borg/"