Skip to content
Snippets Groups Projects
Commit fdf64011 authored by Tanner Prestegard's avatar Tanner Prestegard Committed by GraceDB
Browse files

Created CommaSeparatedOrList field

New CommaSeparatedOrListField type which accepts a comma-separated
string (and splits it into a list) or a list input.  Useful for
handling input from the web interface as well as from the Python
client in either form.
parent 5ff2cbb4
No related branches found
No related tags found
No related merge requests found
from rest_framework import fields
import six
import logging
logger = logging.getLogger(__name__)
class CustomHiddenDefault(fields.CurrentUserDefault):
context_key = None
......@@ -37,3 +42,25 @@ class ParentObjectDefault(CustomHiddenDefault):
value = value()
#value = serializer_field.context['view'].get_parent()
return value
class CommaSeparatedOrListField(fields.ListField):
default_style = {'base_template': 'input.html'}
def __init__(self, *args, **kwargs):
super(CommaSeparatedOrListField, self).__init__(*args, **kwargs)
# Set form style for browsable API
self.style = kwargs.get('style', self.default_style)
def to_internal_value(self, data):
# Empirical tests with HTML forms indicate that if we enter
# something like 1,2,3 in a form, we will get something like
# [u'1,2,3'] here. So if we get input like that, we convert it
# to [u'1', u'2', u'3'], then pass it to the base class's
# to_internal_value() method. Might not be safe for cases where
# a list contains CharFields which might have commas in them.
if (isinstance(data, list) and len(data) == 1 and
isinstance(data[0], six.string_types)):
data = data[0].split(',')
return super(CommaSeparatedOrListField, self).to_internal_value(data)
......@@ -5,7 +5,7 @@ from django.conf import settings
from ..models import Superevent, Labelling, Log, VOEvent, EMObservation, \
EMFootprint
from .fields import ParentObjectDefault
from .fields import ParentObjectDefault, CommaSeparatedOrListField
from .settings import SUPEREVENT_LOOKUP_FIELD
from events.models import Event, Label, Tag, EMGroup
......@@ -14,6 +14,7 @@ from events.api.fields import EventGraceidField
UserModel = get_user_model()
import os
import functools
import logging
logger = logging.getLogger(__name__)
......@@ -448,17 +449,17 @@ class SupereventEMObservationSerializer(serializers.ModelSerializer):
default=serializers.CurrentUserDefault())
superevent = serializers.HiddenField(write_only=True,
default=ParentObjectDefault(context_key='superevent'))
ra_list = serializers.ListField(child=serializers.FloatField(),
ra_list = CommaSeparatedOrListField(child=serializers.FloatField(),
write_only=True)
dec_list = serializers.ListField(child=serializers.FloatField(),
dec_list = CommaSeparatedOrListField(child=serializers.FloatField(),
write_only=True)
ra_width_list = serializers.ListField(child=serializers.FloatField(),
ra_width_list = CommaSeparatedOrListField(child=serializers.FloatField(),
write_only=True)
dec_width_list = serializers.ListField(child=serializers.FloatField(),
dec_width_list = CommaSeparatedOrListField(child=serializers.FloatField(),
write_only=True)
start_time_list = serializers.ListField(child=serializers.DateTimeField(),
write_only=True)
duration_list = serializers.ListField(
start_time_list = CommaSeparatedOrListField(
child=serializers.DateTimeField(), write_only=True)
duration_list = CommaSeparatedOrListField(
child=serializers.IntegerField(min_value=0), write_only=True)
class Meta:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment