Rename metadata parsers to metadata validators. Fix validators calling method, import and instance, instead previous key based lookup.

This commit is contained in:
Roberto Rosario
2015-06-30 17:35:35 -04:00
parent c7953a1cfb
commit 6ceb71d0b3
3 changed files with 21 additions and 25 deletions

View File

@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django import forms
from django.core.exceptions import ValidationError
from django.forms.formsets import formset_factory
from django.utils.module_loading import import_string
from django.utils.translation import ugettext_lazy as _
from .models import MetadataType
@@ -17,17 +18,13 @@ class MetadataForm(forms.Form):
def clean_value(self):
metadata_type = MetadataType.objects.get(pk=self.cleaned_data['id'])
try:
validation_function = setting_available_validators.value[metadata_type.validation]
except KeyError:
# User entered a validation function name, but was not found
# Return value entered as is
return self.cleaned_data['value']
else:
if metadata_type.validation:
validator = import_string(metadata_type.validation)()
try:
# If it is a parsing function we should get a value
# If it is a validation function we get nothing on success
result = validation_function(self.cleaned_data['value'])
result = validator.validate(self.cleaned_data['value'])
except Exception as exception:
# If it is a validation function and an exception is raise
# we wrap that into a new ValidationError exception
@@ -47,10 +44,9 @@ class MetadataForm(forms.Form):
# If it was a validation function and passed correctly we return
# the original input value
return result or self.cleaned_data['value']
# If a validation function was never specified we return the original
# value
return self.cleaned_data['value']
else:
# If a validator was never specified we return the original value
return self.cleaned_data['value']
def __init__(self, *args, **kwargs):
super(MetadataForm, self).__init__(*args, **kwargs)

View File

@@ -6,7 +6,7 @@ from django.utils.translation import ugettext_lazy as _
from smart_settings import Namespace
from .parsers import MetadataParser
from .validators import MetadataValidator
default_available_functions = {
'current_date': now().date,
@@ -17,6 +17,6 @@ default_available_models = {
}
namespace = Namespace(name='metadata', label=_('Metadata'))
setting_available_validators = namespace.add_setting(global_name='METADATA_AVAILABLE_VALIDATORS', default=MetadataParser.get_import_paths())
setting_available_validators = namespace.add_setting(global_name='METADATA_AVAILABLE_VALIDATORS', default=MetadataValidator.get_import_paths())
setting_available_functions = namespace.add_setting(global_name='METADATA_AVAILABLE_FUNCTIONS', default=default_available_functions)
setting_available_models = namespace.add_setting(global_name='METADATA_AVAILABLE_MODELS', default=default_available_models)

View File

@@ -3,7 +3,7 @@ from __future__ import unicode_literals
from dateutil.parser import parse
class MetadataParser(object):
class MetadataValidator(object):
_registry = []
@classmethod
@@ -20,27 +20,27 @@ class MetadataParser(object):
@classmethod
def get_import_paths(cls):
return [parser.get_import_path() for parser in cls.get_all()]
return [validator.get_import_path() for validator in cls.get_all()]
def parse(self, input_data):
raise NotImplementedError
class DateAndTimeParser(MetadataParser):
def parse(self, input_data):
class DateAndTimeValidator(MetadataValidator):
def validate(self, input_data):
return parse(input_data).isoformat()
class DateParser(MetadataParser):
def parse(self, input_data):
class DateValidator(MetadataValidator):
def validate(self, input_data):
return parse(input_data).date().isoformat()
class TimeParser(MetadataParser):
def parse(self, input_data):
class TimeValidator(MetadataValidator):
def validate(self, input_data):
return parse(input_data).time().isoformat()
MetadataParser.register(DateAndTimeParser)
MetadataParser.register(DateParser)
MetadataParser.register(TimeParser)
MetadataValidator.register(DateAndTimeValidator)
MetadataValidator.register(DateValidator)
MetadataValidator.register(TimeValidator)