164 lines
5.7 KiB
Python
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 |