thewall/thewall/views.py
2026-02-07 16:34:22 +01:00

164 lines
5.7 KiB
Python

import os
import datetime
import pathlib
import tempfile
import shutil
from PIL import Image, ImageOps
import aiohttp_jinja2 as ahj2
import aiohttp_session as ahse
import db
from helpers import get_pwd_hash
@ahj2.template('wall.html')
async def wall(request):
#TODO: render wall
async with request.app['db'].acquire() as conn:
...
conn.close()
return
@ahj2.template('entry.html')
async def entry(request):
async with request.app['db'].acquire() as conn:
cursor = await conn.execute(db.entry.select().where(db.entry.id == request.match_info['id']))
records = await cursor.fetchall()
# sa_session = ahsa.get_session(request)
# async with sa_session.begin():
# stmt = sa.select(entries).where(entries.id == request.match_info['id'])
# result = await sa_session.scalars(stmt)
return {'entry': records.all()[0]}
@ahj2.template('entry.html')
async def handle_edit(request):
#TODO
async with request.app['db'].acquire() as conn:
cursor = await conn.execute(db.entry.select().where(entry.id == request.match_info['id']))
records = await cursor.fetchall()
# sa_session = ahsa.get_session(request)
# async with sa_session.begin():
# stmt = sa.select(Entry).where(Entry.id == request.match_info['id'])
# result = await sa_session.scalars(stmt)
return {'entry': records.all()[0]}
@ahj2.template('submission.html')
async def submission_form(request):
#TODO: fill in username for Mods and Admins
return
@ahj2.template('submission.html')
async def handle_submission(request):
tf = tempfile.NamedTemporaryFile(mode='w+b', delete=False)
temp_file_name = tf.name
async for field in (await request.multipart()):
if field.name == 'image':
filename = field.filename
size = 0
while True:
chunk = await field.read_chunk() # 8192 bytes by default.
if not chunk:
break
size += len(chunk)
if size >= 2e7:
tf.close()
os.remove(temp_file_name)
return {'submission_successful': False, 'error_message': \
"Your file exceeds the maximum size of 20Mb."}
tf.write(chunk)
tf.close()
if field.name == 'type':
type = await field.read(decode=True)
if field.name == 'description':
desc = await field.read(decode=True)
if field.name == 'information':
info = await field.read(decode=True)
if field.name == 'place':
place = await field.read(decode=True)
if field.name == 'date':
date = await field.read(decode=True)
date = datetime.datetime.strptime(date.decode(), '%Y-%m-%d')
if date > datetime.datetime.now():
return {'submission_successful': False, 'error_message': \
"Due to the linear nature of time your submissions date of discovery is likely wrong."}
if field.name == 'name':
name = await field.read(decode=True)
#TODO: Tripcodes
#TODO
id = 0
async with request.app['db'].acquire() as conn:
await conn.execute(db.entry.insert({
'filename': filename,
'type': type.decode(),
'description': desc.decode(),
'information': info.decode(),
'place_found': place.decode(),
'time_found': date,
'time_uploaded': datetime.datetime.now(),
'uploaded_by': name.decode(),
'approved': False
}))
conn.close()
# sa_session = ahsa.get_session(request)
# async with sa_session.begin():
# entry = Entry(
# filename = filename,
# type = type.decode(),
# description = desc.decode(),
# information = info.decode(),
# place_found = place.decode(),
# time_found = date,
# time_uploaded = datetime.datetime.now(),
# uploaded_by = name.decode(),
# approved = False)
# sa_session.add(entry)
# await sa_session.commit()
# id = str(entry.id)
pathlib.Path(f"./images/{id}/thumbnail").mkdir(parents=True, exist_ok=True)
shutil.copy(temp_file_name, f"./images/{id}/{filename}")
os.remove(temp_file_name)
size = (200, 200)
with Image.open(f"./images/{id}/{filename}") as im:
ImageOps.contain(im, size).save(f"./images/{id}/thumbnail/{filename}")
return {'submission_successful': True}
@ahj2.template('login.html')
async def login_form(request):
return
@ahj2.template('login.html')
async def handle_login(request):
async for field in (await request.multipart()):
if field.name == 'username':
name = await field.read(decode=True)
if field.name == 'password':
pwd = await field.read(decode=True)
pwd_hash = get_pwd_hash(pwd)
#TODO
async with request.app['db'].acquire() as conn:
cursor = await conn.execute(db.user.select().where(db.user.name == name))
conn.close()
# sa_session = await ahsa.new_session(request)
# async with sa_session.begin():
# stmt = sa.select(User).where(User.name == name)
# result = await sa_session.scalars(stmt)
# # verify result
# if result.all()[0].pwd_hash == pwd_hash:
# se_session = ahse.new_session()
# # enter data into the cookie to reidentify the user
# location = request.app.router['index'].url_for()
# raise web.HTTPFound(location=location)
# else:
# return {'valid': False}
@ahj2.template('about.html')
async def about(request):
return