Do not show infinitely long logs in sidebars

This commit is contained in:
Raphael Michel
2019-05-31 10:49:57 +02:00
parent a5e3bab107
commit f63907fb16
4 changed files with 53 additions and 2 deletions

View File

@@ -6,7 +6,9 @@ from django.db import models
from django.db.models.constants import LOOKUP_SEP from django.db.models.constants import LOOKUP_SEP
from django.db.models.signals import post_delete from django.db.models.signals import post_delete
from django.dispatch import receiver from django.dispatch import receiver
from django.urls import reverse
from django.utils.crypto import get_random_string from django.utils.crypto import get_random_string
from django.utils.functional import cached_property
from pretix.helpers.json import CustomJSONEncoder from pretix.helpers.json import CustomJSONEncoder
@@ -113,6 +115,40 @@ class LoggedModel(models.Model, LoggingMixin):
class Meta: class Meta:
abstract = True abstract = True
@cached_property
def logs_content_type(self):
return ContentType.objects.get_for_model(type(self))
@cached_property
def all_logentries_link(self):
from pretix.base.models import Event
if isinstance(self, Event):
event = self
elif hasattr(self, 'event'):
event = self.event
else:
return None
return reverse(
'control:event.log',
kwargs={
'event': event.slug,
'organizer': event.organizer.slug,
}
) + '?content_type={}&object={}'.format(
self.logs_content_type.pk,
self.pk
)
def top_logentries(self):
qs = self.all_logentries()
if self.all_logentries_link:
qs = qs[:25]
return qs
def top_logentries_has_more(self):
return self.all_logentries().count() > 25
def all_logentries(self): def all_logentries(self):
""" """
Returns all log entries that are attached to this object. Returns all log entries that are attached to this object.
@@ -122,7 +158,7 @@ class LoggedModel(models.Model, LoggingMixin):
from .log import LogEntry from .log import LogEntry
return LogEntry.objects.filter( return LogEntry.objects.filter(
content_type=ContentType.objects.get_for_model(type(self)), object_id=self.pk content_type=self.logs_content_type, object_id=self.pk
).select_related('user', 'event', 'oauth_application', 'api_token', 'device') ).select_related('user', 'event', 'oauth_application', 'api_token', 'device')

View File

@@ -5,6 +5,8 @@
{% block inside %} {% block inside %}
<h1>{% trans "Event logs" %}</h1> <h1>{% trans "Event logs" %}</h1>
<form class="form-inline helper-display-inline" action="" method="get"> <form class="form-inline helper-display-inline" action="" method="get">
<input type="hidden" name="content_type" value="{{ request.GET.content_type }}">
<input type="hidden" name="object" value="{{ request.GET.object }}">
<p> <p>
<select name="user" class="form-control"> <select name="user" class="form-control">
<option value="">{% trans "All actions" %}</option> <option value="">{% trans "All actions" %}</option>

View File

@@ -1,7 +1,7 @@
{% load static %} {% load static %}
{% load i18n %} {% load i18n %}
<ul class="list-group"> <ul class="list-group">
{% for log in obj.all_logentries %} {% for log in obj.top_logentries %}
<li class="list-group-item logentry"> <li class="list-group-item logentry">
<p class="meta"> <p class="meta">
<span class="fa fa-clock-o"></span> {{ log.datetime|date:"SHORT_DATETIME_FORMAT" }} <span class="fa fa-clock-o"></span> {{ log.datetime|date:"SHORT_DATETIME_FORMAT" }}
@@ -45,4 +45,11 @@
</p> </p>
</li> </li>
{% endfor %} {% endfor %}
{% if obj.all_logentries_link and obj.top_logentries_has_more %}
<li class="list-group-item logentry">
<a href="{{ obj.all_logentries_link }}">
{% trans "View full log" %}
</a>
</li>
{% endif %}
</ul> </ul>

View File

@@ -975,6 +975,12 @@ class EventLog(EventPermissionRequiredMixin, ListView):
elif self.request.GET.get('user'): elif self.request.GET.get('user'):
qs = qs.filter(user_id=self.request.GET.get('user')) qs = qs.filter(user_id=self.request.GET.get('user'))
if self.request.GET.get('content_type'):
qs = qs.filter(content_type=get_object_or_404(ContentType, pk=self.request.GET.get('content_type')))
if self.request.GET.get('object'):
qs = qs.filter(object_id=self.request.GET.get('object'))
return qs return qs
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):