# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr## This file is part of CubicWeb.## CubicWeb is free software: you can redistribute it and/or modify it under the# terms of the GNU Lesser General Public License as published by the Free# Software Foundation, either version 2.1 of the License, or (at your option)# any later version.## CubicWeb is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more# details.## You should have received a copy of the GNU Lesser General Public License along# with CubicWeb. If not, see <http://www.gnu.org/licenses/>."""Primary view for bookmarks + user's bookmarks box"""__docformat__="restructuredtext en"_=unicodefromlogilab.mtconverterimportxml_escapefromcubicwebimportUnauthorizedfromcubicweb.predicatesimportis_instance,one_line_rsetfromcubicweb.webimportaction,component,htmlwidgets,formwidgetsasfwfromcubicweb.web.viewsimportuicfg,primaryfromcubicweb.web.views.ajaxcontrollerimportajaxfunc_abaa=uicfg.actionbox_appearsin_addmenu_abaa.tag_subject_of(('*','bookmarked_by','*'),False)_abaa.tag_object_of(('*','bookmarked_by','*'),False)_afs=uicfg.autoform_section_afs.tag_object_of(('*','bookmarked_by','CWUser'),'main','metadata')_afs.tag_attribute(('Bookmark','path'),'main','attributes')_afs.tag_attribute(('Bookmark','path'),'muledit','attributes')_affk=uicfg.autoform_field_kwargs_affk.tag_attribute(('Bookmark','path'),{'widget':fw.EditableURLWidget})classFollowAction(action.Action):__regid__='follow'__select__=one_line_rset()&is_instance('Bookmark')title=_('follow')category='mainactions'defurl(self):returnself.cw_rset.get_entity(self.cw_rowor0,self.cw_color0).actual_url()classBookmarkPrimaryView(primary.PrimaryView):__select__=is_instance('Bookmark')defcell_call(self,row,col):"""the primary view for bookmark entity"""entity=self.cw_rset.complete_entity(row,col)self.w(u' ')self.w(u"<span class='title'><b>")self.w(u"%s : %s"%(self._cw._('Bookmark'),xml_escape(entity.title)))self.w(u"</b></span>")self.w(u'<br/><br/><div class="content"><a href="%s">'%(xml_escape(entity.actual_url())))self.w(u'</a>')self.w(u'<p>%s%s</p>'%(self._cw._('Used by:'),', '.join(xml_escape(u.name())foruinentity.bookmarked_by)))self.w(u'</div>')classBookmarksBox(component.CtxComponent):"""display a box containing all user's bookmarks"""__regid__='bookmarks_box'title=_('bookmarks')order=40rql=('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')definit_rendering(self):ueid=self._cw.user.eidself.bookmarks_rset=self._cw.execute(self.rql,{'x':ueid})rschema=self._cw.vreg.schema.rschema('bookmarked_by')eschema=self._cw.vreg.schema.eschema('Bookmark')self.can_delete=rschema.has_perm(self._cw,'delete',toeid=ueid)self.can_edit=(eschema.has_perm(self._cw,'add')andrschema.has_perm(self._cw,'add',toeid=ueid))ifnotself.bookmarks_rsetandnotself.can_edit:raisecomponent.EmptyComponent()self.items=[]defrender_body(self,w):ueid=self._cw.user.eidreq=self._cwifself.can_delete:req.add_js('cubicweb.ajax.js')forbookmarkinself.bookmarks_rset.entities():label=self.link(bookmark.title,bookmark.action_url())ifself.can_delete:dlink=u'[<a class="action" href="javascript:removeBookmark(%s)" title="%s">-</a>]'%(bookmark.eid,req._('delete this bookmark'))label='<div>%s%s</div>'%(dlink,label)self.append(label)ifself.can_edit:menu=htmlwidgets.BoxMenu(req._('manage bookmarks'))linkto='bookmarked_by:%s:subject'%ueid# use a relative path so that we can move the instance without# loosing bookmarkspath=req.relative_path()# XXX if vtitle specified in params, extract it and use it as# default value for bookmark's titleurl=req.vreg['etypes'].etype_class('Bookmark').cw_create_url(req,__linkto=linkto,path=path)menu.append(self.link(req._('bookmark this page'),url))ifself.bookmarks_rset:ifreq.user.is_in_group('managers'):bookmarksrql='Bookmark B WHERE B bookmarked_by U, U eid %s'%ueiderset=self.bookmarks_rsetelse:# we can't edit shared bookmarks we don't ownbookmarksrql='Bookmark B WHERE B bookmarked_by U, B owned_by U, U eid %(x)s'erset=req.execute(bookmarksrql,{'x':ueid},build_descr=False)bookmarksrql%={'x':ueid}iferset:url=req.build_url(vid='muledit',rql=bookmarksrql)menu.append(self.link(req._('edit bookmarks'),url))url=req.user.absolute_url(vid='xaddrelation',rtype='bookmarked_by',target='subject')menu.append(self.link(req._('pick existing bookmarks'),url))self.append(menu)self.render_items(w)@ajaxfuncdefdelete_bookmark(self,beid):rql='DELETE B bookmarked_by U WHERE B eid %(b)s, U eid %(u)s'self._cw.execute(rql,{'b':int(beid),'u':self._cw.user.eid})