# -*- coding: utf-8 -*- # from django.contrib.redirects.middleware import RedirectFallbackMiddleware import re from django.http import HttpResponsePermanentRedirect from django.core.urlresolvers import reverse from exposition.models import Exposition from country.models import Country from city.models import City class RedirectFallbackMiddleware(object): def process_response(self, request, response): if response.status_code != 404: return response # No need to check for a redirect for non-404 responses. full_path = request.get_full_path() redirects = [ (r'^/(?Pexpo|conference)/(?P[^/]*)/$', check_events), (r'^/places/(?P[^/]*)/$', check_places), ] for regex, handler in redirects: check = re.compile(regex) match = check.match(full_path) if match: response = handler(**match.groupdict()) if response is not None: return response return response def check_events(event_type, slug): ''' Event redirects (ticket 1498: Внепланово со скайпа - редиректы 301) https://expomap.ru/expo/dusseldorf/ -> https://expomap.ru/expo/city/dusseldorf/ https://expomap.ru/expo/moscow/ -> https://expomap.ru/expo/country/moscow/ https://expomap.ru/conference/berlin/ -> https://expomap.ru/conference/city/berlin/ https://expomap.ru/conference/moscow/ -> https://expomap.ru/conference/country/moscow/ ''' types = { 'expo': 'expo', 'conference': 'conf' } if City.objects.filter(url=slug).exists(): return HttpResponsePermanentRedirect(reverse(types.get(event_type) + '_city', kwargs={'slug': slug})) if Country.objects.filter(url=slug).exists(): return HttpResponsePermanentRedirect(reverse(types.get(event_type) + '_country', kwargs={'slug': slug})) return None def check_places(slug): """ Правила для старых ошибок (ticket 1498: Внепланово со скайпа - редиректы 301) https://expomap.ru/places/russia/ -> https://expomap.ru/places/country/russia/ https://expomap.ru/places/moscow/ -> https://expomap.ru/places/city/moscow/ - где пропущен параметр city и country - тоже автоматической склейки по 301 """ if City.objects.filter(url=slug).exists(): return HttpResponsePermanentRedirect(reverse('place_city', kwargs={'slug': slug})) if Country.objects.filter(url=slug).exists(): return HttpResponsePermanentRedirect(reverse('place_country', kwargs={'slug': slug})) return None