Example #1
0
 def test_unpickling(self):
     self.assertEqual(unpickle_context(pickle_context(Context())),
                      flatten_context(Context()))
     context = Context({'test_var': 'TEST'})
     pickled_context = pickle_context(context)
     unpickled_context = unpickle_context(pickled_context)
     self.assertEqual(flatten_context(context), unpickled_context)
Example #2
0
    def render(self, context):
        # our main context
        storage = Context()

        # stash the whole context if needed
        if settings.KEEP_CONTEXT:
            storage.update(flatten_context(context))

        # but check if there are variables specifically wanted
        for var_name in self.var_names:
            if var_name[0] in ('"', "'") and var_name[-1] == var_name[0]:
                var_name = var_name[1:-1]
            try:
                storage[var_name] = Variable(var_name).resolve(context)
            except VariableDoesNotExist:
                raise TemplateSyntaxError(
                    '"phased" tag got an unknown variable: %r' % var_name)

        # lastly return the pre phased template part
        return u'%(delimiter)s%(content)s%(pickled_context)s%(pickled_components)s%(delimiter)s' % {
            'content': self.content,
            'delimiter': settings.SECRET_DELIMITER,
            'pickled_context': pickle_context(backup_csrf_token(context, storage)),
            'pickled_components': pickle_components(self.components),
        }
Example #3
0
 def test_unpickling_with_template_and_pattern(self):
     context = Context({'test_var': 'TEST'})
     template = '<!-- better be careful %s yikes -->'
     pattern = re.compile(r'.*<!-- better be careful (.*) yikes -->.*')
     pickled_context = pickle_context(context, template)
     unpickled_context = unpickle_context(pickled_context, pattern)
     self.assertEqual(flatten_context(context), unpickled_context)
Example #4
0
    def render(self, context):
        # our main context
        storage = Context()

        # stash the whole context if needed
        if getattr(settings, 'PHASED_KEEP_CONTEXT', False):
            storage.update(flatten_context(context))

        # but check if there are variables specifically wanted
        for var_name in self.var_names:
            if var_name[0] in ('"', "'") and var_name[-1] == var_name[0]:
                var_name = var_name[1:-1]
            try:
                storage[var_name] = Variable(var_name).resolve(context)
            except VariableDoesNotExist:
                raise TemplateSyntaxError(
                    '"phased" tag got an unknown variable: %r' % var_name)

        storage = backup_csrf_token(context, storage)

        # lastly return the pre phased template part
        return u'%(delimiter)s%(content)s%(pickled)s%(delimiter)s' % {
            'content': self.content,
            'delimiter': settings.PHASED_SECRET_DELIMITER,
            'pickled': pickle_context(storage),
        }
Example #5
0
 def test_unpickling_with_template_and_pattern(self):
     context = Context({'test_var': 'TEST'})
     template = '<!-- better be careful %s yikes -->'
     pattern = re.compile(r'.*<!-- better be careful (.*) yikes -->.*')
     pickled_context = pickle_context(context, template)
     unpickled_context = unpickle_context(pickled_context, pattern)
     self.assertEqual(flatten_context(context), unpickled_context)
Example #6
0
 def test_flatten_nested(self):
     context = Context({'test_var': 'TEST'})
     context.update(Context({'test_var': 'TEST2', 'abc': 'def'}))
     self.assertEqual(flatten_context(context), {
         'test_var': 'TEST2',
         'abc': 'def'
     })
Example #7
0
    def render(self, context):
        # our main context
        storage = Context()

        # stash the whole context if needed
        if getattr(settings, 'PHASED_KEEP_CONTEXT', False):
            storage.update(flatten_context(context))

        # but check if there are variables specifically wanted
        for var_name in self.var_names:
            if var_name[0] in ('"', "'") and var_name[-1] == var_name[0]:
                var_name = var_name[1:-1]
            try:
                storage[var_name] = Variable(var_name).resolve(context)
            except VariableDoesNotExist:
                pass

        storage = backup_csrf_token(context, storage)

        # lastly return the pre phased template part
        return u'%(delimiter)s%(content)s%(pickled)s%(delimiter)s' % {
            'content': self.content,
            'delimiter': settings.PHASED_SECRET_DELIMITER,
            'pickled': pickle_context(storage),
        }
Example #8
0
 def test_phased(self):
     context = Context({'test_var': 'TEST'})
     first_render = compile_string(self.test_template, None).render(context)
     original_context = unpickle_context(first_render)
     self.assertNotEqual(flatten_context(context), original_context)
     pickled_context = '{# context "gAJ9cQFVCmNzcmZfdG9rZW5xAlULTk9UUFJPVklERURxA3Mu" endcontext #}'
     pickled_components = '{# components "gAJdcQFVH3BoYXNlZC50ZW1wbGF0ZXRhZ3MucGhhc2VkX3RhZ3NxAmEu" endcomponents #}'
     self.assertEqual(first_render, '%(delimiter)s{%% if 1 %%}test{%% endif %%}%(pickled_context)s%(pickled_components)s%(delimiter)sTEST' % dict(delimiter=settings.SECRET_DELIMITER, pickled_context=pickled_context, pickled_components=pickled_components))
Example #9
0
 def test_phased(self):
     context = Context({'test_var': 'TEST'})
     first_render = compile_string(self.test_template, None).render(context)
     original_context = unpickle_context(first_render)
     self.assertNotEqual(flatten_context(context), original_context)
     pickled_context = pickle_context(Context({'csrf_token': 'NOTPROVIDED'}))
     self.assertEqual(first_render, '%(delimiter)s{%% if 1 %%}test{%% endif %%}%(pickled_context)s%(delimiter)sTEST' %
         dict(delimiter=settings.PHASED_SECRET_DELIMITER, pickled_context=pickled_context))
Example #10
0
 def test_phased(self):
     context = Context({'test_var': 'TEST'})
     first_render = compile_string(self.test_template, None).render(context)
     original_context = unpickle_context(first_render)
     self.assertNotEqual(flatten_context(context), original_context)
     pickled_context = pickle_context(Context({'csrf_token': 'NOTPROVIDED'}))
     self.assertEqual(first_render, '%(delimiter)s{%% if 1 %%}test{%% endif %%}%(pickled_context)s%(delimiter)sTEST' %
         dict(delimiter=settings.PHASED_SECRET_DELIMITER, pickled_context=pickled_context))
Example #11
0
def pickle_context(context, template=None):
    """
    Pickle the given Context instance and do a few optimzations before.
    """
    pickle = get_pickle()
    if not isinstance(context, BaseContext):
        raise TemplateSyntaxError('Phased context is not a Context instance')
    pickled_context = pickle.dumps(flatten_context(context), protocol=pickle.HIGHEST_PROTOCOL)
    if template is None:
        template = '{# stashed context: "%s" #}'
    return template % base64.standard_b64encode(pickled_context)
Example #12
0
 def test_unpickling(self):
     self.assertEqual(unpickle_context(pickle_context(Context())), flatten_context(Context()))
     context = Context({'test_var': 'TEST'})
     pickled_context = pickle_context(context)
     unpickled_context = unpickle_context(pickled_context)
     self.assertEqual(flatten_context(context), unpickled_context)
Example #13
0
 def test_flatten_nested(self):
     context = Context({'test_var': 'TEST'})
     context.update(Context({'test_var': 'TEST2', 'abc': 'def'}))
     self.assertEqual(flatten_context(context), {'test_var': 'TEST2', 'abc': 'def'})