Serotonin Storm

source>mptt_comments>templatetags>mptt_comments_tags.py
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
from django.contrib.comments.templatetags.comments import BaseCommentNode, CommentListNode
from django import template
from django.conf import settings
from django.template.loader import render_to_string
from django.utils.safestring import mark_safe
import mptt_comments

register = template.Library()

class BaseMpttCommentNode(BaseCommentNode):
    
    root_node = None
    
    def __init__(self, ctype=None, object_pk_expr=None, object_expr=None, as_varname=None, comment=None):
        super(BaseMpttCommentNode, self). __init__(ctype=ctype, object_pk_expr=object_pk_expr, object_expr=object_expr, as_varname=as_varname, comment=comment)
        self.comment_model = mptt_comments.get_model()
    
    def get_root_node(self, context):
        if not self.root_node:
            ctype, object_pk = self.get_target_ctype_pk(context)
            self.root_node = self.comment_model.objects.get_root_comment(ctype, object_pk)
        return self.root_node
objects = {}

class MpttCommentFormNode(BaseMpttCommentNode):
   
    global objects
   
    """Insert a form for the comment model into the context."""
           
    def get_form(self, context):
        ctype, object_pk = self.get_target_ctype_pk(context)
       
        key = str(ctype)+'_'+str(object_pk)
       
        if objects.has_key(key):
            return mptt_comments.get_form()(objects[key], parent_comment=self.get_root_node(context))
        elif object_pk:
            objects[key] = ctype.get_object_for_this_type(pk=object_pk)
            return mptt_comments.get_form()(objects[key], parent_comment=self.get_root_node(context))
        else:
            return None        

    def render(self, context):
        context[self.as_varname] = self.get_form(context)
        return ''

class MpttCommentListNode(BaseMpttCommentNode):

    offset = getattr(settings, 'MPTT_COMMENTS_OFFSET', 20)
    
    cutoff_level = getattr(settings, 'MPTT_COMMENTS_CUTOFF', 3)
    bottom_level = 0 
    
    def get_query_set(self, context):

        related = getattr(settings, 'MPTT_COMMENTS_SELECT_RELATED', None)

        qs = super(MpttCommentListNode, self).get_query_set(context)
        root_node = self.get_root_node(context)
        qs = qs.filter(tree_id=root_node.tree_id, level__gte=1, level__lte=self.cutoff_level).order_by('tree_id', 'lft')

        if related:
            qs = qs.select_related(*related)

        return qs
        
    def get_context_value_from_queryset(self, context, qs):
        return list(qs[:self.offset])
        
    def render(self, context):
        qs = self.get_query_set(context)
        context[self.as_varname] = self.get_context_value_from_queryset(context, qs)
        comments_remaining = self.get_query_set(context).count()
        context['comments_remaining'] = (comments_remaining - self.offset) > 0 and comments_remaining - self.offset or 0
        context['root_comment'] = self.get_root_node(context)
        context['collapse_levels_above'] = 2
        context['cutoff_level'] = self.cutoff_level
        context['bottom_level'] = self.bottom_level
        return ''        
        
def get_mptt_comment_list(parser, token):
    """
    Gets the list of comments for the given params and populates the template
    context with a variable containing that value, whose name is defined by the
    'as' clause.

    Syntax::

        {% get_comment_list for [object] as [varname]  %}
        {% get_comment_list for [app].[model] [object_id] as [varname]  %}

    Example usage::

        {% get_comment_list for event as comment_list %}
        {% for comment in comment_list %}
            ...
        {% endfor %}

    """
    return MpttCommentListNode.handle_token(parser, token)


def get_mptt_comment_form(parser, token):
    """
    Get a (new) form object to post a new comment.

    Syntax::

        {% get_comment_form for [object] as [varname] %}
        {% get_comment_form for [app].[model] [object_id] as [varname] %}
    """
    return MpttCommentFormNode.handle_token(parser, token)


def mptt_comment_form_target():
    """
    Get the target URL for the comment form.

    Example::

        <form action="{% comment_form_target %}" method="POST">
    """
    return mptt_comments.get_form_target()

def children_count(comment):
    return (comment.rght - comment.lft) / 2

def mptt_comments_media():

    return mark_safe( render_to_string( ('comments/comments_media.html',) , { }) )
    
def display_comment_toplevel_for(target):

    model = target.__class__
        
    template_list = [
        "comments/%s_%s_display_comments_toplevel.html" % tuple(str(model._meta).split(".")),
        "comments/%s_display_comments_toplevel.html" % model._meta.app_label,
        "comments/display_comments_toplevel.html"
    ]
    return render_to_string(
        template_list, {
            "object" : target
        } 
        # RequestContext(context['request'], {})
    )
    
register.filter(children_count)
register.tag(get_mptt_comment_form)
register.simple_tag(mptt_comment_form_target)
register.simple_tag(mptt_comments_media)
register.tag(get_mptt_comment_list)
register.simple_tag(display_comment_toplevel_for)