entity.py
changeset 2647 b0a2e779845c
parent 2613 5e19c2bb370e
child 2650 18aec79ec3a3
equal deleted inserted replaced
2646:d2874ddd4347 2647:b0a2e779845c
   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         """