misc: rework views
This commit is contained in:
parent
2bca9792bd
commit
b0291ac42b
|
@ -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
|
||||
|
|
|
@ -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,
|
|
@ -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):
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
{% block content %}
|
||||
<h1>Logtracker</h1>
|
||||
|
||||
<h2>Entries</h2>
|
||||
<h2>Journal entries</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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.
|
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
@ -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'),
|
||||
]
|
||||
|
|
Reference in New Issue