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

:organization: Logilab
sylvain thenault's avatar
sylvain thenault committed
:copyright: 2003-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
Nicolas Chauvat's avatar
Nicolas Chauvat committed
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
"""
__docformat__ = "restructuredtext en"

sylvain thenault's avatar
sylvain thenault committed
from logilab.common.textutils import normalize_text

from cubicweb.view import EntityView
Nicolas Chauvat's avatar
Nicolas Chauvat committed
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)

    def after_deletion_path(self):
        """return (path, parameters) which should be used as redirect
        information when this entity is being deleted
        """
        return self.root().rest_path(), {}

Nicolas Chauvat's avatar
Nicolas Chauvat committed

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


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'
Nicolas Chauvat's avatar
Nicolas Chauvat committed
    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'
Nicolas Chauvat's avatar
Nicolas Chauvat committed
    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)