834 self.cw_attr_cache[name] = value = self._cw._('unaccessible') |
834 self.cw_attr_cache[name] = value = self._cw._('unaccessible') |
835 else: |
835 else: |
836 self.cw_attr_cache[name] = value = None |
836 self.cw_attr_cache[name] = value = None |
837 return value |
837 return value |
838 |
838 |
839 def related(self, rtype, role='subject', limit=None, entities=False): # XXX .cw_related |
839 def related(self, rtype, role='subject', limit=None, entities=False, # XXX .cw_related |
|
840 safe=False): |
840 """returns a resultset of related entities |
841 """returns a resultset of related entities |
841 |
842 |
842 :param role: is the role played by 'self' in the relation ('subject' or 'object') |
843 :param rtype: |
843 :param limit: resultset's maximum size |
844 the name of the relation, aka relation type |
844 :param entities: if True, the entites are returned; if False, a result set is returned |
845 :param role: |
|
846 the role played by 'self' in the relation ('subject' or 'object') |
|
847 :param limit: |
|
848 resultset's maximum size |
|
849 :param entities: |
|
850 if True, the entites are returned; if False, a result set is returned |
|
851 :param safe: |
|
852 if True, an empty rset/list of entities will be returned in case of |
|
853 :exc:`Unauthorized`, else (the default), the exception is propagated |
845 """ |
854 """ |
846 rtype = str(rtype) |
855 rtype = str(rtype) |
847 try: |
856 try: |
848 return self._cw_relation_cache(rtype, role, entities, limit) |
857 return self._cw_relation_cache(rtype, role, entities, limit) |
849 except KeyError: |
858 except KeyError: |
851 if not self.has_eid(): |
860 if not self.has_eid(): |
852 if entities: |
861 if entities: |
853 return [] |
862 return [] |
854 return self._cw.empty_rset() |
863 return self._cw.empty_rset() |
855 rql = self.cw_related_rql(rtype, role) |
864 rql = self.cw_related_rql(rtype, role) |
856 rset = self._cw.execute(rql, {'x': self.eid}) |
865 try: |
|
866 rset = self._cw.execute(rql, {'x': self.eid}) |
|
867 except Unauthorized: |
|
868 if not safe: |
|
869 raise |
|
870 rset = self._cw.empty_rset() |
857 self.cw_set_relation_cache(rtype, role, rset) |
871 self.cw_set_relation_cache(rtype, role, rset) |
858 return self.related(rtype, role, limit, entities) |
872 return self.related(rtype, role, limit, entities) |
859 |
873 |
860 def cw_related_rql(self, rtype, role='subject', targettypes=None): |
874 def cw_related_rql(self, rtype, role='subject', targettypes=None): |
861 vreg = self._cw.vreg |
875 vreg = self._cw.vreg |