You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.3 KiB
65 lines
2.3 KiB
# -*- 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оздание редиректа')
|
|
|
|
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 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 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):
|
|
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,
|
|
})
|
|
return self.instance
|
|
|
|
|