from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from orchestra.contrib.domains.helpers import domain_for_validation from orchestra.contrib.domains.models import Record from orchestra.contrib.domains.validators import validate_zone class ValidateZoneMixin: # NOTE: adapted code of orchestra.contrib.domains.forms.ValidateZoneMixin # but only for one form (instead a admin inline formset) def clean(self): """ Checks if everything is consistent """ super(ValidateZoneMixin, self).clean() if any(self.errors): return is_host = self.cleaned_data.get('type') in (Record.TXT, Record.SRV, Record.CNAME) domain_names = [] if self.domain.name: domain_names.append(self.domain.name) domain_names.extend(getattr(self.domain, 'extra_names', [])) errors = [] for name in domain_names: if '_' in name and is_host: errors.append(ValidationError( _("%s: Hosts can not have underscore character '_', consider providing a SRV, CNAME or TXT record.") % name )) records = [self.cleaned_data] domain = domain_for_validation(self.domain, records) try: validate_zone(domain.render_zone()) except ValidationError as error: for msg in error: errors.append( ValidationError("%s: %s" % (name, msg)) ) if errors: raise ValidationError(errors)