user-feedback / views /nav_buttons.py
esak's picture
add help on navigation buttons
998b1eb
raw
history blame
4.19 kB
from db.schema import Feedback, Response
from db.crud import save_feedback, read
import streamlit as st
from datetime import datetime
import os
from dotenv import load_dotenv
load_dotenv()
VALIDATION_CODE = os.getenv("VALIDATION_CODE")
def submit_feedback(current_index):
"""Handles feedback submission to the database."""
feedback = Feedback(
id=current_index + 1,
user_id=st.session_state.username,
time_stamp=datetime.now().isoformat(),
responses=st.session_state.responses,
)
try:
save_feedback(feedback)
st.session_state.completed = True
st.rerun()
except Exception as e:
st.error(f"An error occurred while submitting feedback: {e}")
def flatten_ratings(response):
all_ratings = []
for model_ratings in response.model_ratings.values():
all_ratings.extend(model_ratings.query_v_ratings.values())
all_ratings.extend(model_ratings.query_p0_ratings.values())
all_ratings.extend(model_ratings.query_p1_ratings.values())
return all_ratings
def navigation_buttons(data, response: Response):
"""Display navigation buttons."""
current_index = st.session_state.current_index
col1, col2, col3, col4 = st.columns([1, 1, 1, 2])
with col1: # Back button #TODO fix: only gets ratings for the session, not from previous session
if st.button("Back", disabled=st.session_state.current_index == 0, help="Go back to the previous question"):
if current_index > 0:
st.session_state.previous_ratings[
data.iloc[st.session_state.current_index]['config_id']] = response.model_ratings
st.session_state.current_index -= 1
st.rerun()
else:
st.warning("You are at the beginning of the survey, can't go back.")
# st.rerun()
with col2: # Next button
if st.button("Next", disabled=current_index == len(data) - 1, help="Proceed to the next question, your current progress will be saved. Click twice if page does not change."):
all_ratings = flatten_ratings(response)
if any(rating == 0 for rating in all_ratings):
st.warning("Please provide all ratings before proceeding.")
elif current_index < len(data) - 1:
# Store the ratings with proper structure
config_id = data.iloc[current_index]['config_id']
if isinstance(response.model_ratings, dict):
st.session_state.previous_ratings[config_id] = {
model: {
'query_v_ratings': ratings.query_v_ratings,
'query_p0_ratings': ratings.query_p0_ratings,
'query_p1_ratings': ratings.query_p1_ratings
}
for model, ratings in response.model_ratings.items()
}
else:
st.session_state.previous_ratings[config_id] = {
model: {
'query_v_ratings': getattr(ratings, 'query_v_ratings', {}),
'query_p0_ratings': getattr(ratings, 'query_p0_ratings', {}),
'query_p1_ratings': getattr(ratings, 'query_p1_ratings', {})
}
for model, ratings in response.model_ratings.items()
}
st.session_state.current_index += 1
# st.rerun()
with col3: # Submit button
if st.button("Submit & Resume Later", help="Submit your evaluations. You can return later to make changes if needed."):
all_ratings = flatten_ratings(response)
if any(rating == 0 for rating in all_ratings):
st.warning("Please provide all ratings before submitting.")
else:
submit_feedback(current_index)
with col4: # Save & Resume Later button
if st.button("Exit & Resume Later", help="Save your progress and exit the page, come back anytime to continue where you left off."):
submit_feedback(current_index)