web/views/bookmark.py
author sylvain.thenault@logilab.fr
Wed, 15 Apr 2009 14:06:08 +0200
branchtls-sprint
changeset 1356 7b4802822f40
parent 1321 c5655237f08a
child 1498 2c6eec0b46b9
permissions -rw-r--r--
new del_rtag method, for testing purpose (at least)

"""Primary view for bookmarks + user's bookmarks box

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

from logilab.mtconverter import html_escape

from cubicweb import Unauthorized
from cubicweb.selectors import implements
from cubicweb.web.htmlwidgets import BoxWidget, BoxMenu, RawBoxItem
from cubicweb.web import action, formwidgets
from cubicweb.web.box import UserRQLBoxTemplate
from cubicweb.web.views.baseviews import PrimaryView
from cubicweb.web.views.editforms import AutomaticEntityForm

AutomaticEntityForm.rcategories.set_rtag('primary', 'path', 'subject', 'Bookmark')
AutomaticEntityForm.rwidgets.set_rtag(formwidgets.TextInput, 'path', 'subject', 'Bookmark')


class FollowAction(action.Action):
    id = 'follow'
    __select__ = implements('Bookmark')

    title = _('follow')
    category = 'mainactions'
    
    def url(self):
        return self.rset.get_entity(self.row or 0, self.col or 0).actual_url()


class BookmarkPrimaryView(PrimaryView):
    __select__ = implements('Bookmark')
        
    def cell_call(self, row, col):
        """the primary view for bookmark entity"""
        entity = self.complete_entity(row, col)
        self.w(u' ')
        self.w(u"<span class='title'><b>")
        self.w(u"%s : %s" % (self.req._('Bookmark'), html_escape(entity.title)))
        self.w(u"</b></span>")
        self.w(u'<br/><br/><div class="content"><a href="%s">' % (
            html_escape(entity.actual_url())))
        self.w(u'</a>')
        self.w(u'<p>%s%s</p>' % (self.req._('Used by:'), ', '.join(html_escape(u.name())
                                                                   for u in entity.bookmarked_by)))
        self.w(u'</div>')


class BookmarksBox(UserRQLBoxTemplate):
    """display a box containing all user's bookmarks"""
    id = 'bookmarks_box'
    order = 40
    title = _('bookmarks')
    rql = ('Any B,T,P ORDERBY lower(T) '
           'WHERE B is Bookmark,B title T, B path P, B bookmarked_by U, '
           'U eid %(x)s')
    etype = 'Bookmark'
    rtype = 'bookmarked_by'
    
    
    def call(self, **kwargs):
        req = self.req
        ueid = req.user.eid
        try:
            rset = req.execute(self.rql, {'x': ueid})
        except Unauthorized:
            # can't access to something in the query, forget this box
            return
        box = BoxWidget(req._(self.title), self.id)
        box.listing_class = 'sideBox'
        rschema = self.schema.rschema(self.rtype)
        eschema = self.schema.eschema(self.etype)
        candelete = rschema.has_perm(req, 'delete', toeid=ueid)
        if candelete:
            req.add_js( ('cubicweb.ajax.js', 'cubicweb.bookmarks.js') )
        else:
            dlink = None
        for bookmark in rset.entities():
            label = '<a href="%s">%s</a>' % (html_escape(bookmark.action_url()),
                                             html_escape(bookmark.title))
            if candelete:
                dlink = u'[<a href="javascript:removeBookmark(%s)" title="%s">-</a>]' % (
                    bookmark.eid, _('delete this bookmark'))
                label = '%s %s' % (dlink, label)
            box.append(RawBoxItem(label))
        if eschema.has_perm(req, 'add') and rschema.has_perm(req, 'add', toeid=ueid):
            boxmenu = BoxMenu(req._('manage bookmarks'))
            linkto = 'bookmarked_by:%s:subject' % ueid
            # use a relative path so that we can move the application without
            # loosing bookmarks
            path = req.relative_path()
            url = self.create_url(self.etype, __linkto=linkto, path=path)
            boxmenu.append(self.mk_action(req._('bookmark this page'), url,
                                          category='manage', id='bookmark'))
            if rset:
                if req.user.is_in_group('managers'):
                    bookmarksrql = 'Bookmark B WHERE B bookmarked_by U, U eid %s' % ueid
                    erset = rset
                else:
                    # we can't edit shared bookmarks we don't own
                    bookmarksrql = 'Bookmark B WHERE B bookmarked_by U, B owned_by U, U eid %(x)s'
                    erset = req.execute(bookmarksrql, {'x': ueid}, 'x',
                                                build_descr=False)
                    bookmarksrql %= {'x': ueid}
                if erset:
                    url = self.build_url(vid='muledit', rql=bookmarksrql)
                    boxmenu.append(self.mk_action(self.req._('edit bookmarks'), url, category='manage'))
            url = req.user.absolute_url(vid='xaddrelation', rtype='bookmarked_by',
                                        target='subject')
            boxmenu.append(self.mk_action(self.req._('pick existing bookmarks'), url, category='manage'))
            box.append(boxmenu)
        if not box.is_empty():
            box.render(self.w)