base: use pk as hint to find logs of the same call (#88960)

This commit is contained in:
Benjamin Dauvergne 2024-04-09 18:53:39 +02:00
parent 9d1bdbcd1d
commit 7449e69506
3 changed files with 42 additions and 17 deletions

View File

@ -31,7 +31,7 @@
{% if logline.transaction_id %}
<div class="buttons">
<a class="button" href="{% url 'view-logs-connector' connector=object.get_connector_slug slug=object.slug %}?q={{logline.transaction_id}}">{% trans "Search for logs from the same call" %}</a>
<a class="button" href="{% url 'view-logs-connector' connector=object.get_connector_slug slug=object.slug %}?q=about:{{ logline.pk }}">{% trans "Search for logs from the same call" %}</a>
</div>
{% endif %}

View File

@ -19,7 +19,6 @@ import hashlib
import inspect
import json
import logging
import uuid
from urllib.parse import quote
from dateutil import parser as date_parser
@ -241,6 +240,21 @@ class GenericViewLogsConnectorView(GenericConnectorMixin, ListView):
def get_object(self):
return get_object_or_404(self.model.objects.all(), slug=self.kwargs['slug'])
def parse_date(self, query):
try:
return date_parser.parse(query, dayfirst=True)
except Exception:
return None
def parse_about(self, query):
if not query.startswith('about:'):
return None
try:
return int(query[len('about:') :])
except ValueError:
return None
return None
def get_queryset(self):
self.form = ResourceLogSearchForm(data=self.request.GET)
qs = ResourceLog.objects.filter(appname=self.kwargs['connector'], slug=self.kwargs['slug']).order_by(
@ -253,21 +267,12 @@ class GenericViewLogsConnectorView(GenericConnectorMixin, ListView):
level = self.form.cleaned_data['log_level']
if level:
qs = qs.filter(levelno=logging.getLevelName(level))
initial_qs = qs
if query:
try:
date = date_parser.parse(query, dayfirst=True)
except Exception:
initial_qs = qs
query_uuid = None
try:
query_uuid = uuid.UUID(query)
except ValueError:
pass
else:
qs = qs.filter(transaction_id=query_uuid)
if query_uuid is None or query_uuid is not None and not qs.exists():
qs = initial_qs.filter(Q(message__icontains=query) | Q(extra__icontains=query))
else:
date = self.parse_date(query)
if date:
if is_naive(date):
date = make_aware(date)
if date.hour == 0 and date.minute == 0 and date.second == 0:
@ -279,6 +284,21 @@ class GenericViewLogsConnectorView(GenericConnectorMixin, ListView):
else:
# display all events in the same second
qs = qs.filter(timestamp__gte=date, timestamp__lte=date + datetime.timedelta(seconds=1))
else:
about_pk = self.parse_about(query)
if about_pk:
try:
log = qs.get(pk=about_pk)
except ResourceLog.DoesNotExist:
pass
else:
qs = qs.filter(
timestamp__gt=log.timestamp - datetime.timedelta(minutes=10),
timestamp__lt=log.timestamp + datetime.timedelta(minutes=10),
transaction_id=log.transaction_id,
)
if not about_pk or not qs.exists():
qs = initial_qs.filter(Q(message__icontains=query) | Q(extra__icontains=query))
return qs

View File

@ -389,7 +389,7 @@ def test_logs_search(app, admin_user):
resp = app.get('/manage/csvdatasource/t/logs/')
assert list(resp.context['page_obj'].object_list) == [log4, log3, log2, log1]
resp.form['q'] = transaction_id
resp.form['q'] = f'about:{log1.pk}'
resp = resp.form.submit()
assert list(resp.context['page_obj'].object_list) == [log2, log1]
@ -417,6 +417,11 @@ def test_logs_search(app, admin_user):
resp = resp.form.submit()
assert list(resp.context['page_obj'].object_list) == [log3, log1]
# Test link "Search for logs from the same call"
resp = app.get(f'/manage/csvdatasource/t/logs/{log1.pk}/')
resp = resp.click('Search for logs')
assert list(resp.context['page_obj'].object_list) == [log2, log1]
def test_logging_parameters(app, admin_user):
data = StringIO('1;Foo\n2;Bar\n3;Baz')