Projet

Général

Profil

0001-logs-better-queryset-to-search-for-logs-48074.patch

Lauréline Guérin, 12 novembre 2020 09:56

Télécharger (4,42 ko)

Voir les différences:

Subject: [PATCH 1/2] logs: better queryset to search for logs (#48074)

 passerelle/views.py   | 13 +++++++++----
 tests/test_manager.py | 40 +++++++++++++++++++++++++++++++++-------
 2 files changed, 42 insertions(+), 11 deletions(-)
passerelle/views.py
27 27
from django.contrib.auth import logout as auth_logout
28 28
from django.contrib.auth import views as auth_views
29 29
from django.db import transaction
30
from django.db.models import TextField, Q
31
from django.db.models.functions import Cast
30
from django.db.models import Case, Value, When, BooleanField
32 31
from django.http import HttpResponse, HttpResponseRedirect, Http404
33 32
from django.views.decorators.csrf import csrf_exempt
34 33
from django.views.generic import (
......
250 249
                date = date_parser.parse(query, dayfirst=True)
251 250
            except Exception:
252 251
                qs = qs.annotate(
253
                    text_extra=Cast('extra', TextField())
254
                ).filter(Q(text_extra__icontains=query) | Q(message__icontains=query))
252
                    match=Case(
253
                        When(extra__transaction_id=query, then=Value(True)),
254
                        When(message__icontains=query, then=Value(True)),
255
                        When(extra__icontains=query, then=Value(True)),
256
                        default=False,
257
                        output_field=BooleanField()
258
                    )
259
                ).filter(match=True)
255 260
            else:
256 261
                date = make_aware(date)
257 262
                if date.hour == 0 and date.minute == 0 and date.second == 0:
tests/test_manager.py
1 1
import datetime
2 2
import re
3
import uuid
3 4

  
4 5
from webtest import Upload
5 6

  
......
247 248
    assert 'title="Level 42 - Oct. 6, 2020 14:08:12"' in resp.text
248 249

  
249 250

  
250
def test_logs_search_in_message(app, admin_user):
251
def test_logs_search(app, admin_user):
251 252
    csv = CsvDataSource.objects.create(csv_file=File(StringIO('1;t\n'), 't.csv'), slug='t', title='t')
252 253
    app = login(app)
253 254

  
254
    ResourceLog.objects.create(appname=csv.get_connector_slug(), slug=csv.slug, levelno=1, message='hop')
255
    resp = app.get(csv.get_absolute_url())
256
    resp = resp.click('full page')
257
    assert resp.text.count('<td class="timestamp">') == 1
255
    transaction_id = str(uuid.uuid4())
256
    log1 = ResourceLog.objects.create(
257
        appname=csv.get_connector_slug(), slug=csv.slug, levelno=1, message='hop',
258
        extra={'transaction_id': transaction_id, 'foo': 'plop'})
259
    log2 = ResourceLog.objects.create(
260
        appname=csv.get_connector_slug(), slug=csv.slug, levelno=1, message='plop',
261
        extra={'transaction_id': transaction_id, 'bar': 'hop'})
262
    log3 = ResourceLog.objects.create(
263
        appname=csv.get_connector_slug(), slug=csv.slug, levelno=1, message='foo',
264
        extra={'bar': 'hop'})
265

  
266
    resp = app.get('/manage/csvdatasource/t/logs/')
267
    assert list(resp.context['page_obj'].object_list) == [log3, log2, log1]
268

  
269
    resp.form['q'] = transaction_id
270
    resp = resp.form.submit()
271
    assert list(resp.context['page_obj'].object_list) == [log2, log1]
272

  
273
    resp.form['q'] = str(uuid.uuid4())
274
    resp = resp.form.submit()
275
    assert list(resp.context['page_obj'].object_list) == []
258 276

  
259 277
    resp.form['q'] = 'not there'
260 278
    resp = resp.form.submit()
261
    assert resp.text.count('<td class="timestamp">') == 0
279
    assert list(resp.context['page_obj'].object_list) == []
262 280

  
263 281
    resp.form['q'] = 'hop'
264 282
    resp = resp.form.submit()
265
    assert resp.text.count('<td class="timestamp">') == 1
283
    assert list(resp.context['page_obj'].object_list) == [log3, log2, log1]
284

  
285
    resp.form['q'] = 'plop'
286
    resp = resp.form.submit()
287
    assert list(resp.context['page_obj'].object_list) == [log2, log1]
288

  
289
    resp.form['q'] = 'foo'
290
    resp = resp.form.submit()
291
    assert list(resp.context['page_obj'].object_list) == [log3, log1]
266 292

  
267 293

  
268 294
def test_logging_parameters(app, admin_user):
269
-