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') |