import streamlit as st import datetime import streamlit_extras as ste import utils def is_valid_new_poll(poll_name): if len(poll_name) < 3: st.error("Poll name must be at least 3 characters") return False poll = utils.find_poll(poll_name) if poll: if poll["expiry"] < datetime.datetime.now(): utils.load_polls().remove(poll) else: st.error(f"Poll {poll_name} already exists") return False return True def is_valid_join_poll(poll_name): poll = utils.find_poll(poll_name) if poll: if poll["expiry"] < datetime.datetime.now(): utils.load_polls().remove(poll) return False else: return True return False def is_valid_admin_password(poll_name, admin_password): poll = utils.find_poll(poll_name) if poll: if poll["admin_password"] == admin_password: return True return False def join_poll(poll_name, admin_password=""): if not is_valid_join_poll(poll_name): st.error(f"Invalid poll name {poll_name}") return if admin_password != "": if is_valid_admin_password(poll_name, admin_password): st.session_state["selected_poll_admin_password"] = admin_password elif "selected_poll_admin_password" in st.session_state: del st.session_state["selected_poll_admin_password"] st.session_state["selected_poll_name"] = poll_name if "poll" not in st.query_params: st.query_params.from_dict({"poll": poll_name}) def new_poll(poll_name, admin_password): if not is_valid_new_poll(poll_name): return if len(admin_password) < 8: st.error("Admin password must be at least 8 characters") return poll = { "name": poll_name, "admin_password": admin_password, "expiry": datetime.datetime.now() + datetime.timedelta(hours=3), "votes": {}, } utils.load_polls().append(poll) join_poll(poll_name, admin_password) def show_polls(): st.write("---") with st.container(border=True): st.header("Poll list:") st.button("Reload Polls", use_container_width=True) polls = utils.load_polls() if len(polls) == 0: st.write("No polls found. You can have a better name!") return table = st.columns(3) with table[0]: st.subheader("Name") with table[1]: st.subheader("Expire in") with table[2]: st.subheader("Join Button") for poll in polls: if not is_valid_join_poll(poll["name"]): continue table = st.columns(3) with table[0]: st.write(poll["name"]) with table[1]: expire_in = poll["expiry"] - datetime.datetime.now() formatted_time = '{:02}:{:02}'.format(expire_in.seconds // 3600, (expire_in.seconds // 60) % 60) st.text(formatted_time) with table[2]: st.button( f"Join {poll['name']}", on_click=join_poll, args=(poll["name"],), use_container_width=True, ) def show_join_poll(column): with column: with st.container(border=True): poll_name = st.text_input("Join Poll") poll_admin_password = "" if st.checkbox("Login as Admin", value=False): poll_admin_password = st.text_input( "Admin Password", type="password", key="join_admin_password" ) st.button( "Join Poll", type="primary", key="btn_join", use_container_width=True, on_click=join_poll, args=(poll_name, poll_admin_password), ) def show_new_poll(column): with column: with st.container(border=True): poll_name = st.text_input("Poll Name") poll_admin_password = st.text_input("Admin Password", type="password") st.button( "New Poll", type="secondary", key="btn_new", use_container_width=True, on_click=new_poll, args=(poll_name, poll_admin_password), ) def load(): st.title("Audience Engagement Poll") st.write("Best way to measure how your audience is doing.") columns = st.columns(2, gap="large") show_new_poll(columns[0]) show_join_poll(columns[1]) show_polls()