48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
import json
|
|
|
|
# Third party
|
|
import six
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from rest_framework import serializers
|
|
|
|
|
|
class SingleTag(str):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
pass
|
|
|
|
def __str__(self):
|
|
return json.dumps(self)
|
|
|
|
|
|
class SingleTagSerializerField(serializers.Field):
|
|
child = serializers.CharField()
|
|
default_error_messages = {
|
|
'invalid_json': _('Invalid json str. A tag list submitted in string'
|
|
' form must be valid json.'),
|
|
'not_a_str': _('Expected a string but got type "{input_type}".')
|
|
}
|
|
order_by = None
|
|
|
|
def __init__(self, **kwargs):
|
|
super(SingleTagSerializerField, self).__init__(**kwargs)
|
|
|
|
def to_internal_value(self, value):
|
|
if isinstance(value, six.string_types):
|
|
if not value:
|
|
value = ""
|
|
|
|
if not isinstance(value, str):
|
|
self.fail('not_a_str', input_type=type(value).__name__)
|
|
|
|
return value
|
|
|
|
def to_representation(self, value):
|
|
if not isinstance(value, SingleTag):
|
|
if not isinstance(value, str):
|
|
value = value.name
|
|
value = SingleTag(value)
|
|
return value
|
|
|