web/component.py
changeset 6151 f910c60b84ff
parent 6141 b8287e54b528
child 6279 42079f752a9c
equal deleted inserted replaced
6149:57e956441ca4 6151:f910c60b84ff
   340 
   340 
   341 
   341 
   342 class EditRelationMixIn(ReloadableMixIn):
   342 class EditRelationMixIn(ReloadableMixIn):
   343     def box_item(self, entity, etarget, rql, label):
   343     def box_item(self, entity, etarget, rql, label):
   344         """builds HTML link to edit relation between `entity` and `etarget`"""
   344         """builds HTML link to edit relation between `entity` and `etarget`"""
   345         role, target = get_role(self), get_target(self)
   345         role, target = role(self), get_target(self)
   346         args = {role[0] : entity.eid, target[0] : etarget.eid}
   346         args = {role[0] : entity.eid, target[0] : etarget.eid}
   347         url = self._cw.user_rql_callback((rql, args))
   347         url = self._cw.user_rql_callback((rql, args))
   348         # for each target, provide a link to edit the relation
   348         # for each target, provide a link to edit the relation
   349         return u'[<a href="%s">%s</a>] %s' % (xml_escape(url), label,
   349         return u'[<a href="%s">%s</a>] %s' % (xml_escape(url), label,
   350                                               etarget.view('incontext'))
   350                                               etarget.view('incontext'))
   353         rql = 'DELETE S %s O WHERE S eid %%(s)s, O eid %%(o)s' % self.rtype
   353         rql = 'DELETE S %s O WHERE S eid %%(s)s, O eid %%(o)s' % self.rtype
   354         return [self.box_item(entity, etarget, rql, u'-')
   354         return [self.box_item(entity, etarget, rql, u'-')
   355                 for etarget in self.related_entities(entity)]
   355                 for etarget in self.related_entities(entity)]
   356 
   356 
   357     def related_entities(self, entity):
   357     def related_entities(self, entity):
   358         return entity.related(self.rtype, get_role(self), entities=True)
   358         return entity.related(self.rtype, role(self), entities=True)
   359 
   359 
   360     def unrelated_boxitems(self, entity):
   360     def unrelated_boxitems(self, entity):
   361         rql = 'SET S %s O WHERE S eid %%(s)s, O eid %%(o)s' % self.rtype
   361         rql = 'SET S %s O WHERE S eid %%(s)s, O eid %%(o)s' % self.rtype
   362         return [self.box_item(entity, etarget, rql, u'+')
   362         return [self.box_item(entity, etarget, rql, u'+')
   363                 for etarget in self.unrelated_entities(entity)]
   363                 for etarget in self.unrelated_entities(entity)]
   364 
   364 
   365     def unrelated_entities(self, entity):
   365     def unrelated_entities(self, entity):
   366         """returns the list of unrelated entities, using the entity's
   366         """returns the list of unrelated entities, using the entity's
   367         appropriate vocabulary function
   367         appropriate vocabulary function
   368         """
   368         """
   369         skip = set(unicode(e.eid) for e in entity.related(self.rtype, get_role(self),
   369         skip = set(unicode(e.eid) for e in entity.related(self.rtype, role(self),
   370                                                           entities=True))
   370                                                           entities=True))
   371         skip.add(None)
   371         skip.add(None)
   372         skip.add(INTERNAL_FIELD_VALUE)
   372         skip.add(INTERNAL_FIELD_VALUE)
   373         filteretype = getattr(self, 'etype', None)
   373         filteretype = getattr(self, 'etype', None)
   374         entities = []
   374         entities = []
   375         form = self._cw.vreg['forms'].select('edition', self._cw,
   375         form = self._cw.vreg['forms'].select('edition', self._cw,
   376                                              rset=self.cw_rset,
   376                                              rset=self.cw_rset,
   377                                              row=self.cw_row or 0)
   377                                              row=self.cw_row or 0)
   378         field = form.field_by_name(self.rtype, get_role(self), entity.e_schema)
   378         field = form.field_by_name(self.rtype, role(self), entity.e_schema)
   379         for _, eid in field.vocabulary(form):
   379         for _, eid in field.vocabulary(form):
   380             if eid not in skip:
   380             if eid not in skip:
   381                 entity = self._cw.entity_from_eid(eid)
   381                 entity = self._cw.entity_from_eid(eid)
   382                 if filteretype is None or entity.__regid__ == filteretype:
   382                 if filteretype is None or entity.__regid__ == filteretype:
   383                     entities.append(entity)
   383                     entities.append(entity)
   389     relation
   389     relation
   390 
   390 
   391     subclasses should define at least id, rtype and target class attributes.
   391     subclasses should define at least id, rtype and target class attributes.
   392     """
   392     """
   393     def render_title(self, w):
   393     def render_title(self, w):
   394         return display_name(self._cw, self.rtype, get_role(self),
   394         return display_name(self._cw, self.rtype, role(self),
   395                             context=self.entity.__regid__)
   395                             context=self.entity.__regid__)
   396 
   396 
   397     def render_body(self, w):
   397     def render_body(self, w):
   398         self._cw.add_js('cubicweb.ajax.js')
   398         self._cw.add_js('cubicweb.ajax.js')
   399         related = self.related_boxitems(self.entity)
   399         related = self.related_boxitems(self.entity)