import json from flask import render_template, flash, redirect, url_for, abort from flask_login import current_user, login_required from app import db from app.main import bp from app.utils import generate_qr_code, serve_pil_image, get_game_if_owner from app.models import Objective, Role, ObjectiveEncoder from app.main.forms import ObjectiveForm @bp.route('/game//add_objective', methods=['GET', 'POST']) @login_required def add_objective(game_name): game = get_game_if_owner(game_name) form = ObjectiveForm() _objective = Objective(name='', latitude=52.0932, longitude=5.12405) if form.validate_on_submit(): _objective = Objective(name=form.objective_name.data, longitude=form.longitude.data, latitude=form.latitude.data) _objective.set_hash() game.objectives.append(_objective) db.session.commit() flash("Objective has been added!") return redirect(url_for('main.game_dashboard', game_name=game.name)) return render_template('objective.html', title=f'Add Objective for {game_name}', form=form, game=game, objective=_objective, owner=True, json=json, objective_encoder=ObjectiveEncoder) @bp.route('/objective//delete', methods=['GET']) @login_required def delete_objective(objective_hash): _objective = Objective.query.filter_by(hash=objective_hash).first_or_404() if not _objective.owned_by(current_user): abort(403) else: db.session.delete(_objective) db.session.commit() return redirect(url_for('main.game_dashboard', game_name=_objective.game.name)) @bp.route('/objective//qrcode.png') @login_required def objective_qrcode(objective_hash): _objective = Objective.query.filter_by(hash=objective_hash).first_or_404() if not _objective.owned_by(current_user): abort(403) img = generate_qr_code(url_for('main.objective', objective_hash=_objective.hash, _external=True)) return serve_pil_image(img) @bp.route('/objective/', methods=['GET', 'POST']) @login_required def objective(objective_hash): _objective = Objective.query.filter_by(hash=objective_hash).first_or_404() if current_user.role_in_game(_objective.game) == Role.bunny: if not _objective.game.is_active(): flash("It's not possible to find an objective before or after a game, " "or if the game is not in 'active' mode.") return redirect(url_for('main.game_dashboard', game_name=_objective.game.name)) player = current_user.player_in(_objective.game) if not _objective in player.found_objectives: player.found_objectives.append(_objective) db.session.commit() if _objective.name: flash(f'You found objective: {_objective.name}!') else: flash('You found an objective!') elif _objective.name: flash(f"You have already found objective '{_objective.name}'") else: flash('You have already found this objective') return redirect(url_for('main.game_dashboard', game_name=_objective.game.name)) if not _objective.owned_by(current_user): flash("Only bunnies in an objective's game can find objectives!") abort(403) qrcode = generate_qr_code(_objective) form = ObjectiveForm() form.old_name = _objective.name if form.submit.data and form.validate(): _objective.name = form.objective_name.data _objective.longitude = form.longitude.data _objective.latitude = form.latitude.data db.session.commit() return redirect(url_for('main.game_dashboard', game_name=_objective.game.name)) return render_template('objective.html', title='Objective view', form=form, game=_objective.game, objective=_objective, owner=True, qrcode=qrcode, json=json, objective_encoder=ObjectiveEncoder)