[#4359] move ArtifactReference bulk fetch into shared Thread widget
diff --git a/Allura/allura/controllers/discuss.py b/Allura/allura/controllers/discuss.py
index 07afb1e..ddaf61b 100644
--- a/Allura/allura/controllers/discuss.py
+++ b/Allura/allura/controllers/discuss.py
@@ -208,12 +208,6 @@ def index(self, limit=None, page=0, count=0, **kw):
M.session.artifact_orm_session._get().skip_last_updated = True
count = self.thread.query_posts(page=page, limit=int(limit)).count()
- # bulk fetch backrefs to save on many queries within EW
- index_ids = [a.index_id() for a in self.thread.discussion.posts]
- q = ArtifactReference.query.find(dict(references={'$in': index_ids})).all()
- for a in self.thread.discussion.posts:
- a._backrefs = [aref._id for aref in q if a.index_id() in (aref.references or [])]
-
return dict(discussion=self.thread.discussion,
thread=self.thread,
page=int(page),
diff --git a/Allura/allura/lib/widgets/discuss.py b/Allura/allura/lib/widgets/discuss.py
index 3bbdd88..101f83a 100644
--- a/Allura/allura/lib/widgets/discuss.py
+++ b/Allura/allura/lib/widgets/discuss.py
@@ -346,6 +346,16 @@ class Thread(HierWidget):
post=Post(),
edit_post=EditPost(submit_text='Submit'))
+ def prepare_context(self, context):
+ context = super().prepare_context(context)
+ # bulk fetch backrefs to save on many queries within EW
+ thread: M.Thread = context['value']
+ index_ids = [a.index_id() for a in thread.discussion.posts]
+ q = M.ArtifactReference.query.find(dict(references={'$in': index_ids})).all()
+ for a in thread.discussion.posts:
+ a._backrefs = [aref._id for aref in q if a.index_id() in (aref.references or [])]
+ return context
+
def resources(self):
yield from super().resources()
for w in self.widgets.values():