Mercurial > p > roundup > code
diff roundup/hyperdb.py @ 6179:a701c9c81597
Fix rev_multilink properties search/retrieval
The code now only returns live (non-retired) items. Since for reverse
multilinks the Link/Multilink property in the retired item cannot be
changed, we now only return non-retired items in search (filter) and
retrieve (get).
| author | Ralf Schlatterbeck <rsc@runtux.com> |
|---|---|
| date | Tue, 19 May 2020 09:25:48 +0200 |
| parents | 8497bf3f23a1 |
| children | bb198596f85c |
line wrap: on
line diff
--- a/roundup/hyperdb.py Tue May 19 01:14:48 2020 -0400 +++ b/roundup/hyperdb.py Tue May 19 09:25:48 2020 +0200 @@ -489,6 +489,8 @@ self.propclass = None self.orderby = [] self.sql_idx = None # index of retrieved column in sql result + self.need_retired = False + self.need_child_retired = False if parent: self.root = parent.root self.depth = parent.depth + 1 @@ -526,6 +528,11 @@ child = self.__class__(self.db, cls, name, props, parent=self) child.need_for = {need_for: True} child.propclass = propclass + if isinstance(propclass, Multilink) and self.props[name].computed: + if isinstance(self.props[name].rev_property, Link): + child.need_retired = True + else: + child.need_child_retired = True self.children.append(child) self.propdict[name] = child if retr and isinstance(child.propclass, Link): @@ -594,9 +601,11 @@ s2.add(node [pn]) items = s1.difference(s2) elif isinstance(p.propclass.rev_property, Link): - items = set(cl.get(x, pn) for x in p.val) + items = set(cl.get(x, pn) for x in p.val + if not cl.is_retired(x)) else: - items = set().union(*(cl.get(x, pn) for x in p.val)) + items = set().union(*(cl.get(x, pn) for x in p.val + if not cl.is_retired(x))) filterspec[p.name] = list(sorted(items)) elif isinstance(p.val, type([])): exact = []
