mirror of
https://github.com/MOIS3Y/logs-collector.git
synced 2025-02-01 01:10:52 +01:00
Add: StorageInfo serializer, url test change output from API storage-info
This commit is contained in:
parent
045cc3641f
commit
158c381ac4
@ -1,7 +1,9 @@
|
|||||||
|
from django import forms
|
||||||
from django_filters.rest_framework import (
|
from django_filters.rest_framework import (
|
||||||
CharFilter,
|
CharFilter,
|
||||||
FilterSet,
|
FilterSet,
|
||||||
NumberFilter,
|
NumberFilter,
|
||||||
|
BaseInFilter,
|
||||||
)
|
)
|
||||||
from django_filters import widgets
|
from django_filters import widgets
|
||||||
|
|
||||||
@ -9,21 +11,46 @@ from collector.models import Archive, Ticket
|
|||||||
from .utils import DateTimeFilterMixin
|
from .utils import DateTimeFilterMixin
|
||||||
|
|
||||||
|
|
||||||
|
class TextareaCSVWidget(widgets.BaseCSVWidget, forms.Textarea):
|
||||||
|
"""
|
||||||
|
The widget should create textarea.
|
||||||
|
"""
|
||||||
|
def render(self, name, value, attrs=None, renderer=None):
|
||||||
|
print("Row value: ", value)
|
||||||
|
if not self._isiterable(value):
|
||||||
|
value = [value]
|
||||||
|
|
||||||
|
if len(value) <= 1:
|
||||||
|
# delegate to main widget (Select, etc...) if not multiple values
|
||||||
|
value = value[0] if value else ''
|
||||||
|
return super(TextareaCSVWidget, self).render(name, value, attrs)
|
||||||
|
|
||||||
|
value = ','.join(value)
|
||||||
|
return super(TextareaCSVWidget, self).render(name, value, attrs)
|
||||||
|
|
||||||
|
|
||||||
|
class NumberInFilter(BaseInFilter, NumberFilter):
|
||||||
|
"""
|
||||||
|
The filter should accept coma separated integers.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class ArchiveFilter(DateTimeFilterMixin, FilterSet):
|
class ArchiveFilter(DateTimeFilterMixin, FilterSet):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Archive
|
model = Archive
|
||||||
fields = {
|
fields = {
|
||||||
'id': ['exact', 'in', 'lte', 'gte'],
|
'id': ['exact', 'lte', 'gte'],
|
||||||
'ticket': ['exact', 'in', 'lte', 'gte'],
|
'ticket': ['exact', 'lte', 'gte'],
|
||||||
'time_create': ['exact', 'lte', 'gte']
|
'time_create': ['exact', 'lte', 'gte']
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class TicketFilter(DateTimeFilterMixin, FilterSet):
|
class TicketFilter(DateTimeFilterMixin, FilterSet):
|
||||||
number = NumberFilter(
|
number = NumberInFilter(
|
||||||
field_name='number',
|
field_name='number',
|
||||||
widget=widgets.CSVWidget(),
|
widget=TextareaCSVWidget(),
|
||||||
)
|
)
|
||||||
user = CharFilter(
|
user = CharFilter(
|
||||||
field_name='user__username'
|
field_name='user__username'
|
||||||
|
@ -6,13 +6,13 @@ from drf_spectacular.openapi import OpenApiTypes
|
|||||||
from collector.models import Archive, Platform, Ticket
|
from collector.models import Archive, Platform, Ticket
|
||||||
|
|
||||||
|
|
||||||
@extend_schema_field(OpenApiTypes.NUMBER)
|
@extend_schema_field(OpenApiTypes.INT)
|
||||||
class TimestampField(serializers.Field):
|
class TimestampField(serializers.Field):
|
||||||
def to_representation(self, value) -> int:
|
def to_representation(self, value) -> int:
|
||||||
return value.timestamp()
|
return value.timestamp()
|
||||||
|
|
||||||
|
|
||||||
@extend_schema_field(OpenApiTypes.NUMBER)
|
@extend_schema_field(OpenApiTypes.INT)
|
||||||
class JsTimestampField(serializers.Field):
|
class JsTimestampField(serializers.Field):
|
||||||
def to_representation(self, value) -> int:
|
def to_representation(self, value) -> int:
|
||||||
return round(value.timestamp()*1000)
|
return round(value.timestamp()*1000)
|
||||||
@ -26,7 +26,7 @@ class PublicArchiveUploadSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class ArchiveSerializer(serializers.ModelSerializer):
|
class ArchiveSerializer(serializers.ModelSerializer):
|
||||||
time_create = JsTimestampField(read_only=True)
|
time_create = serializers.DateTimeField(read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Archive
|
model = Archive
|
||||||
@ -41,8 +41,8 @@ class PlatformSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class TicketSerializer(serializers.ModelSerializer):
|
class TicketSerializer(serializers.ModelSerializer):
|
||||||
time_create = JsTimestampField(read_only=True)
|
time_create = serializers.DateTimeField(read_only=True)
|
||||||
time_update = JsTimestampField(read_only=True)
|
time_update = serializers.DateTimeField(read_only=True)
|
||||||
token = serializers.UUIDField(read_only=True)
|
token = serializers.UUIDField(read_only=True)
|
||||||
user = serializers.ReadOnlyField(source='user.username')
|
user = serializers.ReadOnlyField(source='user.username')
|
||||||
|
|
||||||
@ -59,3 +59,10 @@ class TicketSerializer(serializers.ModelSerializer):
|
|||||||
'time_update',
|
'time_update',
|
||||||
'user'
|
'user'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class StorageInfoSerializer(serializers.Serializer):
|
||||||
|
total = serializers.IntegerField(read_only=True)
|
||||||
|
used = serializers.IntegerField(read_only=True)
|
||||||
|
free = serializers.IntegerField(read_only=True)
|
||||||
|
used_percent = serializers.IntegerField(read_only=True)
|
||||||
|
@ -29,3 +29,7 @@ class TestUrls(TestCase):
|
|||||||
def test_detail_platform_url_is_resolved(self):
|
def test_detail_platform_url_is_resolved(self):
|
||||||
url = reverse('collector_api:platform-detail', args=['vm6'])
|
url = reverse('collector_api:platform-detail', args=['vm6'])
|
||||||
self.assertEquals(resolve(url).func.cls, views.PlatformViewSet)
|
self.assertEquals(resolve(url).func.cls, views.PlatformViewSet)
|
||||||
|
|
||||||
|
def test_storage_info_url_is_resolved(self):
|
||||||
|
url = reverse('collector_api:storage-info')
|
||||||
|
self.assertEquals(resolve(url).func.cls, views.StorageInfo)
|
||||||
|
@ -28,7 +28,8 @@ from .serializers import (
|
|||||||
PublicArchiveUploadSerializer,
|
PublicArchiveUploadSerializer,
|
||||||
ArchiveSerializer,
|
ArchiveSerializer,
|
||||||
PlatformSerializer,
|
PlatformSerializer,
|
||||||
TicketSerializer
|
TicketSerializer,
|
||||||
|
StorageInfoSerializer,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -129,6 +130,6 @@ class TicketViewSet(viewsets.ModelViewSet):
|
|||||||
|
|
||||||
class StorageInfo(views.APIView):
|
class StorageInfo(views.APIView):
|
||||||
"""Info about storage total/used/free space"""
|
"""Info about storage total/used/free space"""
|
||||||
|
@extend_schema(responses=StorageInfoSerializer)
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
return Response(get_mount_fs_info(settings.MEDIA_ROOT))
|
return Response(get_mount_fs_info(settings.MEDIA_ROOT))
|
||||||
|
@ -13,4 +13,4 @@ def metadata(request):
|
|||||||
|
|
||||||
|
|
||||||
def storage_info(request):
|
def storage_info(request):
|
||||||
return get_mount_fs_info(settings.MEDIA_ROOT)
|
return {'storage': get_mount_fs_info(settings.MEDIA_ROOT)}
|
||||||
|
@ -38,7 +38,7 @@ const updateStorageInfo = () => {
|
|||||||
dataType: "json",
|
dataType: "json",
|
||||||
success: function (data, textStatus, jqXHR) {
|
success: function (data, textStatus, jqXHR) {
|
||||||
// JSON answer:
|
// JSON answer:
|
||||||
let storage = data.storage
|
let storage = data;
|
||||||
// set updated fields:
|
// set updated fields:
|
||||||
let storageInfoNewFields = [
|
let storageInfoNewFields = [
|
||||||
`Total: ${sizify(storage.total)}`,
|
`Total: ${sizify(storage.total)}`,
|
||||||
|
@ -35,4 +35,4 @@ def get_mount_fs_info(path):
|
|||||||
mount_info['used_percent'] = round(
|
mount_info['used_percent'] = round(
|
||||||
mount_info['used'] / mount_info['total'] * 100
|
mount_info['used'] / mount_info['total'] * 100
|
||||||
)
|
)
|
||||||
return {'storage': mount_info}
|
return mount_info
|
||||||
|
Loading…
Reference in New Issue
Block a user