from django import forms from django.core.exceptions import ValidationError from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from .validators import validate_domain_protocol class WebsiteAdminForm(forms.ModelForm): def clean(self): """ Prevent multiples domains on the same protocol """ super(WebsiteAdminForm, self).clean() domains = self.cleaned_data.get('domains') if not domains: return self.cleaned_data protocol = self.cleaned_data.get('protocol') for domain in domains.all(): try: validate_domain_protocol(self.instance, domain, protocol) except ValidationError as e: # TODO not sure about this one self.add_error(None, e) return self.cleaned_data class WebsiteDirectiveInlineFormSet(forms.models.BaseInlineFormSet): """ Validate uniqueness """ def clean(self): values = {} for form in self.forms: name = form.cleaned_data.get('name', None) if name is not None: directive = form.instance.directive_class if directive.unique_name and name in values: form.add_error(None, ValidationError( _("Only one %s can be defined.") % directive.get_verbose_name() )) value = form.cleaned_data.get('value', None) if value is not None: if directive.unique_value and value in values.get(name, []): form.add_error('value', ValidationError( _("This value is already used by other %s.") % force_text(directive.get_verbose_name()) )) try: values[name].append(value) except KeyError: values[name] = [value]