Compare commits
1
Commits
main
...
domainforwards
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce05142fe1 |
No files matched your search
@@ -17,6 +17,9 @@ Then, to deploy via login.neuf.no, add the following to your personal ~/.ssh/con
|
|||||||
Then you can do
|
Then you can do
|
||||||
|
|
||||||
fab deploy
|
fab deploy
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
- Domain Aliases
|
||||||
|
|
||||||
# Inspiration:
|
# Inspiration:
|
||||||
- http://modoboa.readthedocs.org/
|
- http://modoboa.readthedocs.org/
|
||||||
|
|||||||
@@ -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')
|
||||||
@@ -1,9 +1,13 @@
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from passlib.hash import sha512_crypt
|
from passlib.hash import sha512_crypt
|
||||||
from .models import Alias, Domain, User
|
from .models import Alias, Domain, User
|
||||||
|
from .fields import EmailOrDomainAliasField
|
||||||
|
|
||||||
|
|
||||||
class AliasSerializer(serializers.ModelSerializer):
|
class AliasSerializer(serializers.ModelSerializer):
|
||||||
|
source = EmailOrDomainAliasField()
|
||||||
|
destination = EmailOrDomainAliasField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Alias
|
model = Alias
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user