Переглянути джерело

HUE-8737 [core] Add monkey patch django_template_context.RequestContext.__init__

Ying Chen 6 роки тому
батько
коміт
bde563b8b1

+ 4 - 0
desktop/core/src/desktop/lib/django_util.py

@@ -26,6 +26,7 @@ import datetime
 
 from django.conf import settings
 from django.core import urlresolvers, serializers
+from django.template import context as django_template_context
 from django.template.context_processors import csrf
 from django.core.serializers.json import DjangoJSONEncoder
 from django.db import models
@@ -41,6 +42,7 @@ import desktop.conf
 import desktop.lib.thrift_util
 from desktop.lib import django_mako
 from desktop.lib.json_utils import JSONEncoderForHTML
+from desktop.monkey_patches import monkey_patch_request_context_init
 
 
 LOG = logging.getLogger(__name__)
@@ -53,6 +55,8 @@ MAKO = 'mako'
 USERNAME_RE_RULE = "[^-:\s][^:\s]*"
 GROUPNAME_RE_RULE = ".{,80}"
 
+django_template_context.RequestContext.__init__ = monkey_patch_request_context_init
+
 
 # For backward compatibility for upgrades to Hue 2.2
 class PopupException(object): pass

+ 38 - 4
desktop/core/src/desktop/monkey_patches.py

@@ -17,11 +17,10 @@
 
 import re
 
+from django.conf import settings
 from django.core.validators import RegexValidator
-
-from useradmin.models import User
-
-from desktop.lib.django_util import get_username_re_rule
+from django.template.context import RequestContext
+from django.utils.module_loading import import_string
 
 
 def monkey_patch_username_validator():
@@ -33,6 +32,9 @@ def monkey_patch_username_validator():
   regular expression inside the username validator.
   """
 
+  from useradmin.models import User
+  from desktop.lib.django_util import get_username_re_rule
+
   username = User._meta.get_field("username")
 
   regex = re.compile('^%s$' % get_username_re_rule())
@@ -40,3 +42,35 @@ def monkey_patch_username_validator():
   for validator in username.validators:
     if isinstance(validator, RegexValidator):
       validator.regex = regex
+
+
+_standard_context_processors = None
+_builtin_context_processors = ('django.template.context_processors.csrf',)
+
+# This is a function rather than module-level procedural code because we only
+# want it to execute if somebody uses RequestContext.
+def get_standard_processors():
+    global _standard_context_processors
+    if _standard_context_processors is None:
+        processors = []
+        collect = []
+        collect.extend(_builtin_context_processors)
+        collect.extend(settings.GTEMPLATE_CONTEXT_PROCESSORS)
+        for path in collect:
+            func = import_string(path)
+            processors.append(func)
+        _standard_context_processors = tuple(processors)
+    return _standard_context_processors
+
+def monkey_patch_request_context_init(self, request, dict_=None, processors=None, use_l10n=None, use_tz=None, autoescape=True):
+  super(RequestContext, self).__init__(
+    dict_, use_l10n=use_l10n, use_tz=use_tz, autoescape=autoescape)
+  self.request = request
+  self._processors = () if processors is None else tuple(processors)
+  self._processors_index = len(self.dicts)
+
+  updates = dict()
+  # @TODO@ Prakash to Implement context processor
+  for processor in get_standard_processors():
+    updates.update(processor(request))
+  self.update(updates)