mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
Merge pull request #2692 from modoboa/fix/alarms_performance
Improved performance of API alarms endpoint.
This commit is contained in:
@@ -3,7 +3,7 @@ import repository from './repository'
|
||||
const resource = 'alarms'
|
||||
|
||||
export default {
|
||||
getAll () {
|
||||
return repository.get(`${resource}/`)
|
||||
getAll (params) {
|
||||
return repository.get(`${resource}/`, { params })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,9 +27,33 @@
|
||||
:items="alarms"
|
||||
:search="search"
|
||||
item-key="pk"
|
||||
:options.sync="options"
|
||||
:server-items-length="totalAlarms"
|
||||
:loading="loading"
|
||||
class="elevation-1"
|
||||
show-select
|
||||
>
|
||||
<template v-slot:item.status="{ item }">
|
||||
<v-chip
|
||||
v-if="item.status === 1"
|
||||
color="warning"
|
||||
small
|
||||
>
|
||||
<translate>Opened</translate>
|
||||
</v-chip>
|
||||
<v-chip
|
||||
v-else
|
||||
color="info"
|
||||
small
|
||||
>
|
||||
<translate>Closed</translate>
|
||||
</v-chip>
|
||||
</template>
|
||||
<template v-slot:item.mailbox="{ item }">
|
||||
<template v-if="item.mailbox">
|
||||
{{ item.mailbox.address }}@{{ item.domain.name }}
|
||||
</template>
|
||||
</template>
|
||||
<template v-slot:item.created="{ item }">
|
||||
{{ item.created|date }}
|
||||
</template>
|
||||
@@ -45,19 +69,51 @@ export default {
|
||||
return {
|
||||
alarms: [],
|
||||
headers: [
|
||||
{ text: this.$gettext('Date'), value: 'created' },
|
||||
{ text: this.$gettext('Domain'), value: 'domain.name' },
|
||||
{ text: this.$gettext('Mailbox'), value: 'mailbox.name' },
|
||||
{ text: this.$gettext('Triggered'), value: 'created' },
|
||||
{ text: this.$gettext('Status'), value: 'status' },
|
||||
{ text: this.$gettext('Domain'), value: 'domain.name', sortable: false },
|
||||
{ text: this.$gettext('Mailbox'), value: 'mailbox', sortable: false },
|
||||
{ text: this.$gettext('Message'), value: 'title' }
|
||||
],
|
||||
loading: true,
|
||||
options: {},
|
||||
search: '',
|
||||
selected: []
|
||||
selected: [],
|
||||
totalAlarms: 0
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
fetchAlarms () {
|
||||
const params = {
|
||||
page: this.options.page
|
||||
}
|
||||
if (this.options.sortBy) {
|
||||
params.ordering = this.options.sortBy.map(item => this.options.sortDesc[0] ? `-${item}` : item).join(',')
|
||||
}
|
||||
if (this.search !== '') {
|
||||
params.search = this.search
|
||||
}
|
||||
this.loading = true
|
||||
alarms.getAll(params).then(resp => {
|
||||
this.alarms = resp.data.results
|
||||
this.totalAlarms = resp.data.count
|
||||
this.loading = false
|
||||
})
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
alarms.getAll().then(resp => {
|
||||
this.alarms = resp.data
|
||||
})
|
||||
this.fetchAlarms()
|
||||
},
|
||||
watch: {
|
||||
options: {
|
||||
handler () {
|
||||
this.fetchAlarms()
|
||||
},
|
||||
deep: true
|
||||
},
|
||||
search () {
|
||||
this.fetchAlarms()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -7,7 +7,7 @@ from django.contrib.contenttypes.models import ContentType
|
||||
from django_filters import rest_framework as dj_filters
|
||||
from drf_spectacular.utils import extend_schema, extend_schema_view
|
||||
from rest_framework import (
|
||||
filters, mixins, parsers, permissions, response, status, viewsets
|
||||
filters, mixins, parsers, pagination, permissions, response, status, viewsets
|
||||
)
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.exceptions import PermissionDenied
|
||||
@@ -326,13 +326,17 @@ class UserAccountViewSet(viewsets.ViewSet):
|
||||
class AlarmViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
"""Viewset for Alarm."""
|
||||
|
||||
filter_backends = (filters.OrderingFilter, filters.SearchFilter, )
|
||||
ordering_fields = ["created", "status", "title"]
|
||||
pagination_class = pagination.PageNumberPagination
|
||||
permission_classes = (
|
||||
permissions.IsAuthenticated,
|
||||
)
|
||||
search_fields = ["domain__name", "title"]
|
||||
serializer_class = serializers.AlarmSerializer
|
||||
|
||||
def get_queryset(self):
|
||||
return models.Alarm.objects.filter(
|
||||
return models.Alarm.objects.select_related("domain").filter(
|
||||
domain__in=models.Domain.objects.get_for_admin(
|
||||
self.request.user)
|
||||
)
|
||||
).order_by("-created")
|
||||
|
||||
@@ -20,7 +20,7 @@ class AdminObjectManager(models.Manager):
|
||||
"""
|
||||
if admin.is_superuser:
|
||||
return self.get_queryset()
|
||||
return self.get_queryset().filter(owners__user=admin)
|
||||
return self.get_queryset().prefetch_related("owners").filter(owners__user=admin)
|
||||
|
||||
|
||||
class AdminObject(models.Model):
|
||||
|
||||
Reference in New Issue
Block a user