You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
4.0 KiB

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/<game_name>/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/<objective_hash>/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/<objective_hash>/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/<objective_hash>', 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)