from rest_framework import serializers from django.utils.translation import ugettext_lazy as _ from common.drf.serializers import BulkModelSerializer, AdaptedBulkListSerializer from common.utils import is_uuid from ..models import ( Terminal, Status, Session, Task, CommandStorage, ReplayStorage ) from .components import ComponentsStateSerializer class TerminalSerializer(BulkModelSerializer): session_online = serializers.SerializerMethodField() is_alive = serializers.BooleanField(read_only=True) status = serializers.CharField(read_only=True) status_display = serializers.CharField(read_only=True) state = ComponentsStateSerializer(read_only=True) class Meta: model = Terminal fields = [ 'id', 'name', 'type', 'remote_addr', 'http_port', 'ssh_port', 'comment', 'is_accepted', "is_active", 'session_online', 'is_alive', 'date_created', 'command_storage', 'replay_storage', 'status', 'status_display', 'state' ] read_only_fields = ['type', 'date_created'] @staticmethod def get_kwargs_may_be_uuid(value): kwargs = {} if is_uuid(value): kwargs['id'] = value else: kwargs['name'] = value return kwargs def validate_command_storage(self, value): kwargs = self.get_kwargs_may_be_uuid(value) storage = CommandStorage.objects.filter(**kwargs).first() if storage: return storage.name else: raise serializers.ValidationError(_('Not found')) def validate_replay_storage(self, value): kwargs = self.get_kwargs_may_be_uuid(value) storage = ReplayStorage.objects.filter(**kwargs).first() if storage: return storage.name else: raise serializers.ValidationError(_('Not found')) @staticmethod def get_session_online(obj): return Session.objects.filter(terminal=obj, is_finished=False).count() class StatusSerializer(serializers.ModelSerializer): class Meta: fields = ['id', 'terminal'] model = Status class TaskSerializer(BulkModelSerializer): class Meta: fields = '__all__' model = Task list_serializer_class = AdaptedBulkListSerializer ref_name = 'TerminalTaskSerializer'