diff --git a/tapir/log/templates/log/log_entry_list_tag.html b/tapir/log/templates/log/log_entry_list_tag.html
index 9a65ac56d..d239a2930 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..d53a2e0d9
--- /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!" %}
+
+
+
+ {% translate "Cancel" %}
+
+
+
+
+{% endblock content %}
diff --git a/tapir/log/templatetags/tapir_log.py b/tapir/log/templatetags/tapir_log.py
index b38dcb578..5d484628d 100644
--- a/tapir/log/templatetags/tapir_log.py
+++ b/tapir/log/templatetags/tapir_log.py
@@ -42,6 +42,8 @@ def log_entry_list(context, **kwargs):
share_owner_id = tapir_user.share_owner.id
elif share_owner:
share_owner_id = share_owner.id
+ else:
+ share_owner_id = tapir_user.id
context["share_owner_id"] = share_owner_id
context["create_text_log_entry_action_url"] = reverse(
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())
diff --git a/tapir/translations/locale/de/LC_MESSAGES/django.po b/tapir/translations/locale/de/LC_MESSAGES/django.po
index 0560d079a..f4193fdaa 100644
--- a/tapir/translations/locale/de/LC_MESSAGES/django.po
+++ b/tapir/translations/locale/de/LC_MESSAGES/django.po
@@ -309,8 +309,8 @@ msgstr "Du kannst nur deinen eigenen Strichcode sehen, es sei denn du hast Admin
#: accounts/templates/accounts/user_detail.html:20 coop/models.py:724
#: coop/templates/coop/draftuser_detail.html:86
-#: coop/templates/coop/shareowner_detail.html:10 log/views.py:94
-#: log/views.py:152 shifts/templates/shifts/shift_detail_printable.html:50
+#: coop/templates/coop/shareowner_detail.html:10 log/views.py:98
+#: log/views.py:156 shifts/templates/shifts/shift_detail_printable.html:50
msgid "Member"
msgstr "Mitglied"
@@ -960,6 +960,7 @@ msgstr "Löschen bestätigen"
#: coop/templates/coop/confirm_delete_share_ownership.html:24
#: coop/templates/coop/tags/user_coop_share_ownership_list_tag.html:135
#: financingcampaign/templates/financingcampaign/confirm_delete.html:24
+#: log/templates/log/log_entry_list_tag.html:19
#: shifts/templates/shifts/shift_confirm_delete.html:30
msgid "Delete"
msgstr "Löschen"
@@ -2089,6 +2090,7 @@ msgid "Submit"
msgstr "Abschicken"
#: coop/templates/coop/extra_share_request.html:92
+#: log/templates/log/logentry_confirm_delete.html:44
#: shifts/templates/shifts/user_shifts_overview_tag.html:177
msgid "Cancel"
msgstr "Abmelden"
@@ -2946,7 +2948,7 @@ msgid "The list of all datapoints"
msgstr ""
#: financingcampaign/templates/financingcampaign/general.html:111
-#: log/templates/log/log_entry_list_tag.html:23
+#: log/templates/log/log_entry_list_tag.html:30
#: shifts/templates/shifts/user_shift_account_log.html:26
#: statistics/templates/statistics/tags/credit_account_card.html:17
#: statistics/templates/statistics/tags/purchase_statistics_card.html:18
@@ -3013,29 +3015,61 @@ msgstr "Letzte 5 Log-Einträge"
msgid "See all log entries"
msgstr "Alle Log-Einträge einsehen"
-#: log/templates/log/log_entry_list_tag.html:20
+#: log/templates/log/log_entry_list_tag.html:27
msgid "List of log entries for this member"
msgstr "Liste der Protokoll-Einträge für dieses Mitglied"
-#: log/templates/log/log_entry_list_tag.html:24 log/views.py:97
-#: log/views.py:151
+#: log/templates/log/log_entry_list_tag.html:31 log/views.py:101
+#: log/views.py:155
msgid "Actor"
msgstr "Sender*in"
-#: log/templates/log/log_entry_list_tag.html:25 log/views.py:90
+#: log/templates/log/log_entry_list_tag.html:32 log/views.py:94
msgid "Message"
msgstr "Nachricht"
-#: log/templates/log/log_entry_list_tag.html:57
-#: log/templates/log/log_entry_list_tag.html:58
+#: log/templates/log/log_entry_list_tag.html:64
+#: log/templates/log/log_entry_list_tag.html:65
msgid "Notes about this user"
msgstr "Notizen über diese*n Benutzer*in"
-#: log/templates/log/log_entry_list_tag.html:63
+#: log/templates/log/log_entry_list_tag.html:70
msgid "Add Note"
msgstr "Notiz hinzufügen"
-#: log/views.py:153
+#: log/templates/log/logentry_confirm_delete.html:24
+#, fuzzy
+#| msgid "See all log entries"
+msgid "Delete all log entries?"
+msgstr "Alle Log-Einträge einsehen"
+
+#: log/templates/log/logentry_confirm_delete.html:32
+#, python-format
+msgid ""
+"\n"
+" You are about to permanently delete %(count)s log entries for %(name)s .\n"
+" "
+msgstr ""
+
+#: log/templates/log/logentry_confirm_delete.html:37
+msgid "Warning:"
+msgstr ""
+
+#: log/templates/log/logentry_confirm_delete.html:38
+msgid "This action cannot be undone!"
+msgstr ""
+
+#: log/templates/log/logentry_confirm_delete.html:39
+msgid "This action may skew statistics based on the logs!"
+msgstr ""
+
+#: log/templates/log/logentry_confirm_delete.html:49
+#, fuzzy
+#| msgid "See all log entries"
+msgid "Delete all logs"
+msgstr "Alle Log-Einträge einsehen"
+
+#: log/views.py:157
msgid "Log Type"
msgstr ""