web-app-demos/apps/calendar/app.py
2025-03-20 03:10:43 -06:00

115 lines
No EOL
5.4 KiB
Python

from aiohttp import web
import aiohttp_security
import datetime
import security
def logevent(request, query):
real_ip = request.headers.get('X-Real-IP', 'unknown')
print(f"IP: {real_ip} - Request: {query}")
def datetime_format(postdata):
formatted = {}
for s in ("timefrom", "timeto"):
formatted[s] = datetime.datetime.strptime(postdata[s], '%H:%M').strftime('%H:%M:%S')
return formatted
def init_app(app):
routes = web.RouteTableDef()
@routes.get('')
async def bare_redirect(request):
raise web.HTTPFound(app['prefix'])
@routes.get('/')
async def home(request):
await aiohttp_security.check_permission(request, 'user')
response = request.app['templates']["index.html"].safe_substitute({'disabled': '', 'user': 'user'})
return web.Response(text=response, content_type="text/html")
@routes.get('/admin')
async def admin(request):
await aiohttp_security.check_permission(request, 'admin')
response = request.app['templates']["index.html"].safe_substitute({'disabled': 'disabled', 'user': 'admin'})
return web.Response(text=response, content_type="text/html")
@routes.get('/events/day/{day}')
async def get_events_daily(request):
await aiohttp_security.check_permission(request, 'user')
querystring = "SELECT * FROM events WHERE deleted=false AND %s BETWEEN datefrom AND dateto;"
if request.match_info['day']:
response = await request.config_dict["query"](querystring, (request.match_info['day'],))
else:
response = await request.config_dict["query"](querystring.replace("%s", "CURDATE()"))
formatted = [[(str(v) if isinstance(v, datetime.date) or isinstance(v, datetime.timedelta) else v) for v in row] for row in response]
return web.json_response(formatted)
@routes.get('/events/month/{month}')
async def get_events_monthly(request):
await aiohttp_security.check_permission(request, 'user')
querystring = "SELECT * FROM events WHERE deleted=false AND %s BETWEEN DATE_FORMAT(datefrom, '%%Y-%%m') AND DATE_FORMAT(dateto, '%%Y-%%m');"
if request.match_info['month']:
response = await request.config_dict["query"](querystring, (request.match_info['month'],))
else:
response = await request.config_dict["query"](querystring.replace("%s", "DATE_FORMAT(CURDATE(), '%%Y-%%m')"))
formatted = [[(str(v) if isinstance(v, datetime.date) or isinstance(v, datetime.timedelta) else v) for v in row] for row in response]
return web.json_response(formatted)
@routes.get('/admin/day/{day}')
async def get_events_daily(request):
await aiohttp_security.check_permission(request, 'admin')
querystring = "SELECT * FROM events WHERE %s BETWEEN datefrom AND dateto;"
if request.match_info['day']:
response = await request.config_dict["query"](querystring, (request.match_info['day'],))
else:
response = await request.config_dict["query"](querystring.replace("%s", "CURDATE()"))
formatted = [[(str(v) if isinstance(v, datetime.date) or isinstance(v, datetime.timedelta) else v) for v in row] for row in response]
return web.json_response(formatted)
@routes.get('/admin/month/{month}')
async def get_events_monthly(request):
await aiohttp_security.check_permission(request, 'admin')
querystring = "SELECT * FROM events WHERE %s BETWEEN DATE_FORMAT(datefrom, '%%Y-%%m') AND DATE_FORMAT(dateto, '%%Y-%%m');"
if request.match_info['month']:
response = await request.config_dict["query"](querystring, (request.match_info['month'],))
else:
response = await request.config_dict["query"](querystring.replace("%s", "DATE_FORMAT(CURDATE(), '%%Y-%%m')"))
formatted = [[(str(v) if isinstance(v, datetime.date) or isinstance(v, datetime.timedelta) else v) for v in row] for row in response]
return web.json_response(formatted)
@routes.post('/event/add')
async def event_add(request):
await aiohttp_security.check_permission(request, 'user')
postdata = await request.post()
formatted = datetime_format(postdata)
querystring = "INSERT INTO events(name, message, timefrom, timeto, timetbd, datefrom, dateto, datetbd) VALUES(%s,%s,%s,%s,%s,%s,%s,%s);"
params = (postdata["name"], postdata["message"], formatted["timefrom"], formatted["timeto"], "timetbd" in postdata, postdata["datefrom"], postdata["dateto"], "datetbd" in postdata)
response = await request.config_dict["query"](querystring, params)
# await update(request)
#logevent(request, query)
raise web.HTTPFound(app['prefix'])
@routes.post('/event/{id}/edit')
async def event_edit(request):
await aiohttp_security.check_permission(request, 'user')
postdata = await request.post()
formatted = datetime_format(postdata)
querystring = "UPDATE events SET name=%s, message=%s, timefrom=%s, timeto=%s, timetbd=%s, datefrom=%s, dateto=%s, datetbd=%s WHERE id=%s;"
params = (postdata["name"], postdata["message"], formatted["timefrom"], formatted["timeto"], "timetbd" in postdata,
postdata["datefrom"], postdata["dateto"], "datetbd" in postdata, request.match_info['id'])
response = await request.config_dict["query"](querystring, params)
# await update(request)
#logevent(request, query)
raise web.HTTPFound(app['prefix'])
@routes.post('/event/{id}/delete')
async def event_delete(request):
await aiohttp_security.check_permission(request, 'user')
postdata = await request.post()
querystring = "UPDATE events SET deleted=true WHERE id=%s;"
response = await request.config_dict["query"](querystring, (request.match_info['id'],))
# await update(request)
#logevent(request, query)
raise web.HTTPFound(app['prefix'])
app.add_routes(routes)