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) |