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()