entity.py
branchstable
changeset 3955 235a9fda6058
parent 3919 f91bd15f427c
child 3961 d1cbf77db999
equal deleted inserted replaced
3954:56a8b14d68aa 3955:235a9fda6058
   889         else:
   889         else:
   890             self.req.execute('SET %s WHERE X eid %%(x)s' % ','.join(relations),
   890             self.req.execute('SET %s WHERE X eid %%(x)s' % ','.join(relations),
   891                              kwargs, 'x')
   891                              kwargs, 'x')
   892 
   892 
   893     def set_relations(self, _cw_unsafe=False, **kwargs):
   893     def set_relations(self, _cw_unsafe=False, **kwargs):
       
   894         """add relations to the given object. To set a relation where this entity
       
   895         is the object of the relation, use 'reverse_'<relation> as argument name.
       
   896 
       
   897         Values may be an entity, a list of entity, or None (meaning that all
       
   898         relations of the given type from or to this object should be deleted).
       
   899         """
   894         if _cw_unsafe:
   900         if _cw_unsafe:
   895             execute = self.req.unsafe_execute
   901             execute = self.req.unsafe_execute
   896         else:
   902         else:
   897             execute = self.req.execute
   903             execute = self.req.execute
       
   904         # XXX update cache
   898         for attr, values in kwargs.iteritems():
   905         for attr, values in kwargs.iteritems():
   899             if attr.startswith('reverse_'):
   906             if attr.startswith('reverse_'):
   900                 restr = 'Y %s X' % attr[len('reverse_'):]
   907                 restr = 'Y %s X' % attr[len('reverse_'):]
   901             else:
   908             else:
   902                 restr = 'X %s Y' % attr
   909                 restr = 'X %s Y' % attr
       
   910             if values is None:
       
   911                 execute('DELETE %s WHERE X eid %%(x)s' % restr,
       
   912                         {'x': self.eid}, 'x')
       
   913                 continue
   903             if not isinstance(values, (tuple, list, set, frozenset)):
   914             if not isinstance(values, (tuple, list, set, frozenset)):
   904                 values = (values,)
   915                 values = (values,)
   905             execute('SET %s WHERE X eid %%(x)s, Y eid IN (%s)' % (
   916             execute('SET %s WHERE X eid %%(x)s, Y eid IN (%s)' % (
   906                 restr, ','.join(str(r.eid) for r in values)),
   917                 restr, ','.join(str(r.eid) for r in values)),
   907                     {'x': self.eid}, 'x')
   918                     {'x': self.eid}, 'x')