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.
 
 
 
 
 
 

121 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()):
user = request.user
authenticated = request.user.is_authenticated()
userlog = None
if authenticated:
userlog, created = UserLog.objects.get_or_create(user_id=user.pk)
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
if userlog is not None:
for i, d in enumerate(search):
setattr(userlog, key + str(i), d)
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
""" spaceless middleware
MIDDLEWARE_CLASSES += ('core_utils.middleware.SpacelessMiddleware',)
"""
class SpacelessMiddleware(object):
""" trim spaces between tags if not in DEBUG """
def process_response(self, request, response):
cont = response.content
cont = strip_spaces_between_tags(cont)
response.content = re.sub(r'^\s+<','<', cont )
return response