# -*- coding: utf-8 -*- import os import json from jinja2 import Template from codecs import open from datetime import datetime # groups/{group-slug}/topics.json,{topic-slug}/messages.json def mkdir_p(filename): try: os.makedirs(os.path.dirname(filename)) except OSError: pass def get_users(): with open('users.json') as f: users = json.loads(f.read())['users'] users = sorted(users, key=lambda k: k['date_joined']) for i, message in enumerate(users): users[i]['date_joined'] = datetime.fromtimestamp(message['date_joined']).strftime('%c') return users def get_groups(users): with open('groups.json') as f: groups = json.loads(f.read()) groups = sorted(groups, key=lambda k: k['date_created']) for i, group in enumerate(groups): groups[i]['members'] = sorted(groups[i]['members'], key=lambda k: k['date_created']) groups[i]['user'] = users[group['creator_id']] return groups def get_topics(group, users): with open('groups/{}/topics.json'.format(group)) as f: topics = json.loads(f.read()) topics = sorted(topics, key=lambda k: k['date_created']) for i, topic in enumerate(topics): topics[i]['user'] = users[topic['creator_id']] return topics def get_messages(group, topic, users): with open('groups/{}/{}/messages.json'.format(group, topic)) as f: messages = json.loads(f.read()) messages = sorted(messages, key=lambda k: k['date_created']) for i, message in enumerate(messages): messages[i]['date_created'] = datetime.fromtimestamp(message['date_created']).strftime('%b %d %Y %H:%M') messages[i]['user'] = users[message['user_id']] return messages GROUP_TEMPLATE = """

Convore / Groups / {{ name }}

{% if user.name %} Created by {{ user.name }}. {% else %} Created by {{ user.username }}. {% endif %}

Group Topics

""" def render_group(group, topics): filename = 'html/groups/{}.html'.format(group['slug']) mkdir_p(filename) template = Template(GROUP_TEMPLATE) html = template.render(topics=topics, **group) with open(filename, 'w', 'utf-8') as f: f.write(html) TOPIC_TEMPLATE = """

Convore / Groups / {{ group.name }}:

{{ name }}

{% if user.name %}

Created by {{ user.name }}.

{% else %}

Created by {{ user.username }}.

{% endif %}

Topic Messages

{% for message in messages %}

{{ message.user.username }} at {{ message.date_created }}

{% if message.stars %} {{ "★" * message.stars|length }} {% endif %}

{{ message.message }}

 

{% endfor%} """ def render_topic(group, topic, messages): filename = 'html/groups/{}/{}.html'.format(group['slug'], topic['slug']) mkdir_p(filename) template = Template(TOPIC_TEMPLATE) html = template.render(group=group, messages=messages, **topic) with open(filename, 'w', 'utf-8') as f: f.write(html) USER_TEMPLATE = """

Convore / Users / {{ user.username }}

{{ user.name }}

{{ user.bio }}

{% if user.pic %} {% endif %}

Location {{ user.location }}
Web URL {{ user.web }}
Date Joined {{ user.date_joined }}
""" def render_user(user): filename = 'html/users/{}.html'.format(user['username']) mkdir_p(filename) if user['pic']: user['pic'] = user['pic'].replace('/', '-') template = Template(USER_TEMPLATE) html = template.render(user=user) with open(filename, 'w', 'utf-8') as f: f.write(html) USERS_TEMPLATE = """

Convore / Users

{% for user in users %} {% if user.name %} {{ user.name }} {% else %} {{ user.username }} {% endif %} {% endfor%} {% if next %}

Next Page

{% endif %} """ def render_users(users, pagination=8000): i = 0 page = 0 while i < len(users): if page == 0: filename = 'html/users.html' else: filename = 'html/users-{}.html'.format(page) mkdir_p(filename) _users = users[pagination*page:pagination*page+pagination] i += len(_users) if len(_users) < pagination: next = False else: next = page + 1 template = Template(USERS_TEMPLATE) html = template.render(users=_users, next=next) with open(filename, 'w', 'utf-8') as f: f.write(html) page += 1 GROUPS_TEMPLATE = """

Convore / Groups

{% for group in groups %}

{{ group.name }}

{{ group.members | count }} Members

{{ group.description }}

{% endfor%} {% if next %}

Next Page

{% endif %} """ def render_groups(groups): filename = 'html/groups.html' mkdir_p(filename) template = Template(GROUPS_TEMPLATE) html = template.render(groups=groups) with open(filename, 'w', 'utf-8') as f: f.write(html) message_count = 0 topic_count = 0 users = get_users() user_lookup = {} print 'Rendering user profiles...' for user in users: user_lookup[user['id']] = user # render_user(user) print 'Rendering user index...' render_users(users) groups = get_groups(users=user_lookup) print 'Rendering groups...' # render_groups(groups) for group in groups: topics = get_topics(group['slug'], users=user_lookup) topic_count += len(topics) # render_group(group, topics) for topic in topics: messages = get_messages(group['slug'], topic['slug'], users=user_lookup) # render_topic(group, topic, messages) message_count += len(messages) print '{}: {} ({})'.format(group['slug'], topic['slug'], len(messages)) print 'messages: {}'.format(message_count) print 'topics: {}'.format(topic_count) print 'groups: {}'.format(len(groups)) print 'users: {}'.format(len(users))