forms.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. from django import forms
  2. from django.utils.translation import ugettext_lazy as _
  3. from wagtail.admin.widgets import AdminPageChooser
  4. from wagtail.contrib.redirects.models import Redirect
  5. from wagtail.core.models import Site
  6. class RedirectForm(forms.ModelForm):
  7. site = forms.ModelChoiceField(
  8. label=_("From site"), queryset=Site.objects.all(), required=False, empty_label=_("All sites")
  9. )
  10. def __init__(self, *args, **kwargs):
  11. super().__init__(*args, **kwargs)
  12. self.fields['redirect_page'].widget = AdminPageChooser()
  13. required_css_class = "required"
  14. def clean(self):
  15. """
  16. The unique_together condition on the model is ignored if site is None, so need to
  17. check for duplicates manually
  18. """
  19. cleaned_data = super().clean()
  20. if cleaned_data.get('site') is None:
  21. old_path = cleaned_data.get('old_path')
  22. if old_path is None:
  23. # cleaned_data['old_path'] is empty because it has already failed validation,
  24. # so don't bother with our duplicate test
  25. return
  26. old_path = Redirect.normalise_path(old_path)
  27. duplicates = Redirect.objects.filter(old_path=old_path, site__isnull=True)
  28. if self.instance.pk:
  29. duplicates = duplicates.exclude(id=self.instance.pk)
  30. if duplicates:
  31. raise forms.ValidationError(_("A redirect with this path already exists."))
  32. class Meta:
  33. model = Redirect
  34. fields = ('old_path', 'site', 'is_permanent', 'redirect_page', 'redirect_link')