misc: rework views

This commit is contained in:
Christophe Siraut 2020-09-08 16:05:22 +02:00
parent 2bca9792bd
commit b0291ac42b
12 changed files with 63 additions and 103 deletions

View File

@ -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

View File

@ -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,

View File

@ -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):

View File

@ -3,19 +3,24 @@
{% block content %}
<h1>Logtracker</h1>
<a href="{% url 'journal' %}">Recent log entries</a>
<h2>Journal entries</h2>
<ul>
<li>Recent log entries : <a href="{% url 'journal' %}?host=&lines=100">html</a> / <a href="{% url 'journal-api' %}?host=&lines=100">json</a></li>
</ul>
<h2>Emails</h2>
<h2>Search by recipient</h2>
<form action="." method="post">{% csrf_token %}
Address:
<input type="text" name="address">
<input type="radio" name="field" value="from" checked>Sender
<input type="radio" name="field" value="to">Recipient<br>
<input type="submit" value="Search">
</form>
<a href="{% url 'senders' %}">Recent senders list</a>
<ul>
<li><a href="{% url 'mail-api' %}?host=&sender=&lines=100">Recent email entries (json)</a></li>
<li><a href="{% url 'senders' %}">Recent email senders list</a></li>
<li>Search email by address:
<form action="." style="display:inline;" method="post">{% csrf_token %}
<input type="text" name="address">
<input type="radio" name="field" value="sender" checked>Sender
<input type="radio" name="field" value="recipients">Recipients
<input type="submit" value="Search">
</form>
</li>
</ul>
{% endblock %}

View File

@ -3,7 +3,7 @@
{% block content %}
<h1>Logtracker</h1>
<h2>Entries</h2>
<h2>Journal entries</h2>
<table>
<thead>
<tr>

View File

@ -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)

View File

@ -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):

View File

@ -1,18 +0,0 @@
{% extends "base.html" %}
{% block content %}
<h1>Mailtracker</h1>
<h2>Search by recipient</h2>
<form action="." method="post">{% csrf_token %}
Address:
<input type="text" name="address">
<input type="radio" name="field" value="from" checked>Sender
<input type="radio" name="field" value="to">Recipient<br>
<input type="submit" value="Search">
</form>
<a href="{% url 'senders' %}">Recent senders list</a>
{% endblock %}

View File

@ -1,29 +0,0 @@
{% extends "base.html" %}
{% block content %}
<h1>Mailtracker</h1>
<h2>Recent senders</h2>
<table>
<thead>
<tr>
<td>Sender</td>
<td>Emails Count</td>
<td>With errors</td>
<td>Pending</td>
</tr>
</thead>
<tbody>
{% for sender in object_list %}
<tr>
<td>{{ sender }}</td>
<td><a href='/api/emails?from={{ sender|urlencode }}'>{{ sender.email_count }}</a></td>
<td><a href='/api/emails?from={{ sender|urlencode }}&has_error=true'>{{ sender.error_count }}</a></td>
<td><a href='/api/emails?from={{ sender|urlencode }}&has_completed=false'>{{ sender.pending_count }}</a></td>
</tr>
{% empty %}
No data yet.
{% endfor %}
</tbody>
</table>
{% endblock %}

View File

@ -17,9 +17,9 @@
{% for sender in object_list %}
<tr>
<td>{{ sender }}</td>
<td><a href='/api/emails?from={{ sender|urlencode }}'>{{ sender.email_count }}</a></td>
<td><a href='/api/emails?from={{ sender|urlencode }}&has_error=true'>{{ sender.error_count }}</a></td>
<td><a href='/api/emails?from={{ sender|urlencode }}&has_completed=false'>{{ sender.pending_count }}</a></td>
<td><a href='/api/mail?sender={{ sender|urlencode }}'>{{ sender.email_count }}</a></td>
<td><a href='/api/mail?sender={{ sender|urlencode }}&has_error=true'>{{ sender.error_count }}</a></td>
<td><a href='/api/mail?sender={{ sender|urlencode }}&has_completed=false'>{{ sender.pending_count }}</a></td>
</tr>
{% empty %}
No data yet.

View File

@ -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)

View File

@ -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'),
]