645 value = self[name] |
645 value = self[name] |
646 except KeyError: |
646 except KeyError: |
647 if not self.is_saved(): |
647 if not self.is_saved(): |
648 return None |
648 return None |
649 rql = "Any A WHERE X eid %%(x)s, X %s A" % name |
649 rql = "Any A WHERE X eid %%(x)s, X %s A" % name |
650 # XXX should we really use unsafe_execute here?? |
650 # XXX should we really use unsafe_execute here? I think so (syt), |
|
651 # see #344874 |
651 execute = getattr(self.req, 'unsafe_execute', self.req.execute) |
652 execute = getattr(self.req, 'unsafe_execute', self.req.execute) |
652 try: |
653 try: |
653 rset = execute(rql, {'x': self.eid}, 'x') |
654 rset = execute(rql, {'x': self.eid}, 'x') |
654 except Unauthorized: |
655 except Unauthorized: |
655 self[name] = value = None |
656 self[name] = value = None |
679 return self.related_cache(rtype, role, entities, limit) |
680 return self.related_cache(rtype, role, entities, limit) |
680 except KeyError: |
681 except KeyError: |
681 pass |
682 pass |
682 assert self.has_eid() |
683 assert self.has_eid() |
683 rql = self.related_rql(rtype, role) |
684 rql = self.related_rql(rtype, role) |
684 rset = self.req.execute(rql, {'x': self.eid}, 'x') |
685 # XXX should we really use unsafe_execute here? I think so (syt), |
|
686 # see #344874 |
|
687 execute = getattr(self.req, 'unsafe_execute', self.req.execute) |
|
688 rset = execute(rql, {'x': self.eid}, 'x') |
685 self.set_related_cache(rtype, role, rset) |
689 self.set_related_cache(rtype, role, rset) |
686 return self.related(rtype, role, limit, entities) |
690 return self.related(rtype, role, limit, entities) |
687 |
691 |
688 def related_rql(self, rtype, role='subject'): |
692 def related_rql(self, rtype, role='subject'): |
689 rschema = self.schema[rtype] |
693 rschema = self.schema[rtype] |
785 # relations cache handling ################################################ |
789 # relations cache handling ################################################ |
786 |
790 |
787 def relation_cached(self, rtype, role): |
791 def relation_cached(self, rtype, role): |
788 """return true if the given relation is already cached on the instance |
792 """return true if the given relation is already cached on the instance |
789 """ |
793 """ |
790 return '%s_%s' % (rtype, role) in self._related_cache |
794 return self._related_cache.get('%s_%s' % (rtype, role)) |
791 |
795 |
792 def related_cache(self, rtype, role, entities=True, limit=None): |
796 def related_cache(self, rtype, role, entities=True, limit=None): |
793 """return values for the given relation if it's cached on the instance, |
797 """return values for the given relation if it's cached on the instance, |
794 else raise `KeyError` |
798 else raise `KeyError` |
795 """ |
799 """ |