From 8e4088be2a9c629ff9ae0417846f671fce8ab3fa Mon Sep 17 00:00:00 2001 From: Christophe Siraut Date: Thu, 10 Sep 2020 15:28:20 +0200 Subject: [PATCH] misc: add filtering --- .../journal/management/commands/dump.py | 4 ++- logtracker/journal/models.py | 27 ++++++++++++++----- logtracker/journal/templates/base.html | 2 +- .../journal/templates/journal/entry_list.html | 21 +++++++++++++++ logtracker/journal/views.py | 10 +++++-- logtracker/mail/templates/base.html | 12 --------- 6 files changed, 53 insertions(+), 23 deletions(-) delete mode 100644 logtracker/mail/templates/base.html diff --git a/logtracker/journal/management/commands/dump.py b/logtracker/journal/management/commands/dump.py index 82718e9..2c8efde 100644 --- a/logtracker/journal/management/commands/dump.py +++ b/logtracker/journal/management/commands/dump.py @@ -16,10 +16,12 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument("--full", action="store_true") parser.add_argument("-n", "--lines", default=100) + parser.add_argument('options', nargs="*") def handle(self, *args, **options): _, columns = os.popen("stty size", "r").read().split() - for entry in Entry.objects.dump(lines=options['lines']): + kwargs = {k: v for (k, v) in [o.split('=') for o in options['options']]} + for entry in Entry.objects.dump(lines=options['lines'], **kwargs): line = "%s %s %s %s" % ( entry.timestamp.astimezone().strftime("%b %d %X"), entry.host, diff --git a/logtracker/journal/models.py b/logtracker/journal/models.py index 89ccf50..ff41ad3 100644 --- a/logtracker/journal/models.py +++ b/logtracker/journal/models.py @@ -1,22 +1,35 @@ from django.db import models from django.contrib.postgres.fields import JSONField from django.contrib.postgres.fields.jsonb import KeyTextTransform +from django.utils.functional import cached_property class EntryManager(models.Manager): - def dump(self, host=None, message=None, lines=100): - if message: - qs = Entry.objects.annotate(message=KeyTextTransform('MESSAGE', 'data')) - else: - qs = Entry.objects.all() + + def dump(self, timestamp=None, host=None, lines=100, **kwargs): + qs = Entry.objects.all() if host: qs = qs.filter(host=host) - if message: - qs = qs.filter(message__contains=message) + qs = qs.filter(**self.parse_options(**kwargs)) if lines: qs = qs.order_by('-timestamp')[:int(lines)][::-1] return qs + def parse_options(self, mode='exact', **kwargs): + # todo mode='contains' require jsonb KeyTextTransform and probably annotations + options = {} + for k, v in kwargs.items(): + options['data__' + k.upper() + '__%s' % mode] = v + return options + + @cached_property + def hosts(self): + return self.model.objects.all().values_list('host', flat=True).distinct() + + @cached_property + def units(self): + return self.model.objects.all().annotate(unit=KeyTextTransform('_SYSTEMD_UNIT', 'data')).values_list('unit', flat=True).distinct() + class Entry(models.Model): timestamp = models.DateTimeField(auto_now_add=True, db_index=True) diff --git a/logtracker/journal/templates/base.html b/logtracker/journal/templates/base.html index 32238fa..5f365e3 100644 --- a/logtracker/journal/templates/base.html +++ b/logtracker/journal/templates/base.html @@ -1,7 +1,7 @@ - {% block title %}Mailtracker{% endblock %} + {% block title %}Logtracker{% endblock %} diff --git a/logtracker/journal/templates/journal/entry_list.html b/logtracker/journal/templates/journal/entry_list.html index 4988689..be4514c 100644 --- a/logtracker/journal/templates/journal/entry_list.html +++ b/logtracker/journal/templates/journal/entry_list.html @@ -3,7 +3,28 @@ {% block content %}

Logtracker

+
+
+ +
+ +
+ +
+
+

Journal entries

+ diff --git a/logtracker/journal/views.py b/logtracker/journal/views.py index a8f233c..230c456 100644 --- a/logtracker/journal/views.py +++ b/logtracker/journal/views.py @@ -33,8 +33,14 @@ class EntriesList(LoginRequiredMixin, ListView): def get_queryset(self): lines = self.request.GET.get('lines', 100) host = self.request.GET.get('host') - message = self.request.GET.get('message') - return Entry.objects.dump(host=host, lines=lines, message=message) + options = {k: v for k, v in self.request.GET.items() if k not in ('lines', 'host', 'timestamp')} + return Entry.objects.dump(host=host, lines=lines, **options) + + def get_context_data(self, **kwargs): + data = super().get_context_data(**kwargs) + data['hosts'] = Entry.objects.hosts + data['units'] = Entry.objects.units + return data class HomeView(LoginRequiredMixin, TemplateView): diff --git a/logtracker/mail/templates/base.html b/logtracker/mail/templates/base.html deleted file mode 100644 index e9720cc..0000000 --- a/logtracker/mail/templates/base.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - {% block title %}Mailtracker{% endblock %} - - - -
- {% block content %}{% endblock %} -
- -