parent
edd92d4d6b
commit
a89358e3d6
7 changed files with 74 additions and 7 deletions
@ -0,0 +1,65 @@ |
||||
# -*- 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'^/(?P<event_type>expo|conference)/(?P<slug>[^/]*)/$', check_events), |
||||
(r'^/places/(?P<slug>[^/]*)/$', 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 |
||||
Loading…
Reference in new issue