""" This module defines form classes for domain editing. """ from __future__ import absolute_import import re from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, Submit from django import forms from django.urls import reverse from django.utils.translation import gettext as _ from .models import HostingDomain def relative_domain_validator(value): """ This validator ensures that the given value is a valid lowercase domain name. """ if len(value) > 254: raise forms.ValidationError(_("host name too long"), code="too-long") allowed = re.compile(r"(?!-)[a-z\d-]{1,63}(?<!-)$") if not all(allowed.match(x) for x in value.split(".")): raise forms.ValidationError(_("invalid domain name")) class CreateHostingDomainForm(forms.ModelForm): """ This form is used to create new HostingDomain instances. """ class Meta: model = HostingDomain fields = ["domain"] def __init__(self, instance, *args, **kwargs): self.hosting_package = kwargs.pop("hostingpackage") super(CreateHostingDomainForm, self).__init__(*args, **kwargs) self.fields["domain"].validators.append(relative_domain_validator) self.helper = FormHelper() self.helper.form_action = reverse( "create_hosting_domain", kwargs={"package": self.hosting_package.id} ) self.helper.layout = Layout( "domain", Submit("submit", _("Add Hosting Domain")), ) def clean(self): self.cleaned_data = super(CreateHostingDomainForm, self).clean() self.cleaned_data["hosting_package"] = self.hosting_package def save(self, commit=True): return HostingDomain.objects.create_for_hosting_package( commit=commit, **self.cleaned_data ) def save_m2m(self): pass