workouts/views/workouts_form.py
2026-02-24 20:17:41 -07:00

160 lines
6 KiB
Python

import streamlit as st
import mysql.connector
from mysql.connector import errorcode
import pandas as pd
from datetime import datetime, date
from dotenv import load_dotenv
import os
load_dotenv()
user = os.getenv('user')
password = os.getenv('password')
host = os.getenv('host')
database = os.getenv('database')
port = os.getenv('port')
workout_table = ['chest','back','legs']
selected_workout = st.selectbox('Select a Workout',options=workout_table)
try:
conn = mysql.connector.connect(user=user,password=password, host=host,port=port,database=database)
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("Something is wrong with your user name or password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("Database does not exist")
else:
print(err)
else:
cursor = conn.cursor()
if selected_workout == 'chest':
query = ("SELECT * FROM `chest`")
elif selected_workout == 'back':
query = ("SELECT * FROM `back`")
else:
query = ("SELECT * FROM `legs`")
cursor.execute(query)
data = cursor.fetchall()
conn.commit()
cursor.close()
conn.close()
# Set date to today for dataframe
today=date.today()
df = pd.DataFrame(data,columns=cursor.column_names)
df['date']=today
# function to display current row data
def display_row(row):
st.text_input("Date", value=row['date'], key='date')
st.text_input("Group",value=row['group'], key='group')
st.text_input("Exercise",value=row['exercise'], key='exercise')
st.number_input("Set",value=row['set'], key='set',format="%i")
st.number_input("Weight",value=row['weight'], key='weight',format="%0.1f",step=0.5)
st.number_input("Reps",value=row['reps'], key='reps',format="%i")
st.text_input("Notes",value=row['notes'], key='notes')
# function to save current edited row data to edited dataframe
def save_edited_row(index):
st.session_state.edited_df.at[index,'group'] = st.session_state.group
st.session_state.edited_df.at[index,'exercise'] = st.session_state.exercise
st.session_state.edited_df.at[index,'set'] = st.session_state.set
st.session_state.edited_df.at[index,'weight'] = st.session_state.weight
st.session_state.edited_df.at[index,'reps'] = st.session_state.reps
st.session_state.edited_df.at[index,'notes'] = st.session_state.notes
# function to save current superset row to superset dataframe
def save_superset_row(index):
st.session_state.superset_df.at[index,'group'] = st.session_state.group
st.session_state.superset_df.at[index,'exercise'] = st.session_state.exercise
st.session_state.superset_df.at[index,'set'] = st.session_state.set
st.session_state.superset_df.at[index,'weight'] = st.session_state.weight
st.session_state.superset_df.at[index,'reps'] = st.session_state.reps
st.session_state.superset_df.at[index,'notes'] = st.session_state.notes
# Build superset selector
max_superset = int(df['superset'].max()) if not df.empty else 1
superset_count = list(range(1, max_superset + 1))
# initialize session state dataframe
if 'edited_df' not in st.session_state or st.session_state.get('current_workout') != selected_workout:
st.session_state.edited_df = df.copy()
st.session_state.current_workout = selected_workout
st.session_state.row = 0
if 'last_superset' in st.session_state:
del st.session_state['last_superset']
keys_to_clear = ['date', 'group', 'exercise', 'set', 'weight', 'reps', 'notes']
for key in keys_to_clear:
if key in st.session_state:
del st.session_state[key]
# Initialize session state to keep track of the current row
if 'row' not in st.session_state:
st.session_state.row = 0
# set superset selection
current_superset = st.selectbox('Select Superset', options=superset_count)
# Reset row if superset changes
if 'last_superset' not in st.session_state or st.session_state.last_superset != current_superset:
st.session_state.row = 0
st.session_state.last_superset = current_superset
keys_to_clear = ['date', 'group', 'exercise', 'set', 'weight', 'reps', 'notes']
for key in keys_to_clear:
if key in st.session_state:
del st.session_state[key]
# select superset dataframe subset
subset_df = st.session_state.edited_df[st.session_state.edited_df['superset'] == current_superset]
st.write(subset_df)
# Display the current row of data
if st.session_state.row < 12 and st.session_state.row < len(subset_df):
# Get the index from the subset to update the main df later
current_idx = subset_df.index[st.session_state.row]
row_data = subset_df.loc[current_idx]
display_row(row_data)
# Button to clear form and move to the next row
if st.button('Save and Next'):
save_edited_row(current_idx)
st.session_state.row += 1
# Clear widget states so next row loads correct values
keys_to_clear = ['date', 'group', 'exercise', 'set', 'weight', 'reps', 'notes']
for key in keys_to_clear:
if key in st.session_state:
del st.session_state[key]
if st.session_state.row >= 12:
st.session_state.row = 0
st.rerun()
elif st.session_state.row >= 12 or st.session_state.row >= len(subset_df):
st.write("Superset complete")
if st.button("Start Over"):
st.session_state.row = 0
st.rerun()
st.write("Select Next Superset")
st.write("")
# Button to save all changes back to the dataframe
if st.button('Save All Changes'):
df.update(st.session_state.edited_df)
st.write("All changes saved!")
st.write(df)
conn = mysql.connector.connect(user=user,password=password, host=host,port=port,database=database)
cursor = conn.cursor()
for index, row in df.iterrows():
query = ("INSERT INTO `workouts`"
"(`inputdate`,`group`,`exercise`,`set`,`weight`,`reps`,`notes`) "
"VALUES (%s,%s,%s,%s,%s,%s,%s)")
cursor.execute(query,(row.iloc[1],row.iloc[2],row.iloc[3],row.iloc[4],row.iloc[5],row.iloc[6],row.iloc[7]))
conn.commit()
cursor.close()
conn.close()