From 61e1fb2d7a4944fa2dc60f9ec1fecd554e392d1f Mon Sep 17 00:00:00 2001 From: Elias Date: Sat, 27 Jan 2018 10:04:52 +0100 Subject: [PATCH 3/4] added class-based view GenericConnectorLogView --- passerelle/urls.py | 3 +++ passerelle/views.py | 48 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/passerelle/urls.py b/passerelle/urls.py index c98af21..a60bdd9 100644 --- a/passerelle/urls.py +++ b/passerelle/urls.py @@ -9,6 +9,7 @@ from django.views.static import serve as static_serve from .views import (HomePageView, ManageView, ManageAddView, GenericCreateConnectorView, GenericDeleteConnectorView, GenericEditConnectorView, GenericEndpointView, GenericConnectorView, + GenericConnectorLogView, login, logout, menu_json) from .urls_utils import decorated_includes, required, app_enabled, manager_required from .base.urls import access_urlpatterns @@ -78,6 +79,8 @@ urlpatterns += [ urlpatterns += [ url(r'^(?P[\w,-]+)/(?P[\w,-]+)/$', GenericConnectorView.as_view(), name='view-connector'), + url(r'^(?P[\w,-]+)/(?P[\w,-]+)/logs.json$', + GenericConnectorLogView.as_view(), name='view-connector-log'), url(r'^(?P[\w,-]+)/(?P[\w,-]+)/(?P[\w,-]+)(?:/(?P.*))?$', GenericEndpointView.as_view(), name='generic-endpoint') ] diff --git a/passerelle/views.py b/passerelle/views.py index dcadcce..c58f6ce 100644 --- a/passerelle/views.py +++ b/passerelle/views.py @@ -1,5 +1,7 @@ import inspect import json +import pytz +from datetime import datetime from django.apps import apps from django.conf.urls import url @@ -14,8 +16,10 @@ 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.core.paginator import EmptyPage, PageNotAnInteger from django.utils.translation import ugettext_lazy as _ from django.utils.encoding import force_text +from django.utils.timezone import make_aware from django.forms.models import modelform_factory from django.forms.widgets import ClearableFileInput @@ -24,7 +28,7 @@ if 'mellon' in settings.INSTALLED_APPS: 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 @@ -137,6 +141,48 @@ class GenericConnectorView(GenericConnectorMixin, DetailView): template_names.append('passerelle/manage/service_view.html') return template_names +class GenericConnectorLogView(GenericConnectorMixin, View): + + content_type = 'application/json' + epoch = make_aware(datetime(1970,1,1)) + + def totimestamp(self, datetime_obj): + td = datetime_obj - self.epoch + # return td.total_seconds() + return int((td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3) + + def resource_logs_table(self, request, *args, **kwargs): + if 'slug' not in kwargs: + raise HttpResponseBadRequest('URL must specify a slug value') + if 'connector' not in kwargs: + raise HttpResponseBadRequest('URL must specify a connector value') + page = request.GET.get('page', 1) + return ResourceLog.objects.get_paginated_logs(kwargs['connector'], kwargs['slug'], page) + + def get(self, request, *args, **kwargs): + page_obj = self.resource_logs_table(request, *args, **kwargs) + # no previous or next is representezd a None value + try: + previous_page_number = page_obj.previous_page_number() + except (EmptyPage,): + previous_page_number = None + try: + next_page_number = page_obj.next_page_number() + except (EmptyPage,): + next_page_number = None + return response_for_json(request, dict([ + ('count', page_obj.paginator.count), + ('page_range', list(page_obj.paginator.page_range)), + ('number', page_obj.number), + ('next_page_number', next_page_number), + ('previous_page_number', previous_page_number), + ('logs', [dict([('message', log.message), + ('timestamp', self.totimestamp(log.timestamp)), + ('level', log.level), + ('extra', log.extra), + ('sourceip', log.sourceip)]) for log in page_obj]) + ])) + class GenericCreateConnectorView(GenericConnectorMixin, CreateView): template_name = 'passerelle/manage/service_form.html' -- 2.17.0