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

custom serializer fields for events, to be used in superevent serialization

parent 633561d8
No related branches found
No related tags found
No related merge requests found
from rest_framework import serializers
from django.contrib.auth import get_user_model
from ..models import Event
UserModel = get_user_model()
import logging
logger = logging.getLogger(__name__)
class GenericField(serializers.Field):
# Field, property, or callable of the object which will be used to
# generate the representation of the object.
to_repr = None
lookup_field = 'id'
model = None
def __init__(self, *args, **kwargs):
self.to_repr = kwargs.pop('to_repr', self.to_repr)
self.lookup_field = kwargs.pop('lookup_field', self.lookup_field)
self.model = kwargs.pop('model', self.model)
assert self.to_repr is not None, ('Must specify to_repr')
assert self.model is not None, ('Must specify model')
super(GenericField, self).__init__(*args, **kwargs)
def to_representation(self, obj):
value = getattr(obj, self.to_repr)
# Handle case where we are given a function instead of
# a model field or a property
if callable(value):
value = value()
return value
def to_internal_value(self, data):
model_dict = self.get_model_dict(data)
try:
return self.model.objects.get(**model_dict)
except self.model.DoesNotExist:
error_msg = '{model} with {lf}={data} does not exist' \
.format(model=self.model.__name__, lf=model_dict.keys()[0],
data=model_dict.values()[0])
raise serializers.ValidationError(error_msg)
def get_model_dict(self, data):
return {self.lookup_field: data}
class EventGraceidField(GenericField, serializers.RelatedField):
to_repr = 'graceid'
lookup_field = 'id'
model = Event
queryset = Event.objects.all()
def get_model_dict(self, data):
return {self.lookup_field: data[1:]}
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