Skip to content
Snippets Groups Projects
entities.py 3.71 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
Arthur Lutz's avatar
Arthur Lutz committed
from cubicweb.mixins import TreeMixIn
sylvain thenault's avatar
sylvain thenault committed
from cubicweb.selectors import implements
from cubicweb.entities import AnyEntity, fetch_config
Nicolas Chauvat's avatar
Nicolas Chauvat committed

class Comment(TreeMixIn, AnyEntity):
    """customized class for Comment entities"""
    __regid__ = 'Comment'
Nicolas Chauvat's avatar
Nicolas Chauvat committed
    tree_attribute = 'comments'
    __implements__ = AnyEntity.__implements__ + (ITree,)
    fetch_attrs, fetch_order = fetch_config(('creation_date',),
                                             'creation_date', order='ASC')
Nicolas Chauvat's avatar
Nicolas Chauvat committed

    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):
    __regid__ = '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):
Arthur Lutz's avatar
Arthur Lutz committed
        e = self.cw_rset.get_entity(row,col)
Nicolas Chauvat's avatar
Nicolas Chauvat committed
        if indentlevel:
            indentstr = '>'*indentlevel + ' '
        else:
            indentstr = ''
        if withauthor:
Arthur Lutz's avatar
Arthur Lutz committed
            _ = self._cw._
Nicolas Chauvat's avatar
Nicolas Chauvat committed
            author = e.created_by and e.created_by[0].login or _("Unknown author")
            head = u'%s%s - %s :' % (indentstr,
                                     _('On %s') %  self._cw.format_date(e.creation_date, time=True),
Nicolas Chauvat's avatar
Nicolas Chauvat committed
                                     _('%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"""
    __regid__ = 'fullthreadtext'
Nicolas Chauvat's avatar
Nicolas Chauvat committed
    def cell_call(self, row, col):
Arthur Lutz's avatar
Arthur Lutz committed
        e = self.cw_rset.get_entity(row,col)
Nicolas Chauvat's avatar
Nicolas Chauvat committed
        strings = []
        cpath = e.path()[1:]
        indentlevel = len(cpath) - 1
        for i, ceid in enumerate(cpath):
Arthur Lutz's avatar
Arthur Lutz committed
            comment = self._cw.execute('Any C,T,D WHERE C creation_date D, C content T, C eid %(x)s',
Nicolas Chauvat's avatar
Nicolas Chauvat committed
                                       {'x': ceid}, 'x', build_descr=True).get_entity(0, 0)
            strings.append(comment.view('fulltext', indentlevel=indentlevel-i,
                                        withauthor=i!=indentlevel).strip() + '\n')
Arthur Lutz's avatar
Arthur Lutz committed
        strings.append(u'\n%s: %s' % (self._cw._('i18n_by_author_field'),
Nicolas Chauvat's avatar
Nicolas Chauvat committed
                                      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
    """
    __regid__ = 'fullthreadtext_descending'
Nicolas Chauvat's avatar
Nicolas Chauvat committed
    def cell_call(self, row, col, indentlevel=0):
Arthur Lutz's avatar
Arthur Lutz committed
        e = self.cw_rset.get_entity(row,col)
Nicolas Chauvat's avatar
Nicolas Chauvat committed
        self.w(e.view('fulltext', indentlevel=indentlevel).strip() + '\n')
        subcommentsrset = e.related('comments', 'object')
        if subcommentsrset:
            self.wview('fulltext', subcommentsrset, indentlevel=indentlevel+1)