base: use pk as hint to find logs of the same call (#88960)
This commit is contained in:
parent
9d1bdbcd1d
commit
7449e69506
|
@ -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 %}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue