|
|
|
from django.db.models import QuerySet
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
|
|
from assets.models import Custom, Platform, Asset
|
|
|
|
from common.const import UUID_PATTERN
|
|
|
|
from common.serializers import create_serializer_class
|
|
|
|
from common.serializers.common import DictSerializer, MethodSerializer
|
|
|
|
from .common import AssetSerializer
|
|
|
|
|
|
|
|
__all__ = ['CustomSerializer']
|
|
|
|
|
|
|
|
|
|
|
|
class CustomSerializer(AssetSerializer):
|
|
|
|
custom_info = MethodSerializer(label=_('Custom info'), required=False, allow_null=True)
|
|
|
|
|
|
|
|
class Meta(AssetSerializer.Meta):
|
|
|
|
model = Custom
|
|
|
|
fields = AssetSerializer.Meta.fields + ['custom_info']
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
if hasattr(self, 'initial_data') and not self.initial_data.get('custom_info'):
|
|
|
|
self.initial_data['custom_info'] = {}
|
|
|
|
|
|
|
|
def get_custom_info_serializer(self):
|
|
|
|
request = self.context.get('request')
|
|
|
|
default_field = DictSerializer()
|
|
|
|
|
|
|
|
if not request:
|
|
|
|
return default_field
|
|
|
|
|
|
|
|
if self.instance and isinstance(self.instance, (QuerySet, list)):
|
|
|
|
return default_field
|
|
|
|
|
|
|
|
if not self.instance and UUID_PATTERN.findall(request.path):
|
|
|
|
pk = UUID_PATTERN.findall(request.path)[0]
|
|
|
|
self.instance = Asset.objects.filter(id=pk).first()
|
|
|
|
|
|
|
|
platform = None
|
|
|
|
if self.instance:
|
|
|
|
platform = self.instance.platform
|
|
|
|
elif request.query_params.get('platform'):
|
|
|
|
platform_id = request.query_params.get('platform')
|
|
|
|
platform_id = int(platform_id) if platform_id.isdigit() else 0
|
|
|
|
platform = Platform.objects.filter(id=platform_id).first()
|
|
|
|
|
|
|
|
if not platform:
|
|
|
|
return default_field
|
|
|
|
custom_fields = platform.custom_fields
|
|
|
|
if not custom_fields:
|
|
|
|
return default_field
|
|
|
|
name = platform.name.title() + 'CustomSerializer'
|
|
|
|
return create_serializer_class(name, custom_fields)()
|