rafatjah's picture
Improve expiry
23fee40
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()