Don not allow duplicate aliases, lowercase some fields
This commit is contained in:
1 parent
223d8392ea
commit
7beffd299d
5 files changed
+50
-16
No files matched your search
@@ -18,14 +18,6 @@ Then you can do
|
||||
|
||||
fab deploy
|
||||
|
||||
|
||||
# TODO
|
||||
- Alias should only allow unique (source,destination) tuples
|
||||
- lowercase domain, alias and user on save
|
||||
|
||||
# TODO later
|
||||
- Create domain dir for dovecot?
|
||||
|
||||
# Inspiration:
|
||||
- http://modoboa.readthedocs.org/
|
||||
- https://github.com/lgunsch/django-vmail
|
||||
@@ -0,0 +1,18 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('dpdapi', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterUniqueTogether(
|
||||
name='alias',
|
||||
unique_together=set([('source', 'destination', 'domain')]),
|
||||
),
|
||||
]
|
||||
@@ -19,8 +19,15 @@ class Alias(BaseModel):
|
||||
def __unicode__(self):
|
||||
return "{}={}".format(self.source, self.destination)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.source = self.source.lower()
|
||||
self.destination = self.destination.lower()
|
||||
|
||||
super(Alias, self).save(*args, **kwargs)
|
||||
|
||||
class Meta:
|
||||
verbose_name_plural = 'aliases'
|
||||
unique_together = ('source', 'destination', 'domain')
|
||||
|
||||
|
||||
class Domain(BaseModel):
|
||||
@@ -29,6 +36,11 @@ class Domain(BaseModel):
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.name = self.name.lower()
|
||||
|
||||
super(Domain, self).save(*args, **kwargs)
|
||||
|
||||
|
||||
class User(BaseModel):
|
||||
email = models.EmailField(max_length=254, unique=True)
|
||||
@@ -38,3 +50,8 @@ class User(BaseModel):
|
||||
def __unicode__(self):
|
||||
return self.email
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.email = self.email.lower()
|
||||
|
||||
super(User, self).save(*args, **kwargs)
|
||||
|
||||
@@ -8,6 +8,12 @@ class AliasSerializer(serializers.ModelSerializer):
|
||||
model = Alias
|
||||
|
||||
|
||||
class AliasDeleteSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Alias
|
||||
validators = [] # No Unique togheter check on deletion
|
||||
|
||||
|
||||
class DomainSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Domain
|
||||
|
||||
+9
-8
@@ -9,7 +9,7 @@ from rest_framework import status, filters, viewsets
|
||||
|
||||
from dpdapi.filters import AliasRegexFilterBackend
|
||||
from dpdapi.models import Alias, Domain, User
|
||||
from dpdapi.serializers import AliasSerializer, DomainSerializer, UserSerializer
|
||||
from dpdapi.serializers import AliasSerializer, AliasDeleteSerializer, DomainSerializer, UserSerializer
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -26,16 +26,17 @@ class AliasViewSet(viewsets.ModelViewSet):
|
||||
@list_route(methods=['post'])
|
||||
def create_bulk(self, request):
|
||||
serializer = AliasSerializer(data=request.data, many=True)
|
||||
if serializer.is_valid():
|
||||
serializer.save()
|
||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
serializer.save()
|
||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||
|
||||
@list_route(methods=['delete'])
|
||||
def delete_bulk(self, request):
|
||||
serializer = AliasSerializer(data=request.data, many=True)
|
||||
if not serializer.is_valid():
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
serializer = AliasDeleteSerializer(data=request.data, many=True)
|
||||
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
# Ref: http://michelepasin.org/blog/2010/07/20/the-power-of-djangos-q-objects/
|
||||
q_list = map(lambda x: Q(**x), serializer.initial_data)
|
||||
|
||||
Reference in new issue
Block a user