Viewing threads as a tree, not flattened
I couldn't tell who was replying to whom, so I thought I'd give a shot at implementing a tree of threads, instead of a flattened list, with only the root distinguishable from the rest.
This commit is contained in:
parent
9415defede
commit
7b86cf726d
|
@ -0,0 +1,54 @@
|
||||||
|
def maketree(descendants):
|
||||||
|
lookup = {(descendant.id, descendant) for descendant in descendants}
|
||||||
|
replies = {}
|
||||||
|
roots = set()
|
||||||
|
for descendant in descendants:
|
||||||
|
if not descendant.in_reply_to_id:
|
||||||
|
roots.add(descendant.id)
|
||||||
|
if descendant.in_reply_to_id in replies:
|
||||||
|
reps = replies[descendant.in_reply_to_id]
|
||||||
|
reps.add(descendant.id)
|
||||||
|
else:
|
||||||
|
reps = set()
|
||||||
|
replies[descendant.in_reply_to_id] = set([descendant.id])
|
||||||
|
seen = set()
|
||||||
|
def onelevel(reps):
|
||||||
|
for rep in reps:
|
||||||
|
if rep in seen: continue
|
||||||
|
seen.add(rep)
|
||||||
|
subreps = replies.get(rep)
|
||||||
|
if subreps:
|
||||||
|
yield lookup[rep], onelevel(subreps)
|
||||||
|
else:
|
||||||
|
yield lookup[rep], ()
|
||||||
|
for root in roots:
|
||||||
|
seen.add(root)
|
||||||
|
reps = replies.get(root)
|
||||||
|
if reps:
|
||||||
|
yield lookup[root], onelevel(reps)
|
||||||
|
else:
|
||||||
|
yield lookup[root], ()
|
||||||
|
# returns (status, gen[(status, gen[(status, ...), (status, ())]), ...])
|
||||||
|
|
||||||
|
# django can't do recursion well so we'll turn the tree
|
||||||
|
# ((A, (B, C)))
|
||||||
|
# into
|
||||||
|
# (in, in, A, in, B, C, out, out, out)
|
||||||
|
class OPERATION: pass
|
||||||
|
IN = OPERATION()
|
||||||
|
OUT = OPERATION()
|
||||||
|
class POST(OPERATION):
|
||||||
|
post = None
|
||||||
|
def __init__(self, post):
|
||||||
|
self.post = post
|
||||||
|
|
||||||
|
def unmaketree(tree):
|
||||||
|
for post, children in tree:
|
||||||
|
yield POST(post)
|
||||||
|
if children:
|
||||||
|
yield IN
|
||||||
|
yield from unmaketree(children)
|
||||||
|
yield OUT
|
||||||
|
|
||||||
|
def threadtree(descendants):
|
||||||
|
return unmaketree(maketree(descendants))
|
|
@ -687,6 +687,10 @@ def thread(request, id):
|
||||||
notifications = _notes_count(account, mastodon)
|
notifications = _notes_count(account, mastodon)
|
||||||
filters = get_filters(mastodon, context="thread")
|
filters = get_filters(mastodon, context="thread")
|
||||||
|
|
||||||
|
import pprint
|
||||||
|
pprint.pprint(context)
|
||||||
|
raise SystemExit(23)
|
||||||
|
|
||||||
# Apply filters
|
# Apply filters
|
||||||
descendants = [
|
descendants = [
|
||||||
x for x in context.descendants if not toot_matches_filters(x, filters)
|
x for x in context.descendants if not toot_matches_filters(x, filters)
|
||||||
|
@ -699,7 +703,7 @@ def thread(request, id):
|
||||||
"context": context,
|
"context": context,
|
||||||
"toot": toot,
|
"toot": toot,
|
||||||
"root": root,
|
"root": root,
|
||||||
"descendants": descendants,
|
"descendants": unmaketree(maketree(descendants)),
|
||||||
"own_acct": request.session["active_user"],
|
"own_acct": request.session["active_user"],
|
||||||
"notifications": notifications,
|
"notifications": notifications,
|
||||||
"preferences": account.preferences,
|
"preferences": account.preferences,
|
||||||
|
|
Loading…
Reference in New Issue