Spaces:
Sleeping
Sleeping
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() | |