# -*- coding: utf-8 -*- from django import forms from django.contrib.redirects.models import Redirect from django.conf import settings from django.contrib.redirects.admin import RedirectAdmin from django.utils.translation import ugettext as _ class RedirectForm(forms.ModelForm): verbose = _(u'Создание/редактирование редиректа') class Meta: model = Redirect fields = ['old_path', 'new_path'] def save(self, commit=True): obj = super(RedirectForm, self).save(commit=False) obj.site_id = settings.SITE_ID if commit: obj.save() return obj class NewUrlForObjectForm(forms.Form): verbose = _(u'Обновление URL и cоздание редиректа') detach = forms.BooleanField(label=_(u'Ссылка в порядке'), required=False, help_text=_(u'Если отмечено, никаких изменений с ссылкой события не будет, флаг о подозрении на неправильную ссылку будет снят.')) old_url = forms.CharField(label=_(u'Текущая ссылка')) new_url = forms.CharField(label=_(u'Новая ссылка')) def __init__(self, *args, **kwargs): self.instance = kwargs.pop('instance', None) super(NewUrlForObjectForm, self).__init__(*args, **kwargs) @property def exist(self): return Redirect.objects.filter(old_path=self.instance.get_permanent_url()).exists() def clean_new_url(self): if not self.cleaned_data['detach'] and self.cleaned_data['new_url'] == self.cleaned_data['old_url']: raise forms.ValidationError( _(u'Старый и новый URL совпадают.'), code='invalid' ) return self.cleaned_data['new_url'] def clean(self): if not self.cleaned_data['detach'] and self.cleaned_data.get('new_url', None): if self.instance.__class__.objects.filter(url=self.cleaned_data['new_url']).exclude(pk=self.instance.pk).exists(): raise forms.ValidationError( _(u'Объект с таким URL уже существует'), ) return self.cleaned_data def save(self): if not self.cleaned_data['detach']: old_path = self.instance.get_permanent_url() self.instance.url = self.cleaned_data['new_url'] self.instance.bad_url = False self.instance.save() obj, created = Redirect.objects.get_or_create( old_path=old_path, defaults={ 'new_path': self.instance.get_permanent_url(), 'site_id': settings.SITE_ID, }) else: self.instance.bad_url = False self.instance.save() return self.instance