Commit fa7cb4ef authored by Chris Wilson's avatar Chris Wilson Committed by Anssi Kääriäinen
Browse files

Fixed #20404 -- Added a keys() method to ContextList.

It's useful to be able to list all the (flattened) keys of a
ContextList, to help you figure out why the variable that's supposed
to be there is not.

No .values() or .items() added as the definition for those aren't clear.

The patch is Chris Wilson's patch from pull request 1065 with some
modifications by committer.
parent 5090c7b5
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -60,6 +60,16 @@ class ContextList(list):
            return False
        return True

    def keys(self):
        """
        Flattened keys of subcontexts.
        """
        keys = set()
        for subcontext in self:
            for dict in subcontext:
                keys |= set(dict.keys())
        return keys


def instrumented_test_render(self, context):
    """
+16 −2
Original line number Diff line number Diff line
@@ -6,9 +6,8 @@ from __future__ import unicode_literals

import os

from django.conf import settings
from django.core.urlresolvers import reverse
from django.template import (TemplateDoesNotExist, TemplateSyntaxError,
from django.template import (TemplateSyntaxError,
    Context, Template, loader)
import django.template.context
from django.test import Client, TestCase
@@ -897,6 +896,21 @@ class ContextTests(TestCase):
        except KeyError as e:
            self.assertEqual(e.args[0], 'does-not-exist')

    def test_contextlist_keys(self):
        c1 = Context()
        c1.update({'hello': 'world', 'goodbye': 'john'})
        c1.update({'hello': 'dolly', 'dolly': 'parton'})
        c2 = Context()
        c2.update({'goodbye': 'world', 'python': 'rocks'})
        c2.update({'goodbye': 'dolly'})

        l = ContextList([c1, c2])
        # None, True and False are builtins of BaseContext, and present
        # in every Context without needing to be added.
        self.assertEqual(set(['None', 'True', 'False', 'hello', 'goodbye',
                              'python', 'dolly']),
                         l.keys())

    def test_15368(self):
        # Need to insert a context processor that assumes certain things about
        # the request instance. This triggers a bug caused by some ways of