class NameserverForm(DNSForm, UsabilityFormMixin): glue_ip_str = forms.CharField(label="Glue's IP Address", required=False) glue_ctnr = forms.ModelChoiceField(queryset=Ctnr.objects.all(), required=False, label="Glue's Container") class Meta: model = Nameserver fields = ('domain', 'server', 'views', 'ttl', 'glue_ip_str', 'glue_ctnr', 'description') exclude = ('addr_glue', 'intr_glue') widgets = {'views': forms.CheckboxSelectMultiple} def __init__(self, *args, **kwargs): super(NameserverForm, self).__init__(*args, **kwargs) if not self.instance: return if not self.instance.glue: # If it doesn't have glue, it doesn't need it. return addr_glue = AddressRecord.objects.filter( label=self.instance.glue.label, domain=self.instance.glue.domain) intr_glue = StaticInterface.objects.filter( label=self.instance.glue.label, domain=self.instance.glue.domain) glue_choices = [] for glue in addr_glue: glue_choices.append(("addr_{0}".format(glue.pk), str(glue))) for glue in intr_glue: glue_choices.append(("intr_{0}".format(glue.pk), str(glue))) if isinstance(self.instance.glue, AddressRecord): initial = "addr_{0}".format(self.instance.glue.pk) elif isinstance(self.instance.glue, StaticInterface): initial = "intr_{0}".format(self.instance.glue.pk) self.fields['glue'] = forms.ChoiceField(choices=glue_choices, initial=initial) def clean(self, *args, **kwargs): self.glue = None if self.instance.pk is None: domain = self.cleaned_data['domain'] glue_ip_str, glue_ctnr = (self.cleaned_data['glue_ip_str'], self.cleaned_data['glue_ctnr']) server = self.cleaned_data['server'].strip('.') if '.' in server: if server.lower() != domain.name.lower(): glue_label, glue_domain = tuple(server.split('.', 1)) glue_domain = glue_domain.strip('.').lower() else: glue_label, glue_domain = "", server.lower() else: raise ValidationError( "Please provide a fully qualified server name.") if domain.delegated: if glue_domain and glue_domain != domain.name.lower(): if glue_ip_str or glue_ctnr: raise ValidationError( "This record does not need glue, so " "please leave the glue fields blank.") else: if not (glue_ip_str and glue_ctnr): raise ValidationError( "This zone is delegated, so " "please provide information for glue.") gluekwargs = { 'domain': domain, 'label': glue_label, 'ip_str': glue_ip_str, 'ctnr': glue_ctnr } try: self.glue = AddressRecord.objects.get(**gluekwargs) except AddressRecord.DoesNotExist: self.glue = AddressRecord(**gluekwargs) self.glue.set_is_glue() self.glue.save() for v in View.objects.all(): self.glue.views.add(v) elif not domain.delegated and (glue_ip_str or glue_ctnr): raise ValidationError("This zone is not delegated, so please " "leave the glue fields blank.") cleaned_data = super(NameserverForm, self).clean(*args, **kwargs) return cleaned_data def save(self, *args, **kwargs): try: super(NameserverForm, self).save(*args, **kwargs) except Exception, e: if self.glue and self.glue.pk is not None: self.glue.delete(validate_glue=False) raise ValidationError(e)
class NameserverForm(DNSForm, UsabilityFormMixin): glue_ip_str = forms.CharField(label="Glue's IP Address", required=False) glue_ctnr = forms.ModelChoiceField( queryset=Ctnr.objects.all(), required=False, label="Glue's Container") class Meta: model = Nameserver fields = ('domain', 'server', 'views', 'ttl', 'glue_ip_str', 'glue_ctnr', 'description') exclude = ('addr_glue', 'intr_glue') widgets = {'views': forms.CheckboxSelectMultiple} def __init__(self, *args, **kwargs): super(NameserverForm, self).__init__(*args, **kwargs) if not self.instance: return if not self.instance.glue: # If it doesn't have glue, it doesn't need it. return addr_glue = AddressRecord.objects.filter( label=self.instance.glue.label, domain=self.instance.glue.domain) intr_glue = StaticInterface.objects.filter( label=self.instance.glue.label, domain=self.instance.glue.domain) glue_choices = [] for glue in addr_glue: glue_choices.append(("addr_{0}".format(glue.pk), str(glue))) for glue in intr_glue: glue_choices.append(("intr_{0}".format(glue.pk), str(glue))) if isinstance(self.instance.glue, AddressRecord): initial = "addr_{0}".format(self.instance.glue.pk) elif isinstance(self.instance.glue, StaticInterface): initial = "intr_{0}".format(self.instance.glue.pk) self.fields['glue'] = forms.ChoiceField(choices=glue_choices, initial=initial) def clean(self, *args, **kwargs): self.glue = None if self.instance.pk is None: domain = self.cleaned_data['domain'] glue_ip_str, glue_ctnr = (self.cleaned_data['glue_ip_str'], self.cleaned_data['glue_ctnr']) server = self.cleaned_data['server'].strip('.') if '.' in server: if server.lower() != domain.name.lower(): glue_label, glue_domain = tuple(server.split('.', 1)) glue_domain = glue_domain.strip('.').lower() else: glue_label, glue_domain = "", server.lower() else: raise ValidationError( "Please provide a fully qualified server name.") if domain.delegated: if glue_domain and glue_domain != domain.name.lower(): if glue_ip_str or glue_ctnr: raise ValidationError( "This record does not need glue, so " "please leave the glue fields blank.") else: if not (glue_ip_str and glue_ctnr): raise ValidationError( "This zone is delegated, so " "please provide information for glue.") gluekwargs = {'domain': domain, 'label': glue_label, 'ip_str': glue_ip_str, 'ctnr': glue_ctnr} try: self.glue = AddressRecord.objects.get(**gluekwargs) except AddressRecord.DoesNotExist: self.glue = AddressRecord(**gluekwargs) self.glue.set_is_glue() self.glue.save() for v in View.objects.all(): self.glue.views.add(v) elif not domain.delegated and (glue_ip_str or glue_ctnr): raise ValidationError("This zone is not delegated, so please " "leave the glue fields blank.") cleaned_data = super(NameserverForm, self).clean(*args, **kwargs) return cleaned_data def save(self, *args, **kwargs): try: super(NameserverForm, self).save(*args, **kwargs) except Exception, e: if self.glue and self.glue.pk is not None: self.glue.delete(validate_glue=False) raise ValidationError(e)