from sanic.response import html, redirect, text from sanic import Blueprint, exceptions, response from ext import * from urllib.parse import unquote from config import ADMINS import json bp = Blueprint("karaoke", url_prefix="/manage/karaoke") @bp.get("/admin") async def show_songs(request, order: Order): if order.code not in ADMINS: raise exceptions.Forbidden("Birichino") orders = [x for x in request.app.ctx.om.cache.values() if x.karaoke_songs] songs = [] for o in orders: if not o.karaoke_songs: continue for song, data in o.karaoke_songs.items(): songs.append({'song': song, 'order': o, **data}) tpl = request.app.ctx.tpl.get_template('karaoke_admin.html') return html(tpl.render(songs=songs)) @bp.post("/approve") async def approve_songs(request, order: Order): if order.code not in ADMINS: raise exceptions.Forbidden("Birichino") for song in request.form: o = await request.app.ctx.om.get_order(code=song[:5]) o.karaoke_songs[song[5:]]['approved'] = request.form[song][0] == 'yes' await order.edit_answer('karaoke_songs', json.dumps(o.karaoke_songs)) await order.send_answers() return response.redirect('/manage/karaoke/admin') @bp.get("/sing/") async def sing_song(request, order: Order, songname): if not order: raise exceptions.Forbidden("You have been logged out. Please access the link in your E-Mail to login again!") if order.code not in ADMINS: raise exceptions.Forbidden("Birichino") songname = unquote(songname) o = await request.app.ctx.om.get_order(code=songname[:5]) o.karaoke_songs[songname[5:]]['singed'] = True await order.edit_answer('karaoke_songs', json.dumps(o.karaoke_songs)) await order.send_answers() return redirect("/manage/karaoke/admin") @bp.post("/add") async def add_song(request, order: Order): if not order: raise exceptions.Forbidden("You have been logged out. Please access the link in your E-Mail to login again!") song = request.form.get('song') if not song: raise exceptions.BadRequest("This song is not valid!") karaoke_songs = order.karaoke_songs or {} if song not in karaoke_songs: karaoke_songs[song[:64]] = {'approved': None, 'ts': time(), 'contest': bool(request.form.get('wants_contest'))} await order.edit_answer('karaoke_songs', json.dumps(karaoke_songs)) await order.send_answers() return redirect("/manage/welcome#karaoke") @bp.get("/delete/") async def del_song(request, order: Order, songname): if not order: raise exceptions.Forbidden("You have been logged out. Please access the link in your E-Mail to login again!") karaoke_songs = order.karaoke_songs or {} songname = unquote(songname) if not songname in karaoke_songs: raise exceptions.BadRequest(f"The song you're trying to delete {songname} does not exist in your list of songs.") del karaoke_songs[songname] await order.edit_answer('karaoke_songs', json.dumps(karaoke_songs)) await order.send_answers() return redirect("/manage/welcome#karaoke")