Skip to content
Snippets Groups Projects
entities.py 3.31 KiB
Newer Older
Nicolas Chauvat's avatar
Nicolas Chauvat committed
"""entity classes for Comment entities

:organization: Logilab
:copyright: 2003-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
"""
__docformat__ = "restructuredtext en"

from cubicweb.interfaces import ITree
from cubicweb.common.mixins import TreeMixIn
sylvain thenault's avatar
sylvain thenault committed
from cubicweb.selectors import implements
Nicolas Chauvat's avatar
Nicolas Chauvat committed
from cubicweb.entities import AnyEntity

class Comment(TreeMixIn, AnyEntity):
    """customized class for Comment entities"""
    id = 'Comment'
    tree_attribute = 'comments'
    __implements__ = AnyEntity.__implements__ + (ITree,)

    def dc_title(self):
        return u'#%s' % self.eid

    def dc_description(self, format='text/plain'):
        return self.printable_value('content', format=format)


# some views potentially needed on web *and* server side (for notification)
# so put them here

from logilab.common.textutils import normalize_text

from cubicweb.common.view import EntityView


class CommentFullTextView(EntityView):
    id = 'fulltext'
sylvain thenault's avatar
sylvain thenault committed
    __select__ = implements('Comment')
Nicolas Chauvat's avatar
Nicolas Chauvat committed

    def cell_call(self, row, col, indentlevel=0, withauthor=True):
        e = self.entity(row, col)
        if indentlevel:
            indentstr = '>'*indentlevel + ' '
        else:
            indentstr = ''
        if withauthor:
            _ = self.req._
            author = e.created_by and e.created_by[0].login or _("Unknown author")
            head = u'%s%s - %s :' % (indentstr,
                                     _('On %s') % self.format_date(e.creation_date, time=True),
                                     _('%s wrote') % author)
            lines = [head]
        else:
            lines = []
        content = e.printable_value('content', format='text/plain')
        lines.append(normalize_text(content, 80, indentstr,
                                    rest=e.content_format=='text/rest'))
        lines.append(indentstr[:-2])
        self.w(u'\n'.join(lines))


class CommentFullThreadText(CommentFullTextView):
    """display a comment and its parents"""
    id = 'fullthreadtext'
    
    def cell_call(self, row, col):
        e = self.entity(row, col)
        strings = []
        cpath = e.path()[1:]
        indentlevel = len(cpath) - 1
        for i, ceid in enumerate(cpath):
            comment = self.req.execute('Any C,T,D WHERE C creation_date D, C content T, C eid %(x)s',
                                       {'x': ceid}, 'x', build_descr=True).get_entity(0, 0)
            strings.append(comment.view('fulltext', indentlevel=indentlevel-i,
                                        withauthor=i!=indentlevel).strip() + '\n')
        strings.append(u'\n%s: %s' % (self.req._('i18n_by_author_field'),
                                      e.dc_creator() or _('unknown author')))
        strings.append(u'url: %s' % e.root().absolute_url())
        self.w(u'\n'.join(strings))


class CommentFullThreadDescText(CommentFullTextView):
    """same as fullthreadtext, but going from top level object to leaf comments
    """
    id = 'fullthreadtext_descending'
    
    def cell_call(self, row, col, indentlevel=0):
        e = self.entity(row, col)
        self.w(e.view('fulltext', indentlevel=indentlevel).strip() + '\n')
        subcommentsrset = e.related('comments', 'object')
        if subcommentsrset:
            self.wview('fulltext', subcommentsrset, indentlevel=indentlevel+1)