django-orchestra/orchestra/contrib/domains/serializers.py

83 lines
3 KiB
Python
Raw Normal View History

2014-05-08 16:59:35 +00:00
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
2014-05-08 16:59:35 +00:00
from rest_framework import serializers
2014-10-15 21:18:50 +00:00
from orchestra.api.serializers import HyperlinkedModelSerializer
2015-04-05 10:46:24 +00:00
from orchestra.contrib.accounts.serializers import AccountSerializerMixin
2014-05-08 16:59:35 +00:00
from .helpers import domain_for_validation
from .models import Domain, Record
from . import validators
class RecordSerializer(serializers.ModelSerializer):
class Meta:
model = Record
fields = ('type', 'value')
def get_identity(self, data):
return data.get('value')
2014-10-15 21:18:50 +00:00
class DomainSerializer(AccountSerializerMixin, HyperlinkedModelSerializer):
2014-05-08 16:59:35 +00:00
""" Validates if this zone generates a correct zone file """
records = RecordSerializer(required=False, many=True)
2014-05-08 16:59:35 +00:00
class Meta:
model = Domain
2015-04-30 09:51:55 +00:00
fields = ('url', 'id', 'name', 'records')
2014-10-15 21:18:50 +00:00
postonly_fields = ('name',)
2014-05-08 16:59:35 +00:00
2014-10-20 15:51:24 +00:00
def clean_name(self, attrs, source):
""" prevent users creating subdomains of other users domains """
name = attrs[source]
parent = Domain.objects.get_parent(name)
2015-04-29 21:35:56 +00:00
if parent and parent.account != self.account:
2014-10-20 15:51:24 +00:00
raise ValidationError(_("Can not create subdomains of other users domains"))
return attrs
2015-05-18 15:21:42 +00:00
def validate(self, data):
2014-05-08 16:59:35 +00:00
""" Checks if everything is consistent """
2015-05-18 15:21:42 +00:00
data = super(DomainSerializer, self).validate(data)
name = data.get('name')
if name:
instance = self.instance
if instance is None:
instance = Domain(name=name, account=self.account)
2015-05-18 15:21:42 +00:00
records = data['records']
domain = domain_for_validation(instance, records)
2014-11-14 15:51:18 +00:00
validators.validate_zone(domain.render_zone())
2015-05-18 15:21:42 +00:00
return data
def create(self, validated_data):
records = validated_data.pop('records')
domain = super(DomainSerializer, self).create(validated_data)
for record in records:
domain.records.create(type=record['type'], value=record['value'])
return domain
def update(self, instance, validated_data):
precords = validated_data.pop('records')
domain = super(DomainSerializer, self).update(instance, validated_data)
to_delete = []
for erecord in domain.records.all():
match = False
for ix, precord in enumerate(precords):
if erecord.type == precord['type'] and erecord.value == precord['value']:
match = True
break
if match:
precords.pop(ix)
else:
to_delete.append(erecord)
for precord in precords:
try:
recycled = to_delete.pop()
except IndexError:
domain.records.create(type=precord['type'], value=precord['value'])
else:
recycled.type = precord['type']
recycled.value = precord['value']
recycled.save()
return domain