# -*- 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'^/(?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 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, start=1): 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): if response.get('Content-Type').startswith('text/html'): cont = strip_spaces_between_tags(response.content) response.content = re.sub(r'^\s+<','<', cont) return response