0001-manager-add-full-page-with-logs-and-basic-filtering-.patch
passerelle/templates/passerelle/includes/resource-logs-table.html | ||
---|---|---|
1 | 1 |
{% load i18n passerelle %} |
2 | 2 |
{% load tz %} |
3 | 3 | |
4 |
{% block content %} |
|
5 | 4 |
{% if logrecords %} |
6 | 5 |
<table class="main"> |
7 | 6 |
<thead> |
... | ... | |
27 | 26 |
{% else %} |
28 | 27 |
<p>{% trans 'No records found' %}</p> |
29 | 28 |
{% endif %} |
30 |
{% endblock %} |
passerelle/templates/passerelle/manage/service_logs.html | ||
---|---|---|
1 |
{% extends "passerelle/manage.html" %} |
|
2 |
{% load i18n passerelle %} |
|
3 | ||
4 |
{% block breadcrumb %} |
|
5 |
{{ block.super }} |
|
6 |
<a href="{{object.get_absolute_url}}">{{ object.title }}</a> |
|
7 |
<a href="#">{% trans "Logs" %}</a> |
|
8 |
{% endblock %} |
|
9 | ||
10 |
{% block appbar %} |
|
11 |
<h2>{% trans "Logs" %}</h2> |
|
12 |
{% endblock %} |
|
13 | ||
14 |
{% block content %} |
|
15 | ||
16 |
<div id="logs"> |
|
17 | ||
18 |
<form> |
|
19 |
<p><input name="q" type="search" value="{{query}}"> <button>{% trans 'Search' %}</button> |
|
20 |
<span class="help_text">{% trans "(supports text search in messages, or dates)" %}</span> |
|
21 |
</p> |
|
22 |
</form> |
|
23 | ||
24 |
{% include "passerelle/includes/resource-logs-table.html" with logrecords=page_obj %} |
|
25 |
</div> |
|
26 | ||
27 |
{% endblock %} |
passerelle/templates/passerelle/manage/service_view.html | ||
---|---|---|
87 | 87 | |
88 | 88 |
{% if perms.base.view_resourcelog %} |
89 | 89 |
<div id="logs" class="section"> |
90 |
<h3>{% trans "Logs" %}</h3> |
|
90 |
<h3>{% trans "Logs" %} |
|
91 |
<a href="{% url 'view-logs-connector' connector=object.get_connector_slug slug=object.slug %}">({% trans "full page & filter" %})</a> |
|
92 |
</h3> |
|
91 | 93 |
<div> |
92 | 94 |
{% block logs %} |
93 | 95 |
{% resource_logs_table resource=object %} |
passerelle/urls.py | ||
---|---|---|
9 | 9 |
from .views import (HomePageView, ManageView, ManageAddView, |
10 | 10 |
GenericCreateConnectorView, GenericDeleteConnectorView, |
11 | 11 |
GenericEditConnectorView, GenericEndpointView, GenericConnectorView, |
12 |
login, logout, menu_json) |
|
12 |
GenericViewLogsConnectorView, login, logout, menu_json)
|
|
13 | 13 |
from .urls_utils import decorated_includes, required, app_enabled, manager_required |
14 | 14 |
from .base.urls import access_urlpatterns |
15 | 15 |
from .plugins import register_apps_urls |
... | ... | |
72 | 72 |
GenericDeleteConnectorView.as_view(), name='delete-connector'), |
73 | 73 |
url(r'^(?P<slug>[\w,-]+)/edit$', |
74 | 74 |
GenericEditConnectorView.as_view(), name='edit-connector'), |
75 |
url(r'^(?P<slug>[\w,-]+)/logs$', |
|
76 |
GenericViewLogsConnectorView.as_view(), name='view-logs-connector'), |
|
75 | 77 |
]))) |
76 | 78 |
] |
77 | 79 |
passerelle/views.py | ||
---|---|---|
1 |
import datetime |
|
1 | 2 |
import inspect |
2 | 3 |
import json |
3 | 4 | |
... | ... | |
9 | 10 |
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseRedirect, Http404 |
10 | 11 |
from django.views.decorators.csrf import csrf_exempt |
11 | 12 |
from django.views.generic import (RedirectView, View, TemplateView, CreateView, |
12 |
DeleteView, UpdateView, DetailView) |
|
13 |
DeleteView, UpdateView, DetailView, ListView)
|
|
13 | 14 |
from django.views.generic.detail import SingleObjectMixin |
14 | 15 |
from django.conf import settings |
15 | 16 |
from django.shortcuts import resolve_url |
16 | 17 |
from django.core.urlresolvers import reverse |
18 |
from django.utils.timezone import make_aware |
|
17 | 19 |
from django.utils.translation import ugettext_lazy as _ |
18 | 20 |
from django.utils.encoding import force_text |
19 | 21 |
from django.forms.models import modelform_factory |
20 | 22 |
from django.forms.widgets import ClearableFileInput |
21 | 23 | |
24 |
from dateutil import parser as date_parser |
|
25 | ||
22 | 26 |
if 'mellon' in settings.INSTALLED_APPS: |
23 | 27 |
from mellon.utils import get_idps |
24 | 28 |
else: |
25 | 29 |
get_idps = lambda: [] |
26 | 30 | |
27 |
from passerelle.base.models import BaseResource |
|
31 |
from passerelle.base.models import BaseResource, ResourceLog
|
|
28 | 32 | |
29 | 33 |
from .utils import to_json, response_for_json, is_authorized |
30 | 34 |
from .forms import GenericConnectorForm |
... | ... | |
163 | 167 |
return reverse('manage-home') |
164 | 168 | |
165 | 169 | |
170 |
class GenericViewLogsConnectorView(GenericConnectorMixin, ListView): |
|
171 |
template_name = 'passerelle/manage/service_logs.html' |
|
172 |
paginate_by = 25 |
|
173 | ||
174 |
def get_context_data(self, **kwargs): |
|
175 |
context = super(GenericViewLogsConnectorView, self).get_context_data(**kwargs) |
|
176 |
context['object'] = self.get_object() |
|
177 |
context['query'] = self.request.GET.get('q') or '' |
|
178 |
return context |
|
179 | ||
180 |
def get_object(self): |
|
181 |
return self.model.objects.get(slug=self.kwargs['slug']) |
|
182 | ||
183 |
def get_queryset(self): |
|
184 |
qs = ResourceLog.objects.filter( |
|
185 |
appname=self.kwargs['connector'], |
|
186 |
slug=self.kwargs['slug']).order_by('-timestamp') |
|
187 |
query = self.request.GET.get('q') |
|
188 |
if query: |
|
189 |
try: |
|
190 |
date = date_parser.parse(query, dayfirst=True) |
|
191 |
except: |
|
192 |
qs = qs.filter(message__icontains=query) |
|
193 |
else: |
|
194 |
date = make_aware(date) |
|
195 |
qs = qs.filter(timestamp__gte=date, timestamp__lt=date + datetime.timedelta(days=1)) |
|
196 |
return qs |
|
197 | ||
198 | ||
166 | 199 |
class WrongParameter(Exception): |
167 | 200 |
http_status = 400 |
168 | 201 |
log_error = False |
169 |
- |