user-feedback / views /questions_screen.py
Ashmi Banerjee
updated with resuming surveys:
0759822
raw
history blame
6.03 kB
import json
from typing import Dict
from db.schema import Feedback, Response
import streamlit as st
from datetime import datetime
import os
from dotenv import load_dotenv
from views.nav_buttons import navigation_buttons
load_dotenv()
VALIDATION_CODE = os.getenv("VALIDATION_CODE")
def survey_completed():
"""Display the survey completion message."""
st.markdown("""
<div class='exit-container'>
<h1>You have already completed the survey! Thank you for participating!</h1>
<p>Your responses have been saved successfully.</p>
<p>You can safely close this window or start a new survey.</p>
</div>
""", unsafe_allow_html=True)
st.session_state.show_questions = False
st.session_state.completed = True
st.session_state.start_new_survey = True
# st.rerun()
def questions_screen(data):
# TODO: refactor to avoid code duplication
"""Display the questions screen with split layout"""
current_index = st.session_state.current_index
try:
config = data.iloc[current_index]
# Progress bar
progress = (current_index + 1) / len(data)
st.progress(progress)
st.write(f"Question {current_index + 1} of {len(data)}")
st.subheader(f"Config ID: {config['config_id']}")
# Context information
st.markdown("### Context Information")
with st.expander("Persona", expanded=True):
st.write(config['persona'])
with st.expander("Filters & Cities", expanded=True):
st.write("**Filters:**", config['filters'])
st.write("**Cities:**", config['city'])
with st.expander("Full Context", expanded=False):
st.write(config['context'])
# Split layout for questions and ratings
col11, col12, col13, col14 = st.columns([1, 1, 1, 1]) # Sub-columns for query ratings
options = [0, 1, 2, 3, 4, 5]
# Query_v and its ratings
st.markdown("### Query_v")
st.write(config['query_v'])
col_v_1, col_v_2, col_v_3 = st.columns(3)
with col_v_1:
clarity_rating = st.radio("Clarity:", options, key=f"rating_v_clarity_{current_index}")
with col_v_2:
relevance_rating = st.radio("Relevance:", options, key=f"rating_v_relevance_{current_index}")
with col_v_3:
coverage_rating = st.radio("Coverage:", options, key=f"rating_v_coverage_{current_index}")
query_v_ratings = {
"clarity": clarity_rating,
"relevance": relevance_rating,
"coverage": coverage_rating,
}
# Query_p0 and its ratings
st.markdown("### Query_p0")
st.write(config['query_p0'])
col_p0_1, col_p0_2, col_p0_3, col_p0_4 = st.columns(4)
with col_p0_1:
clarity_rating = st.radio("Clarity:", options, key=f"rating_p0_clarity_{current_index}")
with col_p0_2:
relevance_rating = st.radio("Relevance:", options, key=f"rating_p0_relevance_{current_index}")
with col_p0_3:
coverage_rating = st.radio("Coverage:", options, key=f"rating_p0_coverage_{current_index}")
with col_p0_4:
persona_alignment_rating = st.radio(
"Persona Alignment:", options=[0, 1, 2, 3, 4], # These are the values
format_func=lambda x: ["N/A", "Not Aligned", "Partially Aligned", "Aligned", "Unclear"][x],
key=f"rating_p0_persona_alignment_{current_index}"
)
# Collecting the ratings for query_p0
query_p0_ratings = {
"clarity": clarity_rating,
"relevance": relevance_rating,
"coverage": coverage_rating,
"persona_alignment": persona_alignment_rating
}
# Query_p1 and its ratings
st.markdown("### Query_p1")
st.write(config['query_p1'])
# Split the layout into 4 columns for query_p1 ratings
col_p1_1, col_p1_2, col_p1_3, col_p1_4 = st.columns(4)
with col_p1_1:
clarity_rating_p1 = st.radio("Clarity:", options, key=f"rating_p1_clarity_{current_index}")
with col_p1_2:
relevance_rating_p1 = st.radio("Relevance:", options, key=f"rating_p1_relevance_{current_index}")
with col_p1_3:
coverage_rating_p1 = st.radio("Coverage:", options, key=f"rating_p1_coverage_{current_index}")
with col_p1_4:
persona_alignment_rating_p1 = st.radio(
"Persona Alignment:", options=[0, 1, 2, 3, 4], # These are the values
format_func=lambda x: ["N/A", "Not Aligned", "Partially Aligned", "Aligned", "Unclear"][x],
key=f"rating_p1_persona_alignment_{current_index}"
)
# Collecting the ratings for query_p1
query_p1_ratings = {
"clarity": clarity_rating_p1,
"relevance": relevance_rating_p1,
"coverage": coverage_rating_p1,
"persona_alignment": persona_alignment_rating_p1
}
# Additional comments
comment = st.text_area("Additional Comments (Optional):")
# Collecting the response data
response = Response(
config_id=config["config_id"],
query_v=query_v_ratings, # Use the ratings dictionary for query_v
query_p0=query_p0_ratings, # Use the ratings dictionary for query_p0
query_p1=query_p1_ratings, # Use the ratings dictionary for query_p1
comment=comment,
timestamp=datetime.now().isoformat()
)
if len(st.session_state.responses) > current_index:
st.session_state.responses[current_index] = response
else:
st.session_state.responses.append(response)
# Navigation buttons
navigation_buttons(data, query_v_ratings["clarity"], query_p0_ratings["clarity"], query_p1_ratings["clarity"])
except IndexError:
print("Survey completed!")
# st.stop()