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

api: add better validation to EventGraceidField

parent 752e89f5
No related branches found
No related tags found
No related merge requests found
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
from django.utils import six
from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from events.models import Event from events.models import Event
...@@ -11,10 +14,47 @@ logger = logging.getLogger(__name__) ...@@ -11,10 +14,47 @@ logger = logging.getLogger(__name__)
class EventGraceidField(GenericField, serializers.RelatedField): class EventGraceidField(GenericField, serializers.RelatedField):
default_error_messages = {
'invalid': _('Event graceid must be a string.'),
'bad_graceid': _('Not a valid graceid.'),
}
trim_whitespace = True
to_repr = 'graceid' to_repr = 'graceid'
lookup_field = 'id' lookup_field = 'pk'
model = Event model = Event
queryset = Event.objects.all() queryset = Event.objects.all()
def _validate_graceid(self, data):
# data should be a string at this point
prefix = data[0]
suffix = data[1:]
if not prefix in 'GEHMT':
self.fail('bad_graceid')
try:
suffix = int(suffix)
except ValueError:
self.fail('bad_graceid')
def to_internal_value(self, data):
# Add string validation
if not isinstance(data, six.string_types):
self.fail('invalid')
value = six.text_type(data)
if self.trim_whitespace:
value = value.strip()
# Convert to uppercase (allows g1234 to work)
value = value.upper()
# Graceid validation
self._validate_graceid(value)
return super(EventGraceidField, self).to_internal_value(value)
def get_model_dict(self, data): def get_model_dict(self, data):
return {self.lookup_field: data[1:]} return {self.lookup_field: data[1:]}
def get_does_not_exist_error(self, graceid):
err_msg = "Event with graceid {graceid} does not exist.".format(
graceid=graceid)
return err_msg
...@@ -121,10 +121,14 @@ class GenericField(fields.Field): ...@@ -121,10 +121,14 @@ class GenericField(fields.Field):
try: try:
return self.model.objects.get(**model_dict) return self.model.objects.get(**model_dict)
except self.model.DoesNotExist: except self.model.DoesNotExist:
error_msg = '{model} with {lf}={data} does not exist' \ if hasattr(self, 'get_does_not_exist_error'):
.format(model=self.model.__name__, lf=model_dict.keys()[0], err_msg = self.get_does_not_exist_error(data)
data=model_dict.values()[0]) else:
raise exceptions.ValidationError(error_msg) err_msg = '{model} with {lf}={data} does not exist'.format(
model=self.model.__name__, lf=model_dict.keys()[0],
data=model_dict.values()[0]
)
raise exceptions.ValidationError(err_msg)
def get_model_dict(self, data): def get_model_dict(self, data):
return {self.lookup_field: data} return {self.lookup_field: data}
......
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