From c8b4a272fa6f3c5023a00342b4a5e745f77aa2c7 Mon Sep 17 00:00:00 2001 From: Stephen Burrows Date: Mon, 4 Oct 2010 11:54:31 -0400 Subject: [PATCH] Added kwarg capability to embed tag. Adjusted reference substitution to account for kwargs. --- contrib/penfield/embed.py | 16 +++++----- contrib/penfield/templatetags/embed.py | 43 +++++++++++++++++--------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/contrib/penfield/embed.py b/contrib/penfield/embed.py index ca49baa..43c08a6 100644 --- a/contrib/penfield/embed.py +++ b/contrib/penfield/embed.py @@ -9,9 +9,6 @@ from philo.contrib.penfield.templatetags.embed import EmbedNode from philo.utils import nodelist_crawl -embed_re = re.compile("{% embed (?P\w+)\.(?P\w+) (?P)\w+ %}") - - class Embed(models.Model): embedder_content_type = models.ForeignKey(ContentType, related_name="embedder_related") embedder_object_id = models.PositiveIntegerField() @@ -31,14 +28,17 @@ class Embed(models.Model): for field in embedder._meta.fields: if isinstance(field, EmbedField): attr = getattr(embedder, field.attname) - setattr(embedder, field.attname, attr.replace(self.get_embed_tag(), '')) + setattr(embedder, field.attname, self.embed_re.sub('', attr)) embedder.save() - def get_embed_tag(self): - """Convenience function to construct the embed tag that would create this instance.""" - ct = self.embedded_content_type - return "{%% embed %s.%s %s %%}" % (ct.app_label, ct.model, self.embedded_object_id) + def get_embed_re(self): + """Convenience function to return a compiled regular expression to find embed tags that would create this instance.""" + if not hasattr(self, '_embed_re'): + ct = self.embedded_content_type + self._embed_re = re.compile("{%% ?embed %s.%s %s( .*?)? ?%%}" % (ct.app_label, ct.model, self.embedded_object_id)) + return self._embed_re + embed_re = property(get_embed_re) class Meta: app_label = 'penfield' diff --git a/contrib/penfield/templatetags/embed.py b/contrib/penfield/templatetags/embed.py index 8da99af..7d1b26a 100644 --- a/contrib/penfield/templatetags/embed.py +++ b/contrib/penfield/templatetags/embed.py @@ -8,11 +8,16 @@ register = template.Library() class EmbedNode(template.Node): - def __init__(self, content_type, varname, object_pk=None, template_name=None): + def __init__(self, content_type, varname, object_pk=None, template_name=None, kwargs=None): assert template_name is not None or object_pk is not None self.content_type = content_type self.varname = varname + kwargs = kwargs or {} + for k, v in kwargs.items(): + kwargs[k] = template.Variable(v) + self.kwargs = kwargs + if object_pk is not None: self.object_pk = object_pk try: @@ -52,6 +57,9 @@ class EmbedNode(template.Node): context.push() context['embedded'] = self.instance + for k, v in self.kwargs.items(): + self.kwargs[k] = v.resolve(context) + context.update(self.kwargs) t_rendered = t.render(context) context.pop() return t_rendered @@ -69,20 +77,17 @@ def do_embed(parser, token): The {% embed %} tag can be used in three ways: {% embed as %} :: This sets which variable will be used to track embedding template names for the current context. Default: "embed" {% embed . with