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

73 lines
2.9 KiB
Python
Raw Normal View History

2014-05-08 16:59:35 +00:00
from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
from . import validators
from .helpers import domain_for_validation
from .models import Domain
2015-03-11 20:01:08 +00:00
class BatchDomainCreationAdminForm(forms.ModelForm):
name = forms.CharField(label=_("Names"), widget=forms.Textarea(attrs={'rows': 5, 'cols': 50}),
2015-04-05 10:46:24 +00:00
help_text=_("Domain per line. All domains will share the same attributes."))
2015-03-11 20:01:08 +00:00
def clean_name(self):
self.extra_names = []
target = None
for name in self.cleaned_data['name'].strip().splitlines():
name = name.strip()
if not name:
continue
if target is None:
target = name
else:
domain = Domain(name=name)
try:
domain.full_clean(exclude=['top'])
except ValidationError as e:
raise ValidationError(e.error_dict['name'])
self.extra_names.append(name)
return target
2014-05-08 16:59:35 +00:00
def clean(self):
2015-03-29 16:10:07 +00:00
""" inherit related parent domain account, when exists """
2015-03-11 20:01:08 +00:00
cleaned_data = super(BatchDomainCreationAdminForm, self).clean()
2014-05-08 16:59:35 +00:00
if not cleaned_data['account']:
2015-03-11 20:01:08 +00:00
account = None
for name in [cleaned_data['name']] + self.extra_names:
domain = Domain(name=name)
2015-03-29 16:10:07 +00:00
parent = domain.get_parent()
if not parent:
2015-03-11 20:01:08 +00:00
# Fake an account to make django validation happy
account_model = self.fields['account']._queryset.model
cleaned_data['account'] = account_model()
raise ValidationError({
'account': _("An account should be provided for top domain names."),
})
2015-03-29 16:10:07 +00:00
elif account and parent.account != account:
2015-03-11 20:01:08 +00:00
# Fake an account to make django validation happy
account_model = self.fields['account']._queryset.model
cleaned_data['account'] = account_model()
raise ValidationError({
'account': _("Provided domain names belong to different accounts."),
})
2015-03-29 16:10:07 +00:00
account = parent.account
2015-03-11 20:01:08 +00:00
cleaned_data['account'] = account
2014-05-08 16:59:35 +00:00
return cleaned_data
class RecordInlineFormSet(forms.models.BaseInlineFormSet):
def clean(self):
""" Checks if everything is consistent """
2015-04-09 14:32:10 +00:00
super(RecordInlineFormSet, self).clean()
2014-05-08 16:59:35 +00:00
if any(self.errors):
return
if self.instance.name:
records = []
for form in self.forms:
data = form.cleaned_data
if data and not data['DELETE']:
records.append(data)
domain = domain_for_validation(self.instance, records)
validators.validate_zone(domain.render_zone())