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

50 lines
1.8 KiB
Python
Raw Normal View History

2015-05-18 15:21:42 +00:00
from collections import defaultdict
from django import forms
from django.core.exceptions import ValidationError
2015-03-10 21:51:10 +00:00
2015-05-19 13:27:04 +00:00
from .utils import normurlpath
from .validators import validate_domain_protocol, validate_server_name
class WebsiteAdminForm(forms.ModelForm):
def clean(self):
2015-03-10 21:51:10 +00:00
""" Prevent multiples domains on the same protocol """
2015-04-09 14:32:10 +00:00
super(WebsiteAdminForm, self).clean()
domains = self.cleaned_data.get('domains')
2015-03-10 21:51:10 +00:00
if not domains:
return self.cleaned_data
protocol = self.cleaned_data.get('protocol')
domains = domains.all()
for domain in domains:
2015-03-10 22:27:32 +00:00
try:
validate_domain_protocol(self.instance, domain, protocol)
except ValidationError as err:
self.add_error(None, err)
try:
validate_server_name(domains)
except ValidationError as err:
self.add_error('domains', err)
return self.cleaned_data
class WebsiteDirectiveInlineFormSet(forms.models.BaseInlineFormSet):
def clean(self):
2015-05-18 15:21:42 +00:00
# directives formset cross-validation with contents for unique locations
locations = set()
for form in self.content_formset.forms:
location = form.cleaned_data.get('path')
if location is not None:
2015-05-19 13:27:04 +00:00
locations.add(normurlpath(location))
2015-05-18 15:21:42 +00:00
values = defaultdict(list)
for form in self.forms:
wdirective = form.instance
2015-05-18 15:21:42 +00:00
directive = form.cleaned_data
if directive.get('name') is not None:
try:
wdirective.directive_instance.validate_uniqueness(directive, values, locations)
2015-05-18 15:21:42 +00:00
except ValidationError as err:
for k,v in err.error_dict.items():
form.add_error(k, v)