diff --git a/article/forms.py b/article/forms.py index 0093baa0..2648f96b 100644 --- a/article/forms.py +++ b/article/forms.py @@ -186,7 +186,8 @@ class ArticleForm(forms.Form): article.user = User.objects.get(id=data['author'].id)#.id cause select uses queryset #create slug field from russian language - article.url = translit_with_separator(data['main_title_ru'].strip()).lower() + if not getattr(article, 'slug'): + article.slug = translit_with_separator(data['main_title_ru'].strip()).lower() # fill translated fields and save object fill_with_signal(Article, article, data) diff --git a/article/models.py b/article/models.py index 59b6dd0f..b1a4d2c5 100644 --- a/article/models.py +++ b/article/models.py @@ -264,4 +264,5 @@ class Article(TranslatableModel): from django.db.models.signals import post_save from functions.signal_handlers import post_save_handler + post_save.connect(post_save_handler, sender=Article) \ No newline at end of file diff --git a/city/forms.py b/city/forms.py index 86082213..98cc5ce5 100644 --- a/city/forms.py +++ b/city/forms.py @@ -84,6 +84,9 @@ class CityForm(forms.Form): else: city = City() + if not getattr(city, 'url'): + city.url = translit_with_separator(data['name_ru'].strip()).lower() + city.phone_code = data['phone_code'] city.population = data.get('population') city.inflect = data['inflect'] @@ -95,14 +98,6 @@ class CityForm(forms.Form): city.country = data['country']# .id cause select uses queryset #city.country = Country.objects.get(id=data['country'].id)# .id cause select uses queryset - # url generate for city: "country_name-city_name" - #if data.get('name_en'): - #city.url = '%s-'%translit_with_separator(city.country.name) + translit_with_separator(data['name_en']).lower() - #else: - #city.url = '%s-'%translit_with_separator(city.country.name) + translit_with_separator(data['name_ru']).lower() - #city.url = '%s'%translit_with_separator(data['name_ru'].strip()).lower() - - #city.save() # fill translated fields and save object fill_with_signal(City, city, data) diff --git a/city/models.py b/city/models.py index 0f2a2035..73d3cbf5 100644 --- a/city/models.py +++ b/city/models.py @@ -16,7 +16,7 @@ from seminar.models import Seminar from webinar.models import Webinar # custom functions from functions.db import db_table_exists -from functions.signal_handlers import post_save_handler +from functions.signal_handlers import post_save_handler, pre_save_handler from functions.models_methods import ExpoManager, CityManager #check if table exist and create flags if true @@ -134,5 +134,7 @@ class Hotel(TranslatableModel): address = models.CharField(max_length=255, blank=True) ) + +pre_save.connect(pre_save_handler, sender=City) post_save.connect(post_save_handler, sender=City) post_save.connect(post_save_handler, sender=Hotel) \ No newline at end of file diff --git a/conference/forms.py b/conference/forms.py index cf3fa4cd..05f8a0e1 100644 --- a/conference/forms.py +++ b/conference/forms.py @@ -135,7 +135,8 @@ class ConferenceCreateForm(forms.Form): conference.tag.clear() #simple fields - conference.url = translit_with_separator(data['name_ru'].strip()).lower() + if not getattr(conference, 'url'): + conference.url = translit_with_separator(data['name_ru'].strip()).lower() if data.get('logo'): conference.logo = data['logo'] diff --git a/conference/views.py b/conference/views.py index de034f2a..1415f008 100644 --- a/conference/views.py +++ b/conference/views.py @@ -345,6 +345,17 @@ class ConferenceDetail(JitterCacheMixin, DetailView): slug_field = 'url' template_name = 'client/conference/conference_detail.html' + def dispatch(self, request, *args, **kwargs): + + slug = self.kwargs.get(self.slug_url_kwarg, None) + try: + city = City.objects.get(old_url=slug) + return HttpResponseRedirect('/conference/city/%s/'%city.url) + except City.DoesNotExist: + return super(ConferenceDetail, self).dispatch(request, *args, **kwargs) + + + def get_context_data(self, **kwargs): context = super(ConferenceDetail, self).get_context_data(**kwargs) context['advertising_form'] = AdvertiseForm() diff --git a/country/forms.py b/country/forms.py index 0fb03396..cdc0be8d 100644 --- a/country/forms.py +++ b/country/forms.py @@ -127,6 +127,9 @@ class CountryForm(forms.Form): country.language.clear() country.currency.clear() + if not getattr(country, 'url'): + country.url = translit_with_separator(data['name_ru'].strip()).lower() + country.population = data['population'] country.teritory = data['teritory'] country.timezone = data['timezone'] diff --git a/country/models.py b/country/models.py index d2012dbc..548d54c7 100644 --- a/country/models.py +++ b/country/models.py @@ -2,7 +2,7 @@ from datetime import date from django.db import models from django.contrib.contenttypes import generic -from django.db.models.signals import post_save +from django.db.models.signals import post_save, pre_save from hvad.models import TranslatableModel, TranslatedFields from bitfield import BitField from manager import CountryManager, AreaManager @@ -161,4 +161,5 @@ class Country(TranslatableModel): +pre_save.connect(pre_save_handler, sender=Country) post_save.connect(post_save_handler, sender=Country) \ No newline at end of file diff --git a/exposition/forms.py b/exposition/forms.py index 05633fd1..d588c80d 100644 --- a/exposition/forms.py +++ b/exposition/forms.py @@ -79,7 +79,7 @@ class ExpositionCreateForm(forms.Form): widget=forms.CheckboxSelectMultiple()) # currency = forms.ChoiceField(label=u'Валюта', choices=currencies, required=False) - application_deadline = forms.DateField(label=u'Срок подачи стенда', required=False) + application_deadline = forms.DateField(label=u'Срок подачи стенда',input_formats=['%Y-%m-%d', '%d.%m.%Y'], required=False) min_stand_size = forms.CharField(label=u'Минимальный размер стенда', required=False) price_catalog = forms.CharField(label=u'Цена за каталог', required=False) @@ -172,8 +172,8 @@ class ExpositionCreateForm(forms.Form): exposition.company.clear() #simple fields - - exposition.url = translit_with_separator(data['name_ru'].strip()).lower() + if not getattr(exposition, 'url'): + exposition.url = translit_with_separator(data['name_ru'].strip()).lower() if data.get('logo'): exposition.logo = data['logo'] diff --git a/functions/signal_handlers.py b/functions/signal_handlers.py index 3a37aef1..8e69b737 100644 --- a/functions/signal_handlers.py +++ b/functions/signal_handlers.py @@ -5,6 +5,9 @@ from functions.form_check import translit_with_separator def pre_save_handler(sender, **kwargs): obj = kwargs['instance'] + url = getattr(obj, 'url') + if url is not None: + return if hasattr(obj, 'language_code') and obj.language_code =='en': try: diff --git a/place_exposition/forms.py b/place_exposition/forms.py index 7ce33ccd..ad71fde8 100644 --- a/place_exposition/forms.py +++ b/place_exposition/forms.py @@ -113,10 +113,11 @@ class ExpositionForm(forms.Form): place_exposition = obj #simple fields - if data.get('name_en'): - place_exposition.url = translit_with_separator(data['name_en'].strip()).lower() - else: - place_exposition.url = translit_with_separator(data['name_ru'].strip()).lower() + if not getattr(place_exposition, 'url'): + if data.get('name_en'): + place_exposition.url = translit_with_separator(data['name_en'].strip()).lower() + else: + place_exposition.url = translit_with_separator(data['name_ru'].strip()).lower() if data.get('logo'): place_exposition.logo = data['logo'] place_exposition.type = data['type'] diff --git a/settings/old_urls.py b/settings/old_urls.py index 7d4b57f5..668e0e8e 100644 --- a/settings/old_urls.py +++ b/settings/old_urls.py @@ -2,7 +2,7 @@ from django.conf.urls import patterns, include, url from django.http import HttpResponse from django.views.decorators.cache import cache_page -from redirect_views import old_redirect, old_profile +from redirect_views import old_redirect, old_profile, tag_redirect def test(request): return HttpResponse('test') @@ -148,7 +148,7 @@ urlpatterns = patterns('', url(r'^tags.php/theme/(?P.*)/page/(?P\d+)/$', old_redirect, {'redirect_url': '/expo/tag/{tag}/'}), url(r'^tags.php/theme/(?P.*)/$', old_redirect, {'redirect_url': '/expo/tag/{tag}/'}), url(r'^tag/(?P.*)/page/(?P\d+)/$', old_redirect, {'redirect_url': '/expo/tag/{tag}/page/{page}/'}), - url(r'^tag/(?P.*)/$', old_redirect, {'redirect_url': '/expo/tag/{tag}/'}), + url(r'^tag/(?P.*)/$', tag_redirect, {'redirect_url': '/expo/tag/{tag}/'}), url(r'^catalog/(?P.*)/page/(?P\d+)/$', old_redirect, {'redirect_url': '/expo/city/{city}/page/{page}/'}), diff --git a/settings/redirect_views.py b/settings/redirect_views.py index 9fe69ca0..3fbee5d7 100644 --- a/settings/redirect_views.py +++ b/settings/redirect_views.py @@ -37,6 +37,28 @@ class ThemeRedirect(RedirectMixin): class TagRedirect(RedirectMixin): model = Tag + def get_object_url(self, key, value): + Model = self.model + try: + obj = Model.objects.get(old_url=value) + except Model.DoesNotExist: + try: + obj = Model.objects.get(url=value) + except Model.DoesNotExist: + if value.endwith('-expo'): + value = value.replace('-expo', '') + elif value.endwith('-conf'): + value = value.replace('-conf', '') + + obj = get_object_or_404(old_url=value) + + if obj: + return {key: obj.url} + else: + raise Http404 + + + class CompanyRedirect(RedirectMixin): model = Company @@ -101,6 +123,22 @@ def old_redirect(request, *args, **kwargs): redirect_obj = old_params[key]() updates.update(redirect_obj.get_object_url(key, value)) + params.update(updates) + redirect = redirect.format(**params) + + return HttpResponsePermanentRedirect(redirect) + +def tag_redirect(request, *args, **kwargs): + redirect = kwargs.get('redirect_url') + params = dict(kwargs) + tag = params.get('tag', '') + if tag.endswith('-conf'): + redirect = redirect.replace('expo', 'conference') + updates = {} + for key, value in params.iteritems(): + if key in old_params: + redirect_obj = old_params[key]() + updates.update(redirect_obj.get_object_url(key, value)) params.update(updates) redirect = redirect.format(**params) diff --git a/theme/forms.py b/theme/forms.py index b57c75b5..7cd0512f 100644 --- a/theme/forms.py +++ b/theme/forms.py @@ -47,6 +47,10 @@ class ThemeForm(forms.Form): else: theme = Theme.objects.get(id=id) + if not getattr(theme, 'url'): + theme.url = translit_with_separator(data['name_ru'].strip()).lower() + + #flag = 0 #for item in data['types']: # flag = flag | getattr(Theme.types, item) @@ -109,6 +113,9 @@ class TagForm(forms.Form): else: tag = Tag.objects.get(id=id) + if not getattr(tag, 'url'): + tag.url = translit_with_separator(data['name_ru'].strip()).lower() + if data.get('theme'): tag.theme = Theme.objects.get(id=data['theme']) diff --git a/theme/models.py b/theme/models.py index 4de10b68..c01cf365 100644 --- a/theme/models.py +++ b/theme/models.py @@ -237,7 +237,7 @@ def pre_save_handler(sender, **kwargs): if not obj.url: obj.url = ''.join([random.choice(string.ascii_lowercase) for n in xrange(8)]) -#pre_save.connect(pre_save_handler, sender=Theme) +pre_save.connect(pre_save_handler, sender=Theme) pre_save.connect(pre_save_handler, sender=Tag) post_save.connect(post_save_handler, sender=Theme)