From 36ad17faaab1fe0a89754a1d4e84495714d64724 Mon Sep 17 00:00:00 2001
From: crosspolar <18083323+crosspolar@users.noreply.github.com>
Date: Tue, 9 Jun 2026 22:05:42 +0200
Subject: [PATCH 1/3] init
---
.../log/templates/log/log_entry_list_tag.html | 7 +++
.../log/logentry_confirm_delete.html | 55 +++++++++++++++++++
tapir/log/urls.py | 5 ++
tapir/log/views.py | 39 ++++++++++++-
4 files changed, 103 insertions(+), 3 deletions(-)
create mode 100644 tapir/log/templates/log/logentry_confirm_delete.html
diff --git a/tapir/log/templates/log/log_entry_list_tag.html b/tapir/log/templates/log/log_entry_list_tag.html
index 9a65ac56d..edd988e83 100644
--- a/tapir/log/templates/log/log_entry_list_tag.html
+++ b/tapir/log/templates/log/log_entry_list_tag.html
@@ -12,6 +12,13 @@
diff --git a/tapir/log/templates/log/logentry_confirm_delete.html b/tapir/log/templates/log/logentry_confirm_delete.html
new file mode 100644
index 000000000..9f083ab3d
--- /dev/null
+++ b/tapir/log/templates/log/logentry_confirm_delete.html
@@ -0,0 +1,55 @@
+{% extends "core/base.html" %}
+{% load django_bootstrap5 %}
+{% load i18n %}
+{% load coop %}
+{% load static %}
+{% load core %}
+{% block head %}
+ {{ block.super }}
+
+
+ {{ filter.form.media }}
+{% endblock head %}
+{% block content %}
+
+
+
+
+
+
+
+ {% blocktranslate with name=share_owner.get_display_name|default:share_owner count=log_count %}
+ You are about to permanently delete {{ count }} log entries for {{ name }} .
+ {% endblocktranslate %}
+
+
+ {% translate "Warning:" %}
+ {% translate "This action cannot be undone!" %}
+ {% translate "This action may skew statistics based on the logs!" %}
+
+
+
+
+
+
+
+{% endblock body %}
diff --git a/tapir/log/urls.py b/tapir/log/urls.py
index bbee4a743..f6eedfb96 100644
--- a/tapir/log/urls.py
+++ b/tapir/log/urls.py
@@ -19,4 +19,9 @@
views.LogTableView.as_view(),
name="log_overview",
),
+ path(
+ "delete/
/",
+ views.DeleteLogsView.as_view(),
+ name="delete_logs",
+ ),
]
diff --git a/tapir/log/views.py b/tapir/log/views.py
index 1b0dcb83e..5ad9d9afa 100644
--- a/tapir/log/views.py
+++ b/tapir/log/views.py
@@ -3,12 +3,13 @@
import django_filters
import django_tables2
from django.contrib.auth.decorators import login_required, permission_required
-from django.contrib.auth.mixins import LoginRequiredMixin
+from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.contrib.contenttypes.models import ContentType
from django.db.models import Q, QuerySet
from django.http import HttpResponse, HttpResponseBadRequest
-from django.shortcuts import get_object_or_404
+from django.shortcuts import get_object_or_404, redirect, render
from django.utils.translation import gettext_lazy as _
+from django.views import View
from django.views.decorators.http import require_GET, require_POST
from django_filters import DateRangeFilter
from django_filters.views import FilterView
@@ -20,7 +21,10 @@
from tapir.log.forms import CreateTextLogEntryForm
from tapir.log.models import EmailLogEntry, LogEntry, TextLogEntry
from tapir.log.util import freeze_for_log
-from tapir.settings import PERMISSION_COOP_MANAGE, PERMISSION_COOP_VIEW
+from tapir.settings import (
+ PERMISSION_COOP_MANAGE,
+ PERMISSION_COOP_VIEW,
+)
from tapir.utils.filters import ShareOwnerModelChoiceFilter, TapirUserModelChoiceFilter
from tapir.utils.shortcuts import (
safe_redirect,
@@ -182,3 +186,32 @@ def get_queryset(self):
if not self.request.user.has_perm(PERMISSION_COOP_VIEW):
return queryset.filter(user=self.request.user)
return queryset
+
+
+class DeleteLogsView(LoginRequiredMixin, PermissionRequiredMixin, View):
+
+ permission_required = "accounts.manage"
+ raise_exception = True
+ template_name = "log/logentry_confirm_delete.html"
+
+ def get(self, request, share_owner_id):
+ share_owner = get_object_or_404(ShareOwner, pk=share_owner_id)
+ log_count = LogEntry.objects.filter(share_owner=share_owner).count()
+
+ if log_count == 0:
+ log_count = LogEntry.objects.filter(user=share_owner.user).count()
+
+ context = {
+ "share_owner": share_owner,
+ "log_count": log_count,
+ }
+ return render(request, self.template_name, context)
+
+ def post(self, request, share_owner_id):
+ share_owner = get_object_or_404(ShareOwner, pk=share_owner_id)
+
+ deleted_count, _ = LogEntry.objects.filter(share_owner=share_owner).delete()
+ if deleted_count == 0:
+ deleted_count, _ = LogEntry.objects.filter(user=share_owner.user).delete()
+
+ return redirect(share_owner.user.get_absolute_url())
From 5263bfca9b9fc5391d388419f6b0302b12e1f184 Mon Sep 17 00:00:00 2001
From: crosspolar <18083323+crosspolar@users.noreply.github.com>
Date: Tue, 9 Jun 2026 22:14:21 +0200
Subject: [PATCH 2/3] init
---
.../log/logentry_confirm_delete.html | 72 +++++++++----------
1 file changed, 36 insertions(+), 36 deletions(-)
diff --git a/tapir/log/templates/log/logentry_confirm_delete.html b/tapir/log/templates/log/logentry_confirm_delete.html
index 9f083ab3d..d53a2e0d9 100644
--- a/tapir/log/templates/log/logentry_confirm_delete.html
+++ b/tapir/log/templates/log/logentry_confirm_delete.html
@@ -6,50 +6,50 @@
{% load core %}
{% block head %}
{{ block.super }}
-
+
{{ filter.form.media }}
{% endblock head %}
{% block content %}
-
-
-
-
-
-
-
- {% blocktranslate with name=share_owner.get_display_name|default:share_owner count=log_count %}
- You are about to permanently delete {{ count }} log entries for {{ name }} .
- {% endblocktranslate %}
-
-
- {% translate "Warning:" %}
- {% translate "This action cannot be undone!" %}
- {% translate "This action may skew statistics based on the logs!" %}
-
-
-
+
+
+
+
+
+ {% blocktranslate with name=share_owner.get_display_name|default:share_owner count=log_count %}
+ You are about to permanently delete {{ count }} log entries for {{ name }} .
+ {% endblocktranslate %}
+
+
+ {% translate "Warning:" %}
+ {% translate "This action cannot be undone!" %}
+ {% translate "This action may skew statistics based on the logs!" %}
+
+
+
+ {% translate "Cancel" %}
+
+
+
-{% endblock body %}
+{% endblock content %}
From 9b66b73c70e2cd05f0f9b74d8f11ec5cdaf867d4 Mon Sep 17 00:00:00 2001
From: crosspolar <18083323+crosspolar@users.noreply.github.com>
Date: Wed, 10 Jun 2026 07:20:49 +0200
Subject: [PATCH 3/3] fix: for general accounts without share-owner
---
.../log/templates/log/log_entry_list_tag.html | 2 +-
tapir/log/templatetags/tapir_log.py | 2 +
.../locale/de/LC_MESSAGES/django.po | 58 +++++++++++++++----
3 files changed, 49 insertions(+), 13 deletions(-)
diff --git a/tapir/log/templates/log/log_entry_list_tag.html b/tapir/log/templates/log/log_entry_list_tag.html
index edd988e83..d239a2930 100644
--- a/tapir/log/templates/log/log_entry_list_tag.html
+++ b/tapir/log/templates/log/log_entry_list_tag.html
@@ -14,7 +14,7 @@