From 77c7de21c5ac7b2e345d1fe6d948fb98d1fb26d5 Mon Sep 17 00:00:00 2001 From: Ivan Dyedov Date: Thu, 28 Mar 2013 18:25:11 -0400 Subject: [PATCH] add support for child posts --- pelicanext/disqus_static/README.rst | 24 +++++------ pelicanext/disqus_static/disqus_static.py | 51 +++++++++++++++++++---- 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/pelicanext/disqus_static/README.rst b/pelicanext/disqus_static/README.rst index 9bcc84f..4e96548 100644 --- a/pelicanext/disqus_static/README.rst +++ b/pelicanext/disqus_static/README.rst @@ -28,11 +28,11 @@ Usage {% if article.disqus_comments %}
-

{{ article.disqus_comments|length }} comments

+

{{ article.disqus_comment_count }} comments

{% endif %} - -TODO ------ - - - handle replies to comments properly and maintain parent-child relationships diff --git a/pelicanext/disqus_static/disqus_static.py b/pelicanext/disqus_static/disqus_static.py index c775474..3cb4473 100644 --- a/pelicanext/disqus_static/disqus_static.py +++ b/pelicanext/disqus_static/disqus_static.py @@ -20,24 +20,59 @@ def initialized(pelican): def disqus_static(generator): disqus = DisqusAPI(generator.settings['DISQUS_SECRET_KEY'], generator.settings['DISQUS_PUBLIC_KEY']) + # first retrieve the threads threads = Paginator(disqus.threads.list, forum=generator.settings['DISQUS_SITENAME']) - thread_dict = {} # disqus thread id => title + # build a {thread_id: title} dict + thread_dict = {} for thread in threads: thread_dict[thread['id']] = thread['title'] - posts = Paginator(disqus.posts.list, forum=generator.settings['DISQUS_SITENAME']) - post_dict = {} # title => [post1, post2, ...] + # now retrieve the posts + posts = Paginator(disqus.posts.list, + forum=generator.settings['DISQUS_SITENAME']) + + # build a {post_id: [child_post1, child_post2, ...]} dict + child_dict = {} for post in posts: - if post['thread'] not in thread_dict.keys(): - continue - if thread_dict[post['thread']] not in post_dict.keys(): - post_dict[thread_dict[post['thread']]] = [] - post_dict[thread_dict[post['thread']]].append(post) + if post['id'] not in child_dict.keys(): + child_dict[post['id']] = [] + if post['parent'] is not None: + if str(post['parent']) not in child_dict.keys(): + child_dict[str(post['parent'])] = [] + child_dict[str(post['parent'])].append(post) + + # build a {title: [post1, post2, ...]} dict + post_dict = {} + for post in posts: + build_post_dict(post_dict, child_dict, thread_dict, post) for article in generator.articles: if article.title in post_dict: article.disqus_comments = post_dict[article.title] + article.disqus_comment_count = sum([ + postcounter(post) for post in post_dict[article.title]]) + +def postcounter(node): + return 1 + sum([postcounter(n) for n in node['children']]) + +def build_post_dict(post_dict, child_dict, thread_dict, post): + if post['thread'] not in thread_dict.keys(): + return # invalid thread, should never happen + + build_child_dict(child_dict, post) + + if post['parent'] is not None: + return # this is a child post, don't want to display it here + + if thread_dict[post['thread']] not in post_dict.keys(): + post_dict[thread_dict[post['thread']]] = [] + post_dict[thread_dict[post['thread']]].append(post) + +def build_child_dict(child_dict, post): + post['children'] = child_dict[post['id']] + for child in child_dict[post['id']]: + build_child_dict(child_dict, child) def register(): signals.initialized.connect(initialized)