From 746a2c1eea7ebb410b3622a1876ced7154512bd0 Mon Sep 17 00:00:00 2001 From: chris meyers Date: Fri, 2 Mar 2018 11:04:18 -0500 Subject: [PATCH] short-circuit middleware if migration loading url * Had to monkey patch django middleware logic. * Left checks to tell coders to use new middleware behavior in favor of monkey patching. --- awx/main/middleware.py | 4 +++- awx/wsgi.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/awx/main/middleware.py b/awx/main/middleware.py index 94ba7b4c08..8ae8d444e1 100644 --- a/awx/main/middleware.py +++ b/awx/main/middleware.py @@ -20,6 +20,7 @@ from django.shortcuts import get_object_or_404, redirect from django.apps import apps from django.utils.translation import ugettext_lazy as _ from django.core.urlresolvers import reverse +from django.urls import resolve from awx.main.models import ActivityStream from awx.main.utils.named_url_graph import generate_graph, GraphNode @@ -193,5 +194,6 @@ class MigrationRanCheckMiddleware(object): def process_request(self, request): executor = MigrationExecutor(connection) plan = executor.migration_plan(executor.loader.graph.leaf_nodes()) - if bool(plan) and 'migrations_notran' not in request.path: + if bool(plan) and \ + getattr(resolve(request.path), 'url_name', '') != 'migrations_notran': return redirect(reverse("ui:migrations_notran")) diff --git a/awx/wsgi.py b/awx/wsgi.py index 4b2666a409..71bb0f6a92 100644 --- a/awx/wsgi.py +++ b/awx/wsgi.py @@ -8,7 +8,13 @@ from awx import __version__ as tower_version from awx import prepare_env, MODE prepare_env() + +from django.core.handlers.base import BaseHandler # NOQA from django.core.wsgi import get_wsgi_application # NOQA +import django # NOQA +from django.conf import settings # NOQA +from django.urls import resolve # NOQA + """ WSGI config for AWX project. @@ -29,5 +35,33 @@ if MODE == 'production': logger.error("Missing or incorrect metadata for Tower version. Ensure Tower was installed using the setup playbook.") raise Exception("Missing or incorrect metadata for Tower version. Ensure Tower was installed using the setup playbook.") + +if django.__version__ != '1.11.7': + raise RuntimeError("Django version other than 1.11.7 detected {}. \ + Monkey Patch to support short-circuit Django Middelware \ + is known to work for Django 1.11.7 and may not work with other, \ + even minor, versions.".format(django.__version__)) + + +if settings.MIDDLEWARE: + raise RuntimeError("MIDDLEWARE setting detected. \ + The 'migration in progress' view feature short-circuits OLD Django \ + MIDDLEWARE_CLASSES behavior. With the new Django MIDDLEWARE beahvior \ + it's possible to short-ciruit the middleware onion through supported \ + middleware mechanisms. The monkey patch wrapper below should be removed.") + + +def _wrapper_legacy_get_response(self, request): + # short-circuit middleware + if getattr(resolve(request.path), 'url_name', '') == 'migrations_notran': + return self._get_response(request) + # fall through to middle-ware + else: + return self._real_legacy_get_response(request) + + +BaseHandler._real_legacy_get_response = BaseHandler._legacy_get_response +BaseHandler._legacy_get_response = _wrapper_legacy_get_response + # Return the default Django WSGI application. application = get_wsgi_application()