Merge pull request #2692 from modoboa/fix/alarms_performance

Improved performance of API alarms endpoint.
This commit is contained in:
Antoine Nguyen
2022-11-16 09:38:48 +01:00
committed by GitHub
4 changed files with 73 additions and 13 deletions
+2 -2
View File
@@ -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 })
}
}
+63 -7
View File
@@ -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 -3
View File
@@ -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")
+1 -1
View File
@@ -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):