from flask import render_template, Blueprint, redirect, url_for, request, flash from flask_user import login_required from app.models import Account, PlayKey, db from datatables import ColumnDT, DataTables from app.forms import CreatePlayKeyForm, EditPlayKeyForm from app import gm_level, log_audit play_keys_blueprint = Blueprint('play_keys', __name__) # Key creation page @play_keys_blueprint.route('/', methods=['GET']) @login_required @gm_level(5) def index(): return render_template('play_keys/index.html.j2') @play_keys_blueprint.route('/create/<count>/<uses>', methods=['GET'], defaults={'count': 1, 'uses': 1}) @login_required @gm_level(5) def create(count=1, uses=1): key = PlayKey.create(count=count, uses=uses) log_audit(f"Created {count} Play Key(s) with {uses} uses!") flash(f"Created {count} Play Key(s) with {uses} uses! {key}", "success") return redirect(url_for('play_keys.index')) @play_keys_blueprint.route('/create/bulk', methods=('GET', 'POST')) @login_required @gm_level(5) def bulk_create(): form = CreatePlayKeyForm() if form.validate_on_submit(): PlayKey.create(count=form.count.data, uses=form.uses.data) log_audit(f"Created {form.count.data} Play Key(s) with {form.uses.data} uses!") flash(f"Created {form.count.data} Play Key(s) with {form.uses.data} uses!", "success") return redirect(url_for('play_keys.index')) return render_template('play_keys/bulk.html.j2', form=form) @play_keys_blueprint.route('/delete/<id>', methods=('GET', 'POST')) @login_required @gm_level(5) def delete(id): key = PlayKey.query.filter(PlayKey.id == id).first() # associated_accounts = Account.query.filter(Account.play_key_id==id).all() log_audit(f"Deleted Play Key {key.key_string}") flash(f"Deleted Play Key {key.key_string}", "danger") key.delete() return redirect(url_for('play_keys.index')) @play_keys_blueprint.route('/edit/<id>', methods=('GET', 'POST')) @login_required @gm_level(5) def edit(id): key = PlayKey.query.filter(PlayKey.id == id).first() form = EditPlayKeyForm() if form.validate_on_submit(): log_audit(f"Updated Play key {key.id} \ Uses: {key.key_uses}:{form.uses.data} \ Active: {key.active}:{form.active.data} \ Notes: {key.notes}:{form.notes.data} \ ") key.key_uses = form.uses.data key.active = form.active.data key.notes = form.notes.data key.save() return redirect(url_for('play_keys.index')) form.uses.data = key.key_uses form.active.data = key.active form.notes.data = key.notes return render_template('play_keys/edit.html.j2', form=form, key=key) @play_keys_blueprint.route('/view/<id>', methods=('GET', 'POST')) @login_required @gm_level(5) def view(id): key = PlayKey.query.filter(PlayKey.id == id).first() accounts = Account.query.filter(Account.play_key_id == id).all() return render_template('play_keys/view.html.j2', key=key, accounts=accounts) @play_keys_blueprint.route('/get', methods=['GET']) @login_required @gm_level(5) def get(): columns = [ ColumnDT(PlayKey.id), ColumnDT(PlayKey.key_string), ColumnDT(PlayKey.key_uses), ColumnDT(PlayKey.times_used), ColumnDT(PlayKey.created_at), ColumnDT(PlayKey.active), ] query = db.session.query().select_from(PlayKey) params = request.args.to_dict() rowTable = DataTables(params, query, columns) data = rowTable.output_result() for play_key in data["data"]: # Hackily shove buttons into response play_key["0"] = f""" <a role="button" class="btn btn-primary btn btn-block" href='{url_for('play_keys.view', id=play_key["0"])}'> View </a> <a role="button" class="btn btn-secondary btn btn-block" href='{url_for('play_keys.edit', id=play_key["0"])}'> Edit </a> <a type="button" class="btn btn-danger btn-block" data-toggle="modal" data-target="#delete-{play_key["1"]}-modal"> Delete </a> <div class="modal fade bd-example-modal-lg" id="delete-{play_key["1"]}-modal" tabindex="-1" role="dialog" aria-labelledby="delete-{play_key["1"]}-modalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content bg-dark border-primary"> <div class="modal-header"> <h5 class="modal-title" id="delemodalLabel">Delete Play Key {play_key["1"]} ?</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body text-danger"> Are you sure you want to delete the Play Key {play_key["1"]} ? </br></br> This will not delete accounts that have used this key, but they may be unable to play. </div> <div class="modal-footer"> <button type="button" class="btn btn-primary" data-dismiss="modal">Close</button> <a href='{url_for('play_keys.delete', id=play_key["0"])}' class="btn btn-danger" role="button" aria-disabled="true"> Delete </a> </div> </div> </div> </div> """ if play_key["5"]: play_key["5"] = '''<h1 class="far fa-check-square text-success"></h1>''' else: play_key["5"] = '''<h1 class="far fa-times-circle text-danger"></h1>''' return data