71 lines
2.0 KiB
Python
71 lines
2.0 KiB
Python
from pprint import pprint
|
|
|
|
def maketree(descendants):
|
|
lookup = dict((descendant.id, descendant) for descendant in descendants)
|
|
replies = {}
|
|
roots = set()
|
|
def getreps(id):
|
|
if id in replies:
|
|
reps = replies[id]
|
|
else:
|
|
reps = set()
|
|
replies[id] = reps
|
|
return reps
|
|
for descendant in descendants:
|
|
if not descendant.in_reply_to_id:
|
|
roots.add(descendant.id)
|
|
print("ROOT", descendant.id, descendant.account.id, descendant.account.acct)
|
|
else:
|
|
reps = getreps(descendant.in_reply_to_id)
|
|
reps.add(descendant.id)
|
|
reps = getreps(descendant.in_reply_to_account_id)
|
|
reps.add(descendant.id)
|
|
print("REPLY", descendant.id,
|
|
descendant.in_reply_to_id,
|
|
descendant.in_reply_to_account_id)
|
|
seen = set()
|
|
def onelevel(reps):
|
|
for rep in sorted(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 sorted(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 build(descendants):
|
|
derp = tuple(maketree(descendants))
|
|
pprint(("derp?", derp))
|
|
yield IN
|
|
yield from unmaketree(derp)
|
|
yield OUT
|