Merge branch 'master' of git://github.com/melinath/philo
authorJoseph Spiros <joseph.spiros@ithinksw.com>
Wed, 21 Jul 2010 16:55:17 +0000 (12:55 -0400)
committerJoseph Spiros <joseph.spiros@ithinksw.com>
Wed, 21 Jul 2010 16:55:17 +0000 (12:55 -0400)
* 'master' of git://github.com/melinath/philo:
  Membersof now uses 'app_label.model'; removed blockcontainer
  Slight changes to penfield NewsletterIssueAdmin & added newsletter value models

contrib/penfield/admin.py
contrib/penfield/models.py
models/collections.py
templatetags/collections.py
templatetags/containers.py

index ba885fd..56edd45 100644 (file)
@@ -29,7 +29,7 @@ class NewsletterArticleAdmin(TitledAdmin):
 
 
 class NewsletterIssueAdmin(TitledAdmin):
-       pass
+       filter_horizontal = TitledAdmin.filter_horizontal + ('articles',)
 
 
 class NewsletterViewAdmin(EntityAdmin):
index 0e5bce0..eede5a4 100644 (file)
@@ -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'),
index 9a737eb..539ecdb 100644 (file)
@@ -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
index 8b73293..38b3f91 100644 (file)
@@ -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 <collection> with <model> as <var> %}
+       {% membersof <collection> with <app_label>.<model_name> as <var> %}
        """
        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
index 7ed0bdc..92e126e 100644 (file)
@@ -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 <name> [[references <type>] as <variable>] %} 
-       {% blockcontainer <name> [[references <type>] as <variable>] %} [ {% empty %} ] {% endblockcontainer %}
+       {% container <name> [[references <type>] as <variable>] %}
        """
        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)