diff --git a/frontend/src/api.js b/frontend/src/api.js index bdc51d053..5f1015203 100644 --- a/frontend/src/api.js +++ b/frontend/src/api.js @@ -39,3 +39,9 @@ export const getParametersStructure = (app) => { export const saveParametersForApplication = (app, values) => { return parametersResource.update({app: app}, values) } + +var logResource = Vue.resource('/api/v1/logs{/pk}/') + +export const getLogs = () => { + return logResource.get() +} diff --git a/frontend/src/components/logs/LogList.vue b/frontend/src/components/logs/LogList.vue new file mode 100644 index 000000000..52330c3c3 --- /dev/null +++ b/frontend/src/components/logs/LogList.vue @@ -0,0 +1,75 @@ + + + + + Logs + + + + + + + {{ props.item.date_created }} + + + {{ props.item.level }} + + + {{ props.item.level }} + + + {{ props.item.level }} + + + {{ props.item.logger }} + {{ props.item.message }} + + + + + + + diff --git a/frontend/src/components/navigation/Navbar.vue b/frontend/src/components/navigation/Navbar.vue index 646bccd9e..0c317ffa9 100644 --- a/frontend/src/components/navigation/Navbar.vue +++ b/frontend/src/components/navigation/Navbar.vue @@ -88,7 +88,8 @@ export default { }, { icon: 'search', - text: 'Logs' + text: 'Logs', + to: { name: 'LogList' } }, { icon: 'settings', diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index 8aee91762..a29a73d63 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -3,6 +3,7 @@ import Router from 'vue-router' import DomainList from '@/components/domains/DomainList' import DomainForm from '@/components/domains/DomainForm' import ParametersForm from '@/components/parameters/ParametersForm' +import LogList from '@/components/logs/LogList' Vue.use(Router) @@ -27,6 +28,11 @@ export default new Router({ path: '/parameters/:app', name: 'ParametersEdit', component: ParametersForm + }, + { + path: '/logs/', + name: 'LogList', + component: LogList } ] }) diff --git a/modoboa/core/serializers.py b/modoboa/core/serializers.py index e2af068c7..5aac556c1 100644 --- a/modoboa/core/serializers.py +++ b/modoboa/core/serializers.py @@ -1,5 +1,6 @@ """Core serializers.""" +from django.utils import formats from django.utils.translation import ugettext_lazy, ugettext as _ from django.contrib.auth import password_validation @@ -9,6 +10,7 @@ from rest_framework import serializers from modoboa.lib import fields as lib_fields from . import constants +from . import models class CoreGlobalParametersSerializer(serializers.Serializer): @@ -125,3 +127,16 @@ class CoreGlobalParametersSerializer(serializers.Serializer): if len(errors): raise serializers.ValidationError(errors) return data + + +class LogSerializer(serializers.ModelSerializer): + """Log serializer.""" + + date_created = serializers.SerializerMethodField() + + class Meta: + model = models.Log + fields = ("date_created", "message", "level", "logger") + + def get_date_created(self, log): + return formats.date_format(log.date_created, "SHORT_DATETIME_FORMAT") diff --git a/modoboa/core/urls_api.py b/modoboa/core/urls_api.py new file mode 100644 index 000000000..0c2ab0d76 --- /dev/null +++ b/modoboa/core/urls_api.py @@ -0,0 +1,11 @@ +"""Core API urls.""" + +from rest_framework import routers + +from . import viewsets + + +router = routers.SimpleRouter() +router.register(r"logs", viewsets.LogViewSet) + +urlpatterns = router.urls diff --git a/modoboa/core/viewsets.py b/modoboa/core/viewsets.py new file mode 100644 index 000000000..66eea776c --- /dev/null +++ b/modoboa/core/viewsets.py @@ -0,0 +1,17 @@ +"""Core viewsets.""" + +from rest_framework import permissions, viewsets + +from . import models +from . import serializers + + +class LogViewSet(viewsets.ReadOnlyModelViewSet): + """Log viewset.""" + + permission_classes = ( + permissions.IsAuthenticated, + permissions.DjangoModelPermissions, + ) + queryset = models.Log.objects.all() + serializer_class = serializers.LogSerializer diff --git a/modoboa/urls_api.py b/modoboa/urls_api.py index ca24ad5da..e5b4fc088 100644 --- a/modoboa/urls_api.py +++ b/modoboa/urls_api.py @@ -9,6 +9,7 @@ from django.conf.urls import include, url from modoboa.core.extensions import exts_pool urlpatterns = [ + url("", include("modoboa.core.urls_api")), url("", include("modoboa.admin.urls_api")), url("", include("modoboa.parameters.urls_api")), url("", include("modoboa.limits.urls_api")),