From 7a929467388cc6ae7a21a262fa99119910338ca3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 17 Apr 2018 17:38:33 +0200 Subject: [PATCH] manager: add full page with logs and basic filtering (#14671) --- .../includes/resource-logs-table.html | 2 - .../passerelle/manage/service_logs.html | 27 ++++++++++++++ .../passerelle/manage/service_view.html | 4 +- passerelle/urls.py | 4 +- passerelle/views.py | 37 ++++++++++++++++++- 5 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 passerelle/templates/passerelle/manage/service_logs.html diff --git a/passerelle/templates/passerelle/includes/resource-logs-table.html b/passerelle/templates/passerelle/includes/resource-logs-table.html index b618174..7c57460 100644 --- a/passerelle/templates/passerelle/includes/resource-logs-table.html +++ b/passerelle/templates/passerelle/includes/resource-logs-table.html @@ -1,7 +1,6 @@ {% load i18n passerelle %} {% load tz %} -{% block content %} {% if logrecords %} @@ -27,4 +26,3 @@ {% else %}

{% trans 'No records found' %}

{% endif %} -{% endblock %} diff --git a/passerelle/templates/passerelle/manage/service_logs.html b/passerelle/templates/passerelle/manage/service_logs.html new file mode 100644 index 0000000..60ccf22 --- /dev/null +++ b/passerelle/templates/passerelle/manage/service_logs.html @@ -0,0 +1,27 @@ +{% extends "passerelle/manage.html" %} +{% load i18n passerelle %} + +{% block breadcrumb %} +{{ block.super }} +{{ object.title }} +{% trans "Logs" %} +{% endblock %} + +{% block appbar %} +

{% trans "Logs" %}

+{% endblock %} + +{% block content %} + +
+ +
+

+ {% trans "(supports text search in messages, or dates)" %} +

+ + +{% include "passerelle/includes/resource-logs-table.html" with logrecords=page_obj %} +
+ +{% endblock %} diff --git a/passerelle/templates/passerelle/manage/service_view.html b/passerelle/templates/passerelle/manage/service_view.html index e88c05f..6a24b4e 100644 --- a/passerelle/templates/passerelle/manage/service_view.html +++ b/passerelle/templates/passerelle/manage/service_view.html @@ -87,7 +87,9 @@ {% if perms.base.view_resourcelog %}
-

{% trans "Logs" %}

+

{% trans "Logs" %} + ({% trans "full page & filter" %}) +

{% block logs %} {% resource_logs_table resource=object %} diff --git a/passerelle/urls.py b/passerelle/urls.py index 7a136ec..5a9fb2a 100644 --- a/passerelle/urls.py +++ b/passerelle/urls.py @@ -9,7 +9,7 @@ from django.views.static import serve as static_serve from .views import (HomePageView, ManageView, ManageAddView, GenericCreateConnectorView, GenericDeleteConnectorView, GenericEditConnectorView, GenericEndpointView, GenericConnectorView, - login, logout, menu_json) + GenericViewLogsConnectorView, login, logout, menu_json) from .urls_utils import decorated_includes, required, app_enabled, manager_required from .base.urls import access_urlpatterns from .plugins import register_apps_urls @@ -72,6 +72,8 @@ urlpatterns += [ GenericDeleteConnectorView.as_view(), name='delete-connector'), url(r'^(?P[\w,-]+)/edit$', GenericEditConnectorView.as_view(), name='edit-connector'), + url(r'^(?P[\w,-]+)/logs$', + GenericViewLogsConnectorView.as_view(), name='view-logs-connector'), ]))) ] diff --git a/passerelle/views.py b/passerelle/views.py index dcadcce..890d7e3 100644 --- a/passerelle/views.py +++ b/passerelle/views.py @@ -1,3 +1,4 @@ +import datetime import inspect import json @@ -9,22 +10,25 @@ from django.contrib.auth import views as auth_views from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseRedirect, Http404 from django.views.decorators.csrf import csrf_exempt from django.views.generic import (RedirectView, View, TemplateView, CreateView, - DeleteView, UpdateView, DetailView) + DeleteView, UpdateView, DetailView, ListView) from django.views.generic.detail import SingleObjectMixin from django.conf import settings from django.shortcuts import resolve_url from django.core.urlresolvers import reverse +from django.utils.timezone import make_aware from django.utils.translation import ugettext_lazy as _ from django.utils.encoding import force_text from django.forms.models import modelform_factory from django.forms.widgets import ClearableFileInput +from dateutil import parser as date_parser + if 'mellon' in settings.INSTALLED_APPS: from mellon.utils import get_idps else: get_idps = lambda: [] -from passerelle.base.models import BaseResource +from passerelle.base.models import BaseResource, ResourceLog from .utils import to_json, response_for_json, is_authorized from .forms import GenericConnectorForm @@ -163,6 +167,35 @@ class GenericDeleteConnectorView(GenericConnectorMixin, DeleteView): return reverse('manage-home') +class GenericViewLogsConnectorView(GenericConnectorMixin, ListView): + template_name = 'passerelle/manage/service_logs.html' + paginate_by = 25 + + def get_context_data(self, **kwargs): + context = super(GenericViewLogsConnectorView, self).get_context_data(**kwargs) + context['object'] = self.get_object() + context['query'] = self.request.GET.get('q') or '' + return context + + def get_object(self): + return self.model.objects.get(slug=self.kwargs['slug']) + + def get_queryset(self): + qs = ResourceLog.objects.filter( + appname=self.kwargs['connector'], + slug=self.kwargs['slug']).order_by('-timestamp') + query = self.request.GET.get('q') + if query: + try: + date = date_parser.parse(query, dayfirst=True) + except: + qs = qs.filter(message__icontains=query) + else: + date = make_aware(date) + qs = qs.filter(timestamp__gte=date, timestamp__lt=date + datetime.timedelta(days=1)) + return qs + + class WrongParameter(Exception): http_status = 400 log_error = False -- 2.17.0