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 |