# -*- 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 = """
{% 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 = """
{{ name }}
{% if user.name %}
Created by {{ user.name }}.
{% else %}
Created by {{ user.username }}.
{% endif %}
Topic Messages
{% for message in messages %}
{% 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 = """
{% for user in users %}
{% if user.name %}
{{ user.name }}
{% else %}
{{ user.username }}
{% endif %}
{% endfor%}
{% if next %}
{% 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 = """
{% for group in groups %}
{{ group.members | count }} Members
{{ group.description }}
{% endfor%}
{% if next %}
{% 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))