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.
119 lines
4.9 KiB
119 lines
4.9 KiB
# -*- coding: utf-8 -*-
|
|
# from django.contrib.redirects.middleware import RedirectFallbackMiddleware
|
|
import re
|
|
|
|
from django.core.urlresolvers import reverse
|
|
from django.conf import settings
|
|
from django.http import HttpResponsePermanentRedirect
|
|
from django.utils.html import strip_spaces_between_tags
|
|
|
|
from exposition.models import Exposition
|
|
from country.models import Country
|
|
from city.models import City
|
|
from accounts.models import UserLog
|
|
|
|
|
|
class ExpoRedirectFallbackMiddleware(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
|
|
|
|
|
|
class Referer(object):
|
|
# ticket 1615
|
|
def process_request(self, request):
|
|
data_exists = {
|
|
'referer': request.META.get('HTTP_REFERER'),
|
|
'utm_source': request.GET.get('utm_source'),
|
|
'utm_medium': request.GET.get('utm_medium'),
|
|
'utm_campaign': request.GET.get('utm_campaign'),
|
|
'search': request.GET.get('q'),
|
|
}
|
|
if any(data_exists.values()):
|
|
userlog = None
|
|
if request.user.is_authenticated():
|
|
userlog = request.user.get_user_log()
|
|
for key, val in data_exists.iteritems():
|
|
if val:
|
|
if key == 'search':
|
|
search = request.session.get('search', [])[-2:]
|
|
search.append(val)
|
|
request.session['search'] = search
|
|
try:
|
|
if userlog is not None:
|
|
for i, d in enumerate(search, start=1):
|
|
setattr(userlog, key + str(i), d)
|
|
except Exception as e:
|
|
print(e)
|
|
else:
|
|
attr1 = key + '1'
|
|
attr2 = key + '2'
|
|
request.session[attr2] = val
|
|
if userlog is not None:
|
|
setattr(userlog, attr2, val)
|
|
if not getattr(userlog, attr1):
|
|
setattr(userlog, attr1, val)
|
|
if not request.session.get(attr1):
|
|
request.session[attr1] = val
|
|
if userlog is not None:
|
|
userlog.save()
|
|
return
|
|
|
|
|
|
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
|
|
|
|
|
|
# https://gist.github.com/b1/3155460
|
|
class SpacelessMiddleware(object):
|
|
""" trim spaces between tags if not in DEBUG """
|
|
def process_response(self, request, response):
|
|
if response.get('Content-Type', '').startswith('text/html'):
|
|
cont = strip_spaces_between_tags(response.content)
|
|
response.content = re.sub(r'^\s+<','<', cont)
|
|
return response
|
|
|