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 class DomainAdminForm(forms.ModelForm): migrate_subdomains = forms.BooleanField(label=_("Migrate subdomains"), required=False, initial=False, help_text=_("Propagate the account owner change to subdomains.")) def clean(self): """ inherit related top domain account, when exists """ cleaned_data = super(DomainAdminForm, self).clean() if not cleaned_data['account']: domain = Domain(name=cleaned_data['name']) top = domain.get_top() if not top: # Fake an account to make django validation happy account_model = self.fields['account']._queryset.model cleaned_data['account'] = account_model() msg = _("An account should be provided for top domain names") raise ValidationError(msg) cleaned_data['account'] = top.account return cleaned_data #class BatchDomainCreationAdminForm(DomainAdminForm): # # TODO # name = forms.CharField(widget=forms.Textarea, label=_("Names"), # help_text=_("Domain per line. All domains will share the same attributes.")) # # def clean_name(self): # self.names = [] # target = None # for name in self.cleaned_data['name'].splitlines(): # name = name.strip() # 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.names.append(name) # return target # # def save_model(self, request, obj, form, change): # # TODO thsi is modeladmin # """ batch domain creation support """ # super(DomainAdmin, self).save_model(request, obj, form, change) # if not change: # for name in form.names: # domain = Domain.objects.create(name=name, account_id=obj.account_id) # # def save_related(self, request, form, formsets, change): # # TODO thsi is modeladmin # """ batch domain creation support """ # super(DomainAdmin, self).save_related(request, form, formsets, change) # if not change: # for name in form.names: # for formset in formsets: # formset.instance = form.instance # self.save_formset(request, form, formset, change=change) class RecordInlineFormSet(forms.models.BaseInlineFormSet): def clean(self): """ Checks if everything is consistent """ 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())