Feat: User Relationships and Session Members.

This commit is contained in:
2026-02-28 19:53:50 +00:00
parent c7db290aaf
commit e8e9a02e7b
73 changed files with 3818 additions and 571 deletions

View File

@@ -14,7 +14,7 @@ MTG Game Page Controller.
# internal
from business_objects.api import API
from business_objects.tcg.mtg_deck import MTG_Deck
from business_objects.tcg.mtg_game import MTG_Game
from business_objects.tcg.mtg_game import MTG_Game, Parameters_MTG_Game
from business_objects.tcg.mtg_game_player import MTG_Game_Player, Parameters_MTG_Game_Player
from business_objects.tcg.mtg_game_round import MTG_Game_Round, Parameters_MTG_Game_Round
from business_objects.tcg.mtg_game_round_player_damage import MTG_Game_Round_Player_Damage, Parameters_MTG_Game_Round_Player_Damage
@@ -50,14 +50,14 @@ routes_mtg_game = Blueprint('routes_mtg_game', __name__)
@routes_mtg_game.route(Model_View_MTG_Base.HASH_PAGE_MTG_GAMES, methods=['GET'])
def games():
Helper_App.console_log('mtg games')
Helper_App.console_log(f'request_args: {request.args}')
# Helper_App.console_log('mtg games')
# Helper_App.console_log(f'request_args: {request.args}')
try:
form_filters = Filters_MTG_Game.from_json(request.args)
except Exception as e:
Helper_App.console_log(f'Error: {e}')
# Helper_App.console_log(f'Error: {e}')
form_filters = Filters_MTG_Game()
Helper_App.console_log(f'form_filters={form_filters}')
# Helper_App.console_log(f'form_filters={form_filters}')
datastore = DataStore_MTG()
user_session = datastore.get_user_session()
@@ -68,13 +68,13 @@ def games():
model = Model_View_MTG_Games(parameters_game = parameters_game)
model.form_filters = form_filters
Helper_App.console_log(f'form_filters={form_filters}')
# Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/tcg/mtg/_games.html', model=model)
@routes_mtg_game.route(f'{Model_View_MTG_Base.HASH_PAGE_MTG_GAME}/<int:game_id>', methods=['GET'])
def game_detail(game_id):
Helper_App.console_log(f'mtg game detail: {game_id}')
# Helper_App.console_log(f'mtg game detail: {game_id}')
model = Model_View_MTG_Game(game_id=game_id)
if not model.is_user_logged_in:
return redirect(url_for('routes_mtg_game.home'))
@@ -88,7 +88,7 @@ def game_detail(game_id):
def save_game():
_m = 'routes_mtg_game.save_game'
data = Helper_App.get_request_data(request)
Helper_App.console_log(f'{_m}\n{data}')
# Helper_App.console_log(f'{_m}\n{data}')
try:
"""
form_filters = Filters_MTG_Game.from_json(data.get(Model_View_MTG_Base.FLAG_FORM_FILTERS, {}))
@@ -111,10 +111,10 @@ def save_game():
Model_View_MTG_Base.FLAG_STATUS: Model_View_MTG_Base.FLAG_FAILURE
, Model_View_MTG_Base.FLAG_MESSAGE: 'No games to save.'
})
Helper_App.console_log(f"Games to save: {games}")
# Helper_App.console_log(f"Games to save: {games}")
obj_game = MTG_Game.from_json(games[0])
Helper_App.console_log(f'obj_game={obj_game}')
# Helper_App.console_log(f'obj_game={obj_game}')
game_id, errors = DataStore_MTG.save_mtg_game(obj_game)
@@ -148,11 +148,69 @@ def trial_game():
return send_from_directory('templates/pages/tcg/mtg', 'trial_game.html')
@routes_mtg_game.route('/mtg/api/game/<int:game_id>/is-outdated', methods=['POST'])
def get_is_game_data_outdated(game_id):
"""Check if saved game has been updated since page load."""
_m = 'routes_mtg_game.get_is_game_data_outdated'
# Helper_App.console_log(f'{_m}: game_id={game_id}')
data = Helper_App.get_request_data(request)
# Helper_App.console_log(f'{_m}\n{data}')
try:
loaded_game = data.get(Model_View_MTG_Base.FLAG_GAME, None)
if loaded_game is None:
return jsonify({
Model_View_MTG_Base.FLAG_STATUS: Model_View_MTG_Base.FLAG_FAILURE
, Model_View_MTG_Base.FLAG_MESSAGE: 'Loaded game not sent for comparison.'
})
# Helper_App.console_log(f"Loaded game: {loaded_game}")
obj_loaded_game = MTG_Game.from_json(loaded_game)
# Helper_App.console_log(f'obj_loaded_game={obj_loaded_game}')
datastore = DataStore_MTG()
user_session = datastore.get_user_session()
if not user_session.get_is_logged_in():
return jsonify({
Model_View_MTG_Base.FLAG_STATUS: Model_View_MTG_Base.FLAG_FAILURE
, Model_View_MTG_Base.FLAG_MESSAGE: 'User not logged in'
}), 401
# Get saved game
parameters_game = Parameters_MTG_Game.get_default(user_session.user_id)
parameters_game.game_ids = str(game_id)
parameters_game.get_all_game = False
saved_games, errors = datastore.get_many_mtg_game(parameters_game)
if (len(errors) > 0 or len(saved_games) == 0):
return jsonify({
Model_View_MTG_Base.FLAG_STATUS: Model_View_MTG_Base.FLAG_FAILURE
, Model_View_MTG_Base.FLAG_MESSAGE: f'Error fetching saved game: {errors}'
}), 500
saved_game = saved_games[0]
saved_game.updated_last_on = saved_game.updated_last_on.replace(microsecond = 0)
is_game_data_outdated = saved_game.updated_last_on > obj_loaded_game.updated_last_on
# Helper_App.console_log(f"loaded game updated last on: {obj_loaded_game.updated_last_on}")
# Helper_App.console_log(f"saved game updated last on: {saved_game.updated_last_on}")
# Helper_App.console_log(f"game oudated?: {is_game_data_outdated}")
return jsonify({
Model_View_MTG_Base.FLAG_STATUS: Model_View_MTG_Base.FLAG_SUCCESS
, Model_View_MTG_Base.FLAG_DATA: is_game_data_outdated
})
except Exception as e:
# Helper_App.console_log(f'{_m} Error: {str(e)}')
return jsonify({
Model_View_MTG_Base.FLAG_STATUS: Model_View_MTG_Base.FLAG_FAILURE
, Model_View_MTG_Base.FLAG_MESSAGE: f'Error: {str(e)}'
}), 500
@routes_mtg_game.route('/mtg/api/game/<int:game_id>/players', methods=['GET'])
def get_game_players(game_id):
"""Get players for a game with enriched user and deck information."""
_m = 'routes_mtg_game.get_game_players'
Helper_App.console_log(f'{_m}: game_id={game_id}')
# Helper_App.console_log(f'{_m}: game_id={game_id}')
try:
datastore = DataStore_MTG()
user_session = datastore.get_user_session()
@@ -182,7 +240,7 @@ def get_game_players(game_id):
, Model_View_MTG_Base.FLAG_DATA: players_json
})
except Exception as e:
Helper_App.console_log(f'{_m} Error: {str(e)}')
# Helper_App.console_log(f'{_m} Error: {str(e)}')
return jsonify({
Model_View_MTG_Base.FLAG_STATUS: Model_View_MTG_Base.FLAG_FAILURE
, Model_View_MTG_Base.FLAG_MESSAGE: f'Error: {str(e)}'
@@ -193,7 +251,7 @@ def get_game_players(game_id):
def get_many_game_round(game_id):
"""Get rounds for a game."""
_m = 'routes_mtg_game.get_many_game_round'
Helper_App.console_log(f'{_m}: game_id={game_id}')
# Helper_App.console_log(f'{_m}: game_id={game_id}')
try:
datastore = DataStore_MTG()
user_session = datastore.get_user_session()
@@ -223,7 +281,7 @@ def get_many_game_round(game_id):
, Model_View_MTG_Base.FLAG_DATA: rounds_json
})
except Exception as e:
Helper_App.console_log(f'{_m} Error: {str(e)}')
# Helper_App.console_log(f'{_m} Error: {str(e)}')
return jsonify({
Model_View_MTG_Base.FLAG_STATUS: Model_View_MTG_Base.FLAG_FAILURE
, Model_View_MTG_Base.FLAG_MESSAGE: f'Error: {str(e)}'
@@ -234,7 +292,7 @@ def get_many_game_round(game_id):
def get_many_game_player_damage(game_id):
"""Get damage records for a game."""
_m = 'routes_mtg_game.get_many_game_player_damage'
Helper_App.console_log(f'{_m}: game_id={game_id}')
# Helper_App.console_log(f'{_m}: game_id={game_id}')
try:
datastore = DataStore_MTG()
user_session = datastore.get_user_session()
@@ -263,7 +321,7 @@ def get_many_game_player_damage(game_id):
, Model_View_MTG_Base.FLAG_DATA: damage_records
})
except Exception as e:
Helper_App.console_log(f'{_m} Error: {str(e)}')
# Helper_App.console_log(f'{_m} Error: {str(e)}')
return jsonify({
Model_View_MTG_Base.FLAG_STATUS: Model_View_MTG_Base.FLAG_FAILURE
, Model_View_MTG_Base.FLAG_MESSAGE: f'Error: {str(e)}'
@@ -274,7 +332,7 @@ def get_many_game_player_damage(game_id):
def save_game_player():
_m = 'routes_mtg_game.save_game_player'
data = Helper_App.get_request_data(request)
Helper_App.console_log(f'{_m}\n{data}')
# Helper_App.console_log(f'{_m}\n{data}')
try:
"""
form_filters = Filters_MTG_Game.from_json(data.get(Model_View_MTG_Base.FLAG_FORM_FILTERS, {}))
@@ -301,7 +359,7 @@ def save_game_player():
objs_player = []
for player in players:
obj_player = MTG_Game_Player.from_json(player)
Helper_App.console_log(f'obj_player = {obj_player}')
# Helper_App.console_log(f'obj_player = {obj_player}')
objs_player.append(obj_player)
success, errors = DataStore_MTG.save_mtg_game_player(objs_player)
@@ -325,7 +383,7 @@ def save_game_player():
def save_game_round_player_damage():
_m = 'routes_mtg_game.save_game_round_player_damage'
data = Helper_App.get_request_data(request)
Helper_App.console_log(f'{_m}\n{data}')
# Helper_App.console_log(f'{_m}\n{data}')
try:
datastore = DataStore_MTG()
user_session = datastore.get_user_session()
@@ -342,7 +400,7 @@ def save_game_round_player_damage():
objs_round = []
for round in rounds:
obj_round = MTG_Game_Round.from_json(round)
Helper_App.console_log(f'obj_round = {obj_round}')
# Helper_App.console_log(f'obj_round = {obj_round}')
objs_round.append(obj_round)
damages = data.get(Model_View_MTG_Base.FLAG_DAMAGE, [])
@@ -355,7 +413,7 @@ def save_game_round_player_damage():
objs_damage = []
for damage in damages:
obj_damage = MTG_Game_Round_Player_Damage.from_json(damage)
Helper_App.console_log(f'obj_damage = {obj_damage}')
# Helper_App.console_log(f'obj_damage = {obj_damage}')
objs_damage.append(obj_damage)
success, errors = DataStore_MTG.save_mtg_game_round_player_damage(objs_round, objs_damage)
@@ -379,14 +437,14 @@ def save_game_round_player_damage():
@routes_mtg_game.route(Model_View_MTG_Base.HASH_PAGE_MTG_DECKS, methods=['GET'])
def decks():
Helper_App.console_log('mtg decks')
Helper_App.console_log(f'request_args: {request.args}')
# Helper_App.console_log('mtg decks')
# Helper_App.console_log(f'request_args: {request.args}')
try:
form_filters = Filters_MTG_Deck.from_json(request.args)
except Exception as e:
Helper_App.console_log(f'Error: {e}')
# Helper_App.console_log(f'Error: {e}')
form_filters = Filters_MTG_Deck()
Helper_App.console_log(f'form_filters={form_filters}')
# Helper_App.console_log(f'form_filters={form_filters}')
datastore = DataStore_MTG()
user_session = datastore.get_user_session()
@@ -397,6 +455,6 @@ def decks():
model = Model_View_MTG_Decks(parameters_deck = parameters_deck)
model.form_filters = form_filters
Helper_App.console_log(f'form_filters={form_filters}')
# Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/tcg/mtg/_decks.html', model=model)

View File

@@ -82,20 +82,22 @@ def login():
, state = quote(hash_callback)
)
except Exception as e:
Helper_App.console_log(f"Error: {str(e)}")
Helper_App.console_log(f"Login error: {str(e)}")
# Helper_App.console_log(f'redirect: {red}')
headers = red.headers['Location']
# Helper_App.console_log(f'headers: {headers}')
parsed_url = urlparse(headers)
query_params = parse_qs(parsed_url.query)
Helper_App.console_log(f"""
"""
Helper_App.console_log(f"" "
OAuth Authorize Redirect URL:
Base URL: {parsed_url.scheme}://{parsed_url.netloc}{parsed_url.path}
{parsed_url}
Query Parameters: {query_params}
""")
"" ")
"""
return jsonify({'Success': True, Model_View_Base.FLAG_STATUS: Model_View_Base.FLAG_SUCCESS, f'{Model_View_Base.FLAG_CALLBACK}': headers})
except Exception as e:
@@ -113,17 +115,17 @@ def login_callback():
try:
token = oauth.auth0.authorize_access_token()
except Exception as e:
Helper_App.console_log(f"Error: {str(e)}")
Helper_App.console_log(f"Login callback token error: {str(e)}")
session[current_app.config['ID_TOKEN_USER']] = token
try:
hash_callback = token.get('hash_callback')
if hash_callback is None:
Helper_App.console_log('hash is none')
# Helper_App.console_log('hash is none')
state = request.args.get('state')
Helper_App.console_log(f'state: {state}')
# Helper_App.console_log(f'state: {state}')
hash_callback = state
Helper_App.console_log(f'hash_callback: {hash_callback}')
# Helper_App.console_log(f'hash_callback: {hash_callback}')
except:
Helper_App.console_log("get hash callback failed")
@@ -136,7 +138,7 @@ def login_callback():
return redirect(f"{current_app.config['URL_HOST']}{hash_callback}") # login()
user = User.from_json_auth0(token)
Helper_App.console_log(f'user: {user}')
# Helper_App.console_log(f'User from Auth0 json: {user}')
"""
session[Model_View_Base.FLAG_USER] = user.to_json()
Helper_App.console_log(f'user stored on session')
@@ -146,18 +148,19 @@ def login_callback():
try:
saved_user, errors = datastore_user.login_user(user)
if (len(errors) > 0): raise ValueError(f'Database errors: {errors}')
Helper_App.console_log('User logged in')
Helper_App.console_log(f'user ({str(type(saved_user))}): {saved_user}')
Helper_App.console_log(f'user key: {Model_View_Base.FLAG_USER}')
if (saved_user is None): raise ValueError(f'Not found.')
# Helper_App.console_log('User logged in')
# Helper_App.console_log(f'user ({str(type(saved_user))}): {saved_user}')
# Helper_App.console_log(f'user key: {Model_View_Base.FLAG_USER}')
saved_user_json = saved_user.to_json()
Helper_App.console_log(f'User JSON: {saved_user_json}')
# Helper_App.console_log(f'Saved user JSON: {saved_user_json}')
session[Model_View_Base.FLAG_USER] = saved_user_json
Helper_App.console_log(f'user stored on session')
# Helper_App.console_log(f'user stored on session')
except Exception as e:
Helper_App.console_log(f'User not found: {saved_user}\nDatabase query error: {errors}')
Helper_App.console_log(f'user session: {session.get(Model_View_Base.FLAG_USER, "(Key not found)")}')
# Helper_App.console_log(f'user session: {session.get(Model_View_Base.FLAG_USER, "(Key not found)")}')
return redirect(f"{current_app.config['URL_HOST']}{hash_callback}")
except Exception as e:
return jsonify({Model_View_Base.FLAG_STATUS: Model_View_Base.FLAG_FAILURE, Model_View_Base.FLAG_MESSAGE: f'Controller error.\n{e}'})
@@ -171,7 +174,7 @@ def logout():
"client_id": current_app.config['ID_AUTH0_CLIENT'],
}
)
Helper_App.console_log(f"Redirecting to {url_logout}")
# Helper_App.console_log(f"Redirecting to {url_logout}")
return redirect(url_logout)
@routes_user.route("/logout_callback")
@@ -197,14 +200,14 @@ def user():
@routes_user.route(Model_View_User.HASH_PAGE_USER_ACCOUNTS)
def users():
try:
Helper_App.console_log(f'request_args: {request.args}')
# Helper_App.console_log(f'request_args: {request.args}')
user_session = Model_View_User.get_user_session()
if (not user_session.get_is_logged_in()) or (not user_session.can_admin_user):
return redirect(url_for('routes_mtg_game.home'))
try:
form_filters = Filters_User.from_json(request.args)
except Exception as e:
Helper_App.console_log(f'Error: {e}')
# Helper_App.console_log(f'Error: {e}')
form_filters = Filters_User.get_default()
model = Model_View_User(form_filters, hash_page_current = Model_View_User.HASH_PAGE_USER_ACCOUNTS)
html_body = render_template('pages/user/_users.html', model = model)
@@ -236,7 +239,7 @@ def save_user():
objs_user = []
for user in users:
objs_user.append(User.from_json(user))
Helper_App.console_log(f'objs_user={objs_user}')
# Helper_App.console_log(f'objs_user={objs_user}')
errors = DataStore_User.save_users(data.get('comment', 'No comment'), objs_user)
if (len(errors) > 0):