diff --git a/debian/bin/logtracker b/debian/bin/logtracker index 81af106..af8b38b 100755 --- a/debian/bin/logtracker +++ b/debian/bin/logtracker @@ -1,7 +1,7 @@ #!/bin/sh args=$* -test $# -eq 0 && args=print +test $# -eq 0 && args=dump if [ "$(whoami)" != "logtracker" ]; then sudo -H -u logtracker logtracker-manage $args diff --git a/logtracker/journal/management/commands/print.py b/logtracker/journal/management/commands/dump.py similarity index 93% rename from logtracker/journal/management/commands/print.py rename to logtracker/journal/management/commands/dump.py index 2134ea8..ddcdb9d 100644 --- a/logtracker/journal/management/commands/print.py +++ b/logtracker/journal/management/commands/dump.py @@ -19,7 +19,7 @@ class Command(BaseCommand): def handle(self, *args, **options): _, columns = os.popen("stty size", "r").read().split() - for entry in Entry.objects.print(lines=options['lines']): + for entry in Entry.objects.dump(lines=options['lines']): line = "%s %s %s" % ( entry.timestamp.strftime("%c"), entry.host, diff --git a/logtracker/journal/models.py b/logtracker/journal/models.py index 94a203a..4ddd49b 100644 --- a/logtracker/journal/models.py +++ b/logtracker/journal/models.py @@ -1,10 +1,21 @@ from django.db import models from django.contrib.postgres.fields import JSONField +from django.contrib.postgres.fields.jsonb import KeyTextTransform class EntryManager(models.Manager): - def print(self, lines=100): - return reversed(self.model.objects.order_by('-timestamp')[:int(lines)]) + def dump(self, host=None, message=None, lines=100): + if message: + qs = Entry.objects.annotate(message=KeyTextTransform('MESSAGE', 'data')) + else: + qs = Entry.objects.all() + if host: + qs = qs.filter(host=host) + if message: + qs = qs.filter(message__contains=message) + if lines: + qs = qs.order_by('-timestamp')[:int(lines)][::-1] + return qs class Entry(models.Model): diff --git a/logtracker/journal/templates/home.html b/logtracker/journal/templates/home.html index f9df953..c87c815 100644 --- a/logtracker/journal/templates/home.html +++ b/logtracker/journal/templates/home.html @@ -3,19 +3,24 @@ {% block content %}

Logtracker

-Recent log entries +

Journal entries

+ +

Emails

-

Search by recipient

- -
{% csrf_token %} - Address: - - Sender - Recipient
- -
- -Recent senders list + {% endblock %} diff --git a/logtracker/journal/templates/journal/entry_list.html b/logtracker/journal/templates/journal/entry_list.html index 661f8d6..c3b0466 100644 --- a/logtracker/journal/templates/journal/entry_list.html +++ b/logtracker/journal/templates/journal/entry_list.html @@ -3,7 +3,7 @@ {% block content %}

Logtracker

-

Entries

+

Journal entries

diff --git a/logtracker/journal/views.py b/logtracker/journal/views.py index 607c973..b0966a6 100644 --- a/logtracker/journal/views.py +++ b/logtracker/journal/views.py @@ -17,8 +17,9 @@ from logtracker.journal.journalstream import get_journal_entries class APIEntriesList(LoginRequiredMixin, ListView): def get_queryset(self): - qs = Entry.objects.all() - return qs[:100] + lines = self.request.GET.get('lines', 100) + host = self.request.GET.get('host', '') + return Entry.objects.dump(host=host, lines=lines) def get(self, request, *args, **kwargs): queryset = self.get_queryset() @@ -27,16 +28,20 @@ class APIEntriesList(LoginRequiredMixin, ListView): class EntriesList(LoginRequiredMixin, ListView): + template_name = 'journal/entry_list.html' + def get_queryset(self): - qs = Entry.objects.all() - return qs[:100] + 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) class HomeView(LoginRequiredMixin, TemplateView): template_name = 'home.html' def post(self, request, *args, **kwargs): - url = '%s?%s' % (reverse('emails'), '%s=%s' % (request.POST['field'], request.POST['address'])) + url = '%s?%s' % (reverse('mail-api'), '%s=%s' % (request.POST['field'], request.POST['address'])) return HttpResponseRedirect(url) diff --git a/logtracker/mail/models.py b/logtracker/mail/models.py index 5dd1ce2..5b1ef53 100644 --- a/logtracker/mail/models.py +++ b/logtracker/mail/models.py @@ -49,8 +49,15 @@ class Recipient(Address): class MailManager(models.Manager): - def print(self): - return self.model.objects.all() + def dump(self, host=None, lines=None, sender=None): + qs = Mail.objects.all() + if host: + qs = qs.filter(host=host) + if sender: + qs = qs.filter(sender__email=sender) + if lines: + qs = qs.order_by('-timestamp')[:int(lines)][::-1] + return qs class Mail(models.Model): diff --git a/logtracker/mail/templates/entries/home.html b/logtracker/mail/templates/entries/home.html deleted file mode 100644 index 286e612..0000000 --- a/logtracker/mail/templates/entries/home.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends "base.html" %} - -{% block content %} -

Mailtracker

- -

Search by recipient

- - {% csrf_token %} - Address: - - Sender - Recipient
- - - -Recent senders list - -{% endblock %} diff --git a/logtracker/mail/templates/entries/sender_list.html b/logtracker/mail/templates/entries/sender_list.html deleted file mode 100644 index b207cc9..0000000 --- a/logtracker/mail/templates/entries/sender_list.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends "base.html" %} - -{% block content %} -

Mailtracker

- -

Recent senders

-
- - - - - - - - - -{% for sender in object_list %} - - - - - - -{% empty %} - No data yet. -{% endfor %} - -
SenderEmails CountWith errorsPending
{{ sender }}{{ sender.email_count }}{{ sender.error_count }}{{ sender.pending_count }}
-{% endblock %} diff --git a/logtracker/journal/templates/entries/sender_list.html b/logtracker/mail/templates/mail/sender_list.html similarity index 75% rename from logtracker/journal/templates/entries/sender_list.html rename to logtracker/mail/templates/mail/sender_list.html index b207cc9..a9cca8b 100644 --- a/logtracker/journal/templates/entries/sender_list.html +++ b/logtracker/mail/templates/mail/sender_list.html @@ -17,9 +17,9 @@ {% for sender in object_list %} {{ sender }} - {{ sender.email_count }} - {{ sender.error_count }} - {{ sender.pending_count }} + {{ sender.email_count }} + {{ sender.error_count }} + {{ sender.pending_count }} {% empty %} No data yet. diff --git a/logtracker/mail/views.py b/logtracker/mail/views.py index 7907b97..a41e23c 100644 --- a/logtracker/mail/views.py +++ b/logtracker/mail/views.py @@ -4,45 +4,25 @@ from django.views.generic.list import ListView from django.http import JsonResponse, HttpResponseRedirect from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse -from django.shortcuts import get_object_or_404 from logtracker.mail.models import Mail, Sender, Recipient -import json - - -def check(val): - return val == 'true' class EmailsList(LoginRequiredMixin, ListView): def get_queryset(self): - if self.request.GET.get('from'): - sender = get_object_or_404(Sender, email=unquote(self.request.GET.get('from'))) - qs = sender.mail_set.all() - elif self.request.GET.get('to'): - recipient = get_object_or_404(Recipient, email=unquote(self.request.GET.get('to'))) - qs = recipient.mail_set.all() - else: - qs = Mail.objects.all() - if self.request.GET.get('has_error'): - qs = qs.filter(has_error=check(self.request.GET.get('has_error'))) - if self.request.GET.get('has_completed'): - qs = qs.filter(has_completed=check(self.request.GET.get('has_completed'))) - return qs[:100] + params = self.request.GET + return Mail.objects.dump(host=params.get('host'), sender=params.get('sender'), lines=params.get('lines')) def get(self, request, *args, **kwargs): - queryset = self.get_queryset() - #data = {m.identifier: [str(e) for e in json.dumps(m.entries_list)] for m in queryset} - data = {m.identifier: [e.data.get('MESSAGE') for e in m.entries_list] for m in queryset} - #data = {m.identifier: 'a' for m in queryset} + data = {m.identifier: [e.data.get('MESSAGE') for e in m.entries_list] for m in self.get_queryset()} return JsonResponse({'data': data}) class MailHome(LoginRequiredMixin, TemplateView): - template_name = 'entries/home.html' + template_name = 'mail/home.html' form_class = Recipient def post(self, request, *args, **kwargs): - url = '%s?%s' % (reverse('emails'), '%s=%s' % (request.POST['field'], request.POST['address'])) + url = '%s?%s' % (reverse('mail-api'), '%s=%s' % (request.POST['field'], request.POST['address'])) return HttpResponseRedirect(url) diff --git a/logtracker/urls.py b/logtracker/urls.py index a082064..141dd06 100644 --- a/logtracker/urls.py +++ b/logtracker/urls.py @@ -8,10 +8,9 @@ from logtracker.mail.views import EmailsList, SendersList, MailHome urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$', HomeView.as_view()), - url(r'^journal/$', EntriesList.as_view()), - url(r'^api/journal/$', APIEntriesList.as_view(), name='journal'), - url(r'^api/mail/$', EmailsList.as_view(), name='emails'), - url(r'^mail/$', MailHome.as_view(), name='mail'), + url(r'^journal/$', EntriesList.as_view(), name='journal'), + url(r'^api/journal/$', APIEntriesList.as_view(), name='journal-api'), + url(r'^api/mail/$', EmailsList.as_view(), name='mail-api'), url(r'^mail/senders/$', SendersList.as_view(), name='senders'), url(r'^upload$', UploadView, name='upload'), ]