From ce05142fe1f22ee2647ec136d4264d802a94905c Mon Sep 17 00:00:00 2001 From: Nikolai R Kristiansen Date: Sat, 31 Jan 2015 14:52:39 +0100 Subject: [PATCH] Domain Alias support in API, missing custom validation in admin interface --- README.md | 3 +++ dpdapi/fields.py | 40 ++++++++++++++++++++++++++++++++++++++++ dpdapi/serializers.py | 4 ++++ 3 files changed, 47 insertions(+) create mode 100644 dpdapi/fields.py diff --git a/README.md b/README.md index 898c8e8..75dde9b 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,9 @@ Then, to deploy via login.neuf.no, add the following to your personal ~/.ssh/con Then you can do fab deploy + +# TODO + - Domain Aliases # Inspiration: - http://modoboa.readthedocs.org/ diff --git a/dpdapi/fields.py b/dpdapi/fields.py new file mode 100644 index 0000000..d25aaef --- /dev/null +++ b/dpdapi/fields.py @@ -0,0 +1,40 @@ +from django.core.exceptions import ValidationError +from django.utils import six + + +from rest_framework.fields import CharField, EmailValidator +from django.utils.translation import ugettext_lazy as _ + + +def domain_alias_validator(value): + if not value.startswith('@'): + raise ValidationError('Not valid') + + EmailValidator().validate_domain_part(value.split('@')) + + +class EmailOrDomainAliasField(CharField): + default_error_messages = { + 'invalid': _('Enter a valid email address or domain alias.'), + } + + def to_internal_value(self, data): + return six.text_type(data).strip() + + def to_representation(self, value): + email_validator = EmailValidator(message=self.default_error_messages['invalid']) + # Try email validation first + try: + email_validator(value) + return six.text_type(value).strip() # Valid email + except ValidationError: + pass + + # Try domain forward validation + try: + domain_alias_validator(value) + return six.text_type(value).strip() # Valid domain alias + except ValidationError: + pass + + raise ValidationError(self.default_error_messages, code='invalid') \ No newline at end of file diff --git a/dpdapi/serializers.py b/dpdapi/serializers.py index a10de99..6530221 100644 --- a/dpdapi/serializers.py +++ b/dpdapi/serializers.py @@ -1,9 +1,13 @@ from rest_framework import serializers from passlib.hash import sha512_crypt from .models import Alias, Domain, User +from .fields import EmailOrDomainAliasField class AliasSerializer(serializers.ModelSerializer): + source = EmailOrDomainAliasField() + destination = EmailOrDomainAliasField() + class Meta: model = Alias