# copyright 2003-2011 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/>."""Set of views allowing edition of entities/relations using ajax"""__docformat__="restructuredtext en"fromcubicwebimportrolefromcubicweb.viewimportViewfromcubicweb.predicatesimportmatch_form_params,match_kwargsfromcubicweb.webimportcomponent,stdmsgs,formwidgetsasfwclassAddRelationView(component.EditRelationMixIn,View):"""base class for view which let add entities linked by a given relation subclasses should define at least id, rtype and target class attributes. """__registry__='views'__regid__='xaddrelation'__select__=(match_form_params('rtype','target')|match_kwargs('rtype','target'))cw_property_defs={}# don't want to inherit this from Boxexpected_kwargs=form_params=('rtype','target')build_js=component.EditRelationMixIn.build_reload_js_calldefcell_call(self,row,col,rtype=None,target=None,etype=None):self.rtype=rtypeorself._cw.form['rtype']self.target=targetorself._cw.form['target']self.etype=etypeorself._cw.form.get('etype')entity=self.cw_rset.get_entity(row,col)rschema=self._cw.vreg.schema.rschema(self.rtype)ifnotself.etype:ifself.target=='object':etypes=rschema.objects(entity.e_schema)else:etypes=rschema.subjects(entity.e_schema)iflen(etypes)==1:self.etype=etypes[0]self.w(u'<div id="%s">'%self.domid)self.w(u'<h1>%s</h1>'%self._cw._('relation %(relname)s of %(ent)s')%{'relname':rschema.display_name(self._cw,role(self)),'ent':entity.view('incontext')})self.w(u'<ul>')forboxiteminself.unrelated_boxitems(entity):self.w('<li class="invisible">%s</li>'%boxitem)self.w(u'</ul></div>')defunrelated_entities(self,entity):"""returns the list of unrelated entities if etype is not defined on the Box's class, the default behaviour is to use the entity's appropraite vocabulary function """# use entity.unrelated if we've been asked for a particular etypeifgetattr(self,'etype',None):rset=entity.unrelated(self.rtype,self.etype,role(self),ordermethod='fetch_order')self.paginate(self._cw,rset=rset,w=self.w)returnrset.entities()super(AddRelationView,self).unrelated_entities(self)defajax_composite_form(container,entity,rtype,okjs,canceljs,entityfkwargs=None):""" * if entity is None, edit container (assert container.has_eid()) * if entity has not eid, will be created * if container has not eid, will be created (see vcreview InsertionPoint) """req=container._cwparentexists=entityisNoneorcontainer.has_eid()buttons=[fw.Button(onclick=okjs),fw.Button(stdmsgs.BUTTON_CANCEL,onclick=canceljs)]freg=req.vreg['forms']# main form kwargsmkwargs=dict(action='#',domid='%sForm%s'%(rtype,container.eid),form_buttons=buttons,onsubmit='javascript: %s; return false'%okjs)# entity form kwargs# use formtype=inlined to skip the generic relations edition sectionfkwargs=dict(entity=entityorcontainer,formtype='inlined')ifentityfkwargsisnotNone:fkwargs.update(entityfkwargs)# form valuesformvalues={}ifentityisnotNone:# creationformvalues[rtype]=container.eidifparentexists:# creation / editionmkwargs.update(fkwargs)# use formtype=inlined to avoid viewing the relation edition sectionform=freg.select('edition',req,**mkwargs)else:# creation of both container and comment entitiesform=freg.select('composite',req,form_renderer_id='default',**mkwargs)form.add_subform(freg.select('edition',req,entity=container,mainform=False,mainentity=True))form.add_subform(freg.select('edition',req,mainform=False,**fkwargs))returnform,formvalues