From: Joseph Spiros Date: Wed, 21 Jul 2010 16:55:17 +0000 (-0400) Subject: Merge branch 'master' of git://github.com/melinath/philo X-Git-Tag: philo-0.9~46 X-Git-Url: http://git.ithinksw.org/philo.git/commitdiff_plain/11f1c387f944adf710f7fa4614004f0ef9fda29b?hp=bcaf02b09b921364261bd186781f3ff1593fbee0 Merge branch 'master' of git://github.com/melinath/philo * 'master' of git://github.com/melinath/philo: Membersof now uses 'app_label.model'; removed blockcontainer Slight changes to penfield NewsletterIssueAdmin & added newsletter value models --- diff --git a/contrib/penfield/admin.py b/contrib/penfield/admin.py index ba885fd..56edd45 100644 --- a/contrib/penfield/admin.py +++ b/contrib/penfield/admin.py @@ -29,7 +29,7 @@ class NewsletterArticleAdmin(TitledAdmin): class NewsletterIssueAdmin(TitledAdmin): - pass + filter_horizontal = TitledAdmin.filter_horizontal + ('articles',) class NewsletterViewAdmin(EntityAdmin): diff --git a/contrib/penfield/models.py b/contrib/penfield/models.py index 0e5bce0..eede5a4 100644 --- a/contrib/penfield/models.py +++ b/contrib/penfield/models.py @@ -203,6 +203,9 @@ class Newsletter(Entity, Titled): pass +register_value_model(Newsletter) + + class NewsletterArticle(Entity, Titled): newsletter = models.ForeignKey(Newsletter, related_name='articles') authors = models.ManyToManyField(getattr(settings, 'PHILO_PERSON_MODULE', 'auth.User'), related_name='newsletterarticles') @@ -228,6 +231,9 @@ class NewsletterIssue(Entity, Titled): unique_together = (('newsletter', 'number'),) +register_value_model(NewsletterIssue) + + class NewsletterView(MultiView): ARTICLE_PERMALINK_STYLE_CHOICES = ( ('D', 'Year, month, and day'), diff --git a/models/collections.py b/models/collections.py index 9a737eb..539ecdb 100644 --- a/models/collections.py +++ b/models/collections.py @@ -3,6 +3,7 @@ from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic from philo.models.base import value_content_type_limiter, register_value_model from philo.utils import fattr +from django.template import add_to_builtins as register_templatetags class Collection(models.Model): @@ -42,4 +43,5 @@ class CollectionMember(models.Model): app_label = 'philo' +register_templatetags('philo.templatetags.collections') register_value_model(Collection) \ No newline at end of file diff --git a/templatetags/collections.py b/templatetags/collections.py index 8b73293..38b3f91 100644 --- a/templatetags/collections.py +++ b/templatetags/collections.py @@ -1,5 +1,6 @@ from django import template from django.conf import settings +from django.contrib.contenttypes.models import ContentType register = template.Library() @@ -8,22 +9,21 @@ register = template.Library() class MembersofNode(template.Node): def __init__(self, collection, model, as_var): self.collection = template.Variable(collection) - self.model = template.Variable(model) + self.model = model self.as_var = as_var def render(self, context): try: collection = self.collection.resolve(context) - model = self.model.resolve(context) - context[self.as_var] = collection.members.with_model(model) + context[self.as_var] = collection.members.with_model(self.model) except: pass - return settings.TEMPLATE_STRING_IF_INVALID + return '' def do_membersof(parser, token): """ - {% membersof with as %} + {% membersof with . as %} """ params=token.split_contents() tag = params[0] @@ -33,11 +33,19 @@ def do_membersof(parser, token): if params[2] != 'with': raise template.TemplateSyntaxError('"%s" template tag requires the third parameter to be "with"' % tag) + + try: + app_label, model = params[3].strip('"').split('.') + ct = ContentType.objects.get(app_label=app_label, model=model) + except ValueError: + raise template.TemplateSyntaxError('"%s" template tag option "with" requires an argument of the form app_label.model (see django.contrib.contenttypes)' % tag) + except ContentType.DoesNotExist: + raise template.TemplateSyntaxError('"%s" template tag option "with" requires an argument of the form app_label.model which refers to an installed content type (see django.contrib.contenttypes)' % tag) if params[4] != 'as': raise template.TemplateSyntaxError('"%s" template tag requires the fifth parameter to be "as"' % tag) - return MembersofNode(collection=params[1], model=params[3], as_var=params[5]) + return MembersofNode(collection=params[1], model=ct.model_class(), as_var=params[5]) register.tag('membersof', do_membersof) \ No newline at end of file diff --git a/templatetags/containers.py b/templatetags/containers.py index 7ed0bdc..92e126e 100644 --- a/templatetags/containers.py +++ b/templatetags/containers.py @@ -9,55 +9,24 @@ register = template.Library() class ContainerNode(template.Node): - child_nodelists = ('nodelist_main', 'nodelist_empty',) - - def __init__(self, name, references=None, as_var=None, nodelist_main=None, nodelist_empty=None): + def __init__(self, name, references=None, as_var=None): self.name = name self.as_var = as_var self.references = references - - if nodelist_main is None: - self.nodelist_main = template.NodeList() - else: - self.nodelist_main = nodelist_main - - if nodelist_empty is None: - self.nodelist_empty = template.NodeList() - else: - self.nodelist_empty = nodelist_empty def render(self, context): content = settings.TEMPLATE_STRING_IF_INVALID if 'page' in context: container_content = self.get_container_content(context) - if not self.nodelist_main: - if self.as_var: - context[self.as_var] = container_content - return '' - - if not container_content: - return '' - - return container_content - - if container_content: - if self.as_var is None: - self.as_var = self.name - - #make a new context - context.push() + if self.as_var: context[self.as_var] = container_content - nodelist = template.NodeList() - for node in self.nodelist_main: - nodelist.append(node.render(context)) - context.pop() - return nodelist.render(context) + return '' - if self.nodelist_empty is not None: - return self.nodelist_empty.render(context) + if not container_content: + return '' - return '' + return container_content def get_container_content(self, context): page = context['page'] @@ -85,8 +54,7 @@ class ContainerNode(template.Node): def do_container(parser, token): """ - {% container [[references ] as ] %} - {% blockcontainer [[references ] as ] %} [ {% empty %} ] {% endblockcontainer %} + {% container [[references ] as ] %} """ params = token.split_contents() if len(params) >= 2: @@ -115,22 +83,10 @@ def do_container(parser, token): raise template.TemplateSyntaxError('"%s" template tag option "as" requires an argument specifying a variable name' % tag) if references and not as_var: raise template.TemplateSyntaxError('"%s" template tags using "references" option require additional use of the "as" option specifying a variable name' % tag) - if tag == 'container': - return ContainerNode(name, references, as_var) - - nodelist_main = parser.parse(('empty','endblockcontainer',)) - token = parser.next_token() - - if token.contents == 'empty': - nodelist_empty = parser.parse(('endblockcontainer',)) - parser.delete_first_token() - else: - nodelist_empty = None - return ContainerNode(name, references, as_var, nodelist_main, nodelist_empty) + return ContainerNode(name, references, as_var) else: # error raise template.TemplateSyntaxError('"%s" template tag provided without arguments (at least one required)' % tag) register.tag('container', do_container) -register.tag('blockcontainer', do_container)