Add: StorageInfo serializer, url test change output from API storage-info

This commit is contained in:
Stepan Zhukovsky 2023-09-08 16:02:34 +09:00
parent 045cc3641f
commit 158c381ac4
7 changed files with 53 additions and 14 deletions

View File

@ -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'

View File

@ -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)

View File

@ -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)

View File

@ -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))

View File

@ -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)}

View File

@ -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)}`,

View File

@ -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