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
1 merge request!8Superevents
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