89 lines
2.3 KiB
Python
89 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
A display interface for archived 4chan quest threads.
|
|
"""
|
|
from aiohttp import web
|
|
import jinja2
|
|
import aiohttp_jinja2
|
|
from aiohttp_jinja2 import render_template
|
|
import asyncpg
|
|
import uvloop
|
|
|
|
import config
|
|
import filters
|
|
|
|
uvloop.install()
|
|
routes = web.RouteTableDef()
|
|
|
|
@routes.get('/', name='index')
|
|
async def index(request):
|
|
"""The index page."""
|
|
async with request.app['pool'].acquire() as conn:
|
|
threads = await conn.fetch("SELECT * FROM thread ORDER BY time ASC")
|
|
return render_template("index.html", request, locals())
|
|
|
|
|
|
@routes.get(r'/{thread_id:\d+}', name='thread')
|
|
async def thread(request):
|
|
"""A single thread page."""
|
|
async with request.app['pool'].acquire() as conn:
|
|
data = await conn.fetch(
|
|
"SELECT post.id, post.name, post.trip_code, post.subject, "
|
|
"post.time, post.body, "
|
|
"tag.name AS tag_name, link.link_to, link.link_from "
|
|
"FROM post "
|
|
"LEFT JOIN tag ON (post.id = tag.post_id) "
|
|
"LEFT JOIN link ON (post.id = link.link_from) "
|
|
"WHERE post.thread_id = $1 "
|
|
"ORDER BY post.id ASC",
|
|
int(request.match_info['thread_id']))
|
|
posts = {}
|
|
backlinks = {}
|
|
for row in data:
|
|
post = posts.get(row['id'], {})
|
|
for key, value in row.items():
|
|
if key == 'tag_name':
|
|
tags = post.get('tags', [])
|
|
tags.append(value)
|
|
post['tags'] = tags
|
|
elif key == 'link_to':
|
|
link_tos = post.get('link_tos', [])
|
|
link_tos.append(value)
|
|
post['link_tos'] = link_tos
|
|
elif key == 'link_from':
|
|
back_post = backlinks.get(row['link_to'], [])
|
|
back_post.append(value)
|
|
backlinks[row['link_to']] = back_post
|
|
post[key] = value
|
|
post['tags'] = [t for t in post['tags'] if t]
|
|
posts[row['id']] = post
|
|
|
|
return render_template("thread.html", request, locals())
|
|
|
|
|
|
async def init_app():
|
|
"""Initializes the application."""
|
|
app = web.Application()
|
|
aiohttp_jinja2.setup(
|
|
app,
|
|
trim_blocks=True,
|
|
lstrip_blocks=True,
|
|
undefined=jinja2.StrictUndefined,
|
|
loader=jinja2.FileSystemLoader('templates'),
|
|
filters={
|
|
'quotelink': filters.quotelink,
|
|
},
|
|
)
|
|
app['pool'] = await asyncpg.create_pool(**config.db)
|
|
|
|
app.router.add_routes(routes)
|
|
|
|
app_wrap = web.Application()
|
|
app_wrap.add_subapp(config.url_prefix, app)
|
|
return app_wrap
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app = init_app()
|
|
web.run_app(app, host='0.0.0.0', port=5450)
|