mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
Added logs section.
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
<template>
|
||||
<v-layout>
|
||||
<v-flex>
|
||||
<v-toolbar flat color="white">
|
||||
<v-toolbar-title>Logs</v-toolbar-title>
|
||||
<v-divider class="mx-2" inset vertical></v-divider>
|
||||
<v-spacer></v-spacer>
|
||||
<v-text-field
|
||||
v-model="search"
|
||||
append-icon="search"
|
||||
label="Search"
|
||||
single-line
|
||||
hide-details
|
||||
></v-text-field>
|
||||
</v-toolbar>
|
||||
<v-data-table :headers="headers"
|
||||
:items="logs"
|
||||
:search="search"
|
||||
class="elevation-1"
|
||||
v-bind:pagination.sync="pagination"
|
||||
>
|
||||
<template slot="items" slot-scope="props">
|
||||
<td>{{ props.item.date_created }}</td>
|
||||
<td>
|
||||
<v-chip v-if="props.item.level === 'INFO'"
|
||||
color="primary" text-color="white" small>
|
||||
{{ props.item.level }}
|
||||
</v-chip>
|
||||
<v-chip v-if="props.item.level === 'WARNING'"
|
||||
color="orange" text-color="white" small>
|
||||
{{ props.item.level }}
|
||||
</v-chip>
|
||||
<v-chip v-if="props.item.level === 'CRITICAL'"
|
||||
color="red" text-color="white" small>
|
||||
{{ props.item.level }}
|
||||
</v-chip>
|
||||
</td>
|
||||
<td>{{ props.item.logger }}</td>
|
||||
<td>{{ props.item.message }}</td>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</v-flex>
|
||||
</v-layout>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import * as api from '@/api'
|
||||
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
logs: [],
|
||||
headers: [
|
||||
{ text: 'Date', value: 'date_created' },
|
||||
{ text: 'Level', value: 'level' },
|
||||
{ text: 'Logger', value: 'logger' },
|
||||
{ text: 'Message', value: 'message' }
|
||||
],
|
||||
loading: true,
|
||||
pagination: {
|
||||
sortBy: 'date_created',
|
||||
descending: true,
|
||||
rowsPerPage: 10
|
||||
},
|
||||
search: ''
|
||||
}
|
||||
},
|
||||
created () {
|
||||
api.getLogs().then(response => {
|
||||
this.logs = response.data
|
||||
this.loading = false
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -88,7 +88,8 @@ export default {
|
||||
},
|
||||
{
|
||||
icon: 'search',
|
||||
text: 'Logs'
|
||||
text: 'Logs',
|
||||
to: { name: 'LogList' }
|
||||
},
|
||||
{
|
||||
icon: 'settings',
|
||||
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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")),
|
||||
|
||||
Reference in New Issue
Block a user