import utils import streamlit as st import plotly.express as px import pandas as pd import time def exit_poll(): set_votes([]) st.query_params.pop("poll") del st.session_state["selected_poll_name"] if "selected_poll_admin_password" in st.session_state: del st.session_state["selected_poll_admin_password"] def set_votes(votes=[]): poll = utils.find_poll(st.session_state["selected_poll_name"]) if poll is None: on_poll_not_exists() return uuid = st.session_state["UUID"] if votes == []: if uuid in poll["votes"]: del poll["votes"][uuid] else: poll["votes"][uuid] = votes def vote(): votes = st.session_state.get("vote_selected", []) set_votes(votes) def load_voting(): poll = utils.find_poll(st.session_state["selected_poll_name"]) if poll is None: on_poll_not_exists() return current_votes = poll["votes"].get(st.session_state["UUID"], []) st.multiselect( "How do you feel?", utils.get_options(), current_votes, on_change=vote, key="vote_selected", ) def is_admin(): password = st.session_state.get("selected_poll_admin_password", "") poll = utils.find_poll(st.session_state["selected_poll_name"]) if poll is None: return False return poll["admin_password"] == password def on_poll_not_exists(): st.error(f"Poll {st.session_state['selected_poll_name']} does not exist") st.query_params.pop("poll") del st.session_state["selected_poll_name"] if "selected_poll_admin_password" in st.session_state: del st.session_state["selected_poll_admin_password"] def clear_votes_section(): poll = utils.find_poll(st.session_state["selected_poll_name"]) if poll is None: on_poll_not_exists() return poll["votes"] = {} def delete_poll(): utils.load_polls().remove(utils.find_poll(st.session_state["selected_poll_name"])) st.query_params.pop("poll") del st.session_state["selected_poll_name"] def load_votes(): selected_poll_name = st.session_state["selected_poll_name"] poll = utils.find_poll(selected_poll_name) if poll is None: on_poll_not_exists() return votes = {x: 0 for x in utils.get_options()} votes_count = 0 users_count = 0 for _, user_votes in poll["votes"].items(): users_count += 1 for vote in user_votes: votes_count += 1 if vote in votes: votes[vote] += 1 else: votes[vote] = 1 df = pd.DataFrame(list(votes.items()), columns=["Status", "Count"]) if df["Count"].sum() == 0: st.warning("No votes yet!") else: st.success(f"Users:{users_count} | Votes:{votes_count}") fig = px.pie( df, values="Count", names="Status", title="Audience Feedback", ) st.plotly_chart(fig) st.write(df) st.button("Clear Votes", on_click=clear_votes_section, use_container_width=True) st.button("Delete Poll", on_click=delete_poll, use_container_width=True) def show_qrcode(): selected_poll_name = st.session_state["selected_poll_name"] columns = st.columns(5) with columns[2]: st.image(utils.generate_qr_code_image_link(selected_poll_name)) def dummy_refresh(): selected_poll_name = st.session_state["selected_poll_name"] poll = utils.find_poll(selected_poll_name) if poll is None: on_poll_not_exists() return def load(): dummy_refresh() selected_poll_name = st.session_state["selected_poll_name"] st.write("") columns = st.columns(3) with columns[0]: st.button("Exit", on_click=exit_poll, use_container_width=True) with columns[1]: st.button("Refresh", use_container_width=True, on_click=dummy_refresh) with columns[2]: st.link_button( "Link To Poll", "?poll=" + selected_poll_name, type="primary", use_container_width=True, ) st.title(selected_poll_name) if not is_admin(): load_voting() else: load_votes() show_qrcode()