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 = []

Roundup Issue Tracker: http://roundup-tracker.org/