__init__.py
branchstable
changeset 3670 b7ec030a5e10
parent 3669 4eb33ee29c84
child 3674 387d51af966d
child 3684 c0a854810942
equal deleted inserted replaced
3669:4eb33ee29c84 3670:b7ec030a5e10
   134         """
   134         """
   135         rql = 'INSERT %s X' % etype
   135         rql = 'INSERT %s X' % etype
   136         relations = []
   136         relations = []
   137         restrictions = set()
   137         restrictions = set()
   138         cachekey = []
   138         cachekey = []
       
   139         pending_relations = []
   139         for attr, value in kwargs.iteritems():
   140         for attr, value in kwargs.iteritems():
       
   141             if isinstance(value, (tuple, list, set, frozenset)):
       
   142                 if len(value) == 1:
       
   143                     value = iter(value).next()
       
   144                 else:
       
   145                     pending_relations.append( (attr, value) )
       
   146                     continue
   140             if hasattr(value, 'eid'): # non final relation
   147             if hasattr(value, 'eid'): # non final relation
   141                 rvar = attr.upper()
   148                 rvar = attr.upper()
   142                 # XXX safer detection of object relation
   149                 # XXX safer detection of object relation
   143                 if attr.startswith('reverse_'):
   150                 if attr.startswith('reverse_'):
   144                     relations.append('%s %s X' % (rvar, attr[len('reverse_'):]))
   151                     relations.append('%s %s X' % (rvar, attr[len('reverse_'):]))
   153                 relations.append('X %s %%(%s)s' % (attr, attr))
   160                 relations.append('X %s %%(%s)s' % (attr, attr))
   154         if relations:
   161         if relations:
   155             rql = '%s: %s' % (rql, ', '.join(relations))
   162             rql = '%s: %s' % (rql, ', '.join(relations))
   156         if restrictions:
   163         if restrictions:
   157             rql = '%s WHERE %s' % (rql, ', '.join(restrictions))
   164             rql = '%s WHERE %s' % (rql, ', '.join(restrictions))
   158         return self.execute(rql, kwargs, cachekey).get_entity(0, 0)
   165         created = self.execute(rql, kwargs, cachekey).get_entity(0, 0)
       
   166         for attr, values in pending_relations:
       
   167             if attr.startswith('reverse_'):
       
   168                 restr = 'Y %s X' % attr[len('reverse_'):]
       
   169             else:
       
   170                 restr = 'X %s Y' % attr
       
   171             self.execute('SET %s WHERE X eid %%(x)s, Y eid IN (%s)' % (
       
   172                 restr, ','.join(str(r.eid) for r in values)),
       
   173                          {'x': created.eid}, 'x')
       
   174         return created
   159 
   175 
   160     # url generation methods ##################################################
   176     # url generation methods ##################################################
   161 
   177 
   162     def build_url(self, *args, **kwargs):
   178     def build_url(self, *args, **kwargs):
   163         """return an absolute URL using params dictionary key/values as URL
   179         """return an absolute URL using params dictionary key/values as URL