fabiocaccamo/django-redirects

View on GitHub
redirects/middleware.py

Summary

Maintainability
A
0 mins
Test Coverage
from django.contrib.sites.shortcuts import get_current_site
from django.db.models import Q

# https://docs.djangoproject.com/en/1.10/topics/http/middleware/#upgrading-pre-django-1-10-style-middleware
from django.utils.deprecation import MiddlewareMixin

from redirects.models import Redirect


class RedirectMiddleware(MiddlewareMixin):
    @staticmethod
    def _find_response(redirects, match, path):
        redirects_list = filter(lambda obj: obj.match == match, redirects)
        for redirect_obj in redirects_list:
            redirect_response = redirect_obj.get_response(path)
            if redirect_response:
                return redirect_response
        return None

    def process_request(self, request):
        current_site = get_current_site(request)
        path = request.get_full_path()

        redirects_qs = Redirect.objects.filter(
            (Q(site=current_site) | Q(site__isnull=True)),
            (Q(match=Redirect.MATCH_EXACT) & Q(old_path__iexact=path))
            | Q(match=Redirect.MATCH_PREFIX)
            | Q(match=Redirect.MATCH_REGEX),
        )
        redirects_list = list(redirects_qs)

        return (
            self._find_response(redirects_list, Redirect.MATCH_EXACT, path)
            or self._find_response(redirects_list, Redirect.MATCH_PREFIX, path)
            or self._find_response(redirects_list, Redirect.MATCH_REGEX, path)
            or None
        )