720 self.cw_attr_cache[name] = value = self._cw._('unaccessible') |
720 self.cw_attr_cache[name] = value = self._cw._('unaccessible') |
721 else: |
721 else: |
722 self.cw_attr_cache[name] = value = None |
722 self.cw_attr_cache[name] = value = None |
723 return value |
723 return value |
724 |
724 |
725 def related(self, rtype, role='subject', limit=None, entities=False): # XXX .cw_related |
725 def related(self, rtype, role='subject', limit=None, entities=False, # XXX .cw_related |
|
726 safe=False): |
726 """returns a resultset of related entities |
727 """returns a resultset of related entities |
727 |
728 |
728 :param role: is the role played by 'self' in the relation ('subject' or 'object') |
729 :param rtype: |
729 :param limit: resultset's maximum size |
730 the name of the relation, aka relation type |
730 :param entities: if True, the entites are returned; if False, a result set is returned |
731 :param role: |
|
732 the role played by 'self' in the relation ('subject' or 'object') |
|
733 :param limit: |
|
734 resultset's maximum size |
|
735 :param entities: |
|
736 if True, the entites are returned; if False, a result set is returned |
|
737 :param safe: |
|
738 if True, an empty rset/list of entities will be returned in case of |
|
739 :exc:`Unauthorized`, else (the default), the exception is propagated |
731 """ |
740 """ |
732 try: |
741 try: |
733 return self._cw_relation_cache(rtype, role, entities, limit) |
742 return self._cw_relation_cache(rtype, role, entities, limit) |
734 except KeyError: |
743 except KeyError: |
735 pass |
744 pass |
736 if not self.has_eid(): |
745 if not self.has_eid(): |
737 if entities: |
746 if entities: |
738 return [] |
747 return [] |
739 return self._cw.empty_rset() |
748 return self._cw.empty_rset() |
740 rql = self.cw_related_rql(rtype, role) |
749 rql = self.cw_related_rql(rtype, role) |
741 rset = self._cw.execute(rql, {'x': self.eid}) |
750 try: |
|
751 rset = self._cw.execute(rql, {'x': self.eid}) |
|
752 except Unauthorized: |
|
753 if not safe: |
|
754 raise |
|
755 rset = self._cw.empty_rset() |
742 self.cw_set_relation_cache(rtype, role, rset) |
756 self.cw_set_relation_cache(rtype, role, rset) |
743 return self.related(rtype, role, limit, entities) |
757 return self.related(rtype, role, limit, entities) |
744 |
758 |
745 def cw_related_rql(self, rtype, role='subject', targettypes=None): |
759 def cw_related_rql(self, rtype, role='subject', targettypes=None): |
746 rschema = self._cw.vreg.schema[rtype] |
760 rschema = self._cw.vreg.schema[rtype] |