From fa1e76df474a9bbfed23df2e81ad7c3043c19caf Mon Sep 17 00:00:00 2001 From: Peter Stockings Date: Thu, 19 Oct 2023 22:03:35 +1100 Subject: [PATCH] Refactor render_users_and_workouts method --- app.py | 77 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 41 insertions(+), 36 deletions(-) diff --git a/app.py b/app.py index a39c165..766c33b 100644 --- a/app.py +++ b/app.py @@ -137,7 +137,7 @@ def delete_user(user_id): def workouts(user_id): user = User.query.get(user_id) if request.method == 'GET': - workouts_data = get_workouts_for_user(user) + workouts_data = get_workouts_for_user(user, user.workouts) return render_template('workouts_list.html', workouts=workouts_data) elif request.method == 'POST': @@ -263,7 +263,7 @@ def delete_workout(user_id, workout_id): @app.route('/user//workouts', methods=['GET']) def workouts_for_user(user_id): user = User.query.get(user_id) - workouts_data = get_workouts_for_user(user) + workouts_data = get_workouts_for_user(user, user.workouts) return render_template('workouts_list.html', workouts=workouts_data) @@ -283,7 +283,7 @@ def update_users_bike(user_id): @ app.route('/user//calendar', methods=['GET']) def calendar_view(user_id): user = User.query.get(user_id) - workouts = get_workouts_for_user(user) + workouts = get_workouts_for_user(user, user.workouts) date = request.args.get('date', default=datetime.now().date(), type=toDate) calendar_month = generate_calendar_monthly_view(workouts, date) return render_template('partials/calendar.html', calendar_month=calendar_month, user_id=user_id) @@ -292,7 +292,7 @@ def calendar_view(user_id): @ app.route("/user//workout/list", methods=['GET']) def workout_list(user_id): user = User.query.get(user_id) - workouts = get_workouts_for_user(user) + workouts = get_workouts_for_user(user, user.workouts) return render_template('partials/workouts_list_fragment.html', workouts=workouts, user_id=user_id, workouts_all_loaded=True) @@ -304,53 +304,58 @@ def calendar_workout_view(user_id, workout_id): return render_template('partials/selected_workout_view.html', workout=workout_view_data, user_id=user_id) +# Utilities + +def generate_user_data(user, workouts=[]): + """ + Generate data for a single user. + + Parameters: + - user: The user object. + - workouts: List of workouts for the user. + + Returns: + - dict: A dictionary containing user data and related information. + """ + + return { + 'id': user.id, + 'name': user.name, + 'bike_id': user.bike_id, + 'workouts_count': len(workouts), + 'workouts': workouts, + 'daily_duration_sparkline': generate_daily_duration_sparkline(workouts), + 'calendar_month': generate_calendar_monthly_view(workouts, datetime.now().date()) + } + + def render_users_and_workouts(): + """ + Render users and their associated workouts. + """ users = User.query.all() - users_data = [] - for user in users: - workouts = get_workouts_for_user(user) - if not workouts: - user_data = { - 'id': user.id, - 'name': user.name, - 'bike_id': user.bike_id, - 'workouts_count': 0, - 'workouts': [], - 'daily_duration_sparkline': '', - 'calendar_month': generate_calendar_monthly_view([], datetime.now().date()) - } - users_data.append(user_data) - continue - user_data = { - 'id': user.id, - 'name': user.name, - 'bike_id': user.bike_id, - 'workouts_count': len(workouts), - 'workouts': workouts, - 'daily_duration_sparkline': generate_daily_duration_sparkline(workouts), - 'calendar_month': generate_calendar_monthly_view(workouts, datetime.now().date()) - } - users_data.append(user_data) + users_data = [generate_user_data(user, get_workouts_for_user( + user, user.workouts)) for user in users] - if htmx: - return render_template('users_and_workouts_wrapper.html', - users=users_data, bikes=Bike.query.all()) - return render_template('users_and_workouts.html', users=users_data, bikes=Bike.query.all()) + template_name = 'users_and_workouts_wrapper.html' if htmx else 'users_and_workouts.html' + return render_template(template_name, users=users_data, bikes=Bike.query.all()) -def get_workouts_for_user(user): +def get_workouts_for_user(user, workouts): """ Retrieve view data for all workouts of a user. Parameters: - - user: The user object with a 'workouts' attribute containing all user workouts. + - user: The user object. + + - workouts: A list of all user workouts. Returns: - list: A list of view data for valid workouts. """ - return [get_workout_view_data(workout, user) for workout in user.workouts if get_workout_view_data(workout, user)] + return [get_workout_view_data(workout, user) for workout in workouts if get_workout_view_data(workout, user)] def get_workout_view_data(workout, user):