|
|
|
""" Main webapp handlers. """
|
|
|
|
|
|
|
|
import os
|
|
|
|
import json
|
|
|
|
import logging
|
|
|
|
|
|
|
|
from flask import request, render_template, jsonify, send_file, redirect, url_for, abort
|
|
|
|
|
|
|
|
from vasl_templates.webapp import app
|
|
|
|
from vasl_templates.webapp.utils import MsgStore
|
|
|
|
from vasl_templates.webapp.config.constants import BASE_DIR, DATA_DIR
|
|
|
|
|
|
|
|
startup_msg_store = MsgStore() # store messages generated during startup
|
|
|
|
_check_versions = True
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
|
|
|
|
@app.route( "/" )
|
|
|
|
def main():
|
|
|
|
"""Return the main page."""
|
|
|
|
return render_template( "index.html" )
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
|
|
|
|
@app.route( "/startup-msgs" )
|
|
|
|
def get_startup_msgs():
|
|
|
|
"""Return any messages generated during startup."""
|
|
|
|
|
|
|
|
global _check_versions
|
|
|
|
if _check_versions:
|
|
|
|
_check_versions = False
|
|
|
|
# check the VASSAL version
|
|
|
|
from vasl_templates.webapp.vassal import VassalShim
|
|
|
|
try:
|
|
|
|
VassalShim.check_vassal_version( startup_msg_store )
|
|
|
|
except Exception as ex: #pylint: disable=broad-except
|
|
|
|
# NOTE: We can get here is VASSAL has been configured, but not Java - don't show an error to the user :-/
|
|
|
|
logging.warning( "Can't get the VASSAL version: %s", ex )
|
|
|
|
|
|
|
|
# collect all the startup messages
|
|
|
|
startup_msgs = {}
|
|
|
|
for msg_type in ("info","warning","error"):
|
|
|
|
msgs = startup_msg_store.get_msgs( msg_type )
|
|
|
|
if msgs:
|
|
|
|
startup_msgs[ msg_type ] = msgs
|
|
|
|
|
|
|
|
return jsonify( startup_msgs )
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
|
|
|
|
@app.route( "/help" )
|
|
|
|
def show_help():
|
|
|
|
"""Show the help page."""
|
|
|
|
url = url_for( "static", filename="help/index.html" )
|
|
|
|
if request.args:
|
|
|
|
args = [ "{}={}".format( arg, request.args[arg] ) for arg in request.args ]
|
|
|
|
url += "?{}".format( "&".join( args ) )
|
|
|
|
return redirect( url, code=302 )
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
|
|
|
|
@app.route( "/license" )
|
|
|
|
def get_license():
|
|
|
|
"""Get the license."""
|
|
|
|
|
|
|
|
# locate the license file
|
|
|
|
dname = BASE_DIR
|
|
|
|
fname = os.path.join( dname, "../../LICENSE.txt" ) # nb: if we're running from source
|
|
|
|
if not os.path.isfile( fname ):
|
|
|
|
fname = os.path.join( dname, "LICENSE.txt" ) # nb: if we're running as a compiled binary
|
|
|
|
if not os.path.isfile( fname ):
|
|
|
|
# FUDGE! If we've been pip install'ed walk up the directory tree, looking for the license file :-/
|
|
|
|
while True:
|
|
|
|
# go up a directory
|
|
|
|
prev_dname = dname
|
|
|
|
dname = os.path.split( dname )[0]
|
|
|
|
if dname == prev_dname:
|
|
|
|
break
|
|
|
|
# check if we can find the license file
|
|
|
|
fname = os.path.join( dname, "vasl-templates/LICENSE.txt" )
|
|
|
|
if os.path.isfile( fname ):
|
|
|
|
break
|
|
|
|
if not os.path.isfile( fname ):
|
|
|
|
abort( 404 )
|
|
|
|
|
|
|
|
return send_file( fname, "text/plain" )
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
|
|
|
|
default_scenario = None
|
|
|
|
|
|
|
|
@app.route( "/default-scenario" )
|
|
|
|
def get_default_scenario():
|
|
|
|
"""Return the default scenario."""
|
|
|
|
|
|
|
|
# check if a default scenario has been configured
|
|
|
|
if default_scenario:
|
|
|
|
fname = default_scenario
|
|
|
|
else:
|
|
|
|
fname = os.path.join( app.config.get("DATA_DIR",DATA_DIR), "default-scenario.json" )
|
|
|
|
|
|
|
|
# return the default scenario
|
|
|
|
with open(fname,"r") as fp:
|
|
|
|
return jsonify( json.load( fp ) )
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
|
|
|
|
@app.route( "/ping" )
|
|
|
|
def ping():
|
|
|
|
"""Let the caller know we're alive."""
|
|
|
|
return "pong"
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
|
|
|
|
@app.route( "/shutdown" )
|
|
|
|
def shutdown():
|
|
|
|
"""Shutdown the webapp (for testing porpoises)."""
|
|
|
|
request.environ.get( "werkzeug.server.shutdown" )()
|
|
|
|
return ""
|