File size: 6,962 Bytes
6bbbe77
 
 
5f7ff4f
cb21807
472305f
 
c852af8
cb21807
6e435cb
472305f
cb21807
c852af8
cb21807
6bbbe77
63c00d6
 
 
 
 
 
 
 
 
 
6e435cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5f7ff4f
cb21807
5f7ff4f
 
c852af8
cb21807
 
 
c852af8
cb21807
 
 
5f7ff4f
 
cb21807
5f7ff4f
 
cb21807
 
 
 
 
 
c852af8
 
5f7ff4f
6e435cb
6bbbe77
6e435cb
5f7ff4f
6e435cb
6bbbe77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6e435cb
6bbbe77
 
 
 
 
 
 
 
 
 
 
 
6e435cb
6bbbe77
 
 
 
 
 
 
 
 
 
 
6e435cb
6bbbe77
 
 
 
 
 
 
 
 
 
6e435cb
472305f
5f7ff4f
6e435cb
 
 
 
 
5f7ff4f
6bbbe77
 
6e435cb
6bbbe77
 
 
6e435cb
6bbbe77
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import streamlit as st
import pandas as pd
from datetime import datetime
import os
from huggingface_hub import HfApi, upload_file, list_repo_files, hf_hub_download

# Configuration for Hugging Face Repository
REPO_ID = "MarcosRodrigo/Breakfast-Poll"  # Use the correct format: namespace/repo_name
HISTORY_DIR = "history"  # Directory within the repository to store history
TEMP_FILE = "current_selections.csv"  # Temporary file to store current selections

# Hugging Face API (requires a token with write access)
hf_token = st.secrets["HF_TOKEN"]  # Use the token stored in the secrets manager
api = HfApi()

# Initialize all required session state variables
if "users" not in st.session_state:
    st.session_state.users = []  # List to hold users
if "current_selections" not in st.session_state:
    st.session_state.current_selections = []  # List to hold current selections
if "step" not in st.session_state:
    st.session_state.step = 1  # Step for navigation
if "history" not in st.session_state:
    st.session_state.history = []  # List to hold history data

# Load temporary selections from the shared file
def load_current_selections():
    if os.path.exists(TEMP_FILE):
        return pd.read_csv(TEMP_FILE)
    else:
        return pd.DataFrame(columns=["Name", "Drinks", "Food"])

# Save current user selections to the shared CSV file
def save_current_selection_to_file(current_selections):
    current_selections.to_csv(TEMP_FILE, index=False)

# Upload the shared file to Hugging Face repository for persistence
def upload_temp_file_to_repo():
    if os.path.exists(TEMP_FILE):
        upload_file(
            path_or_fileobj=TEMP_FILE,
            path_in_repo=TEMP_FILE,
            repo_id=REPO_ID,
            token=hf_token,
            repo_type="space"
        )

# Download the shared file from the repository to ensure persistence
def download_temp_file_from_repo():
    try:
        hf_hub_download(repo_id=REPO_ID, filename=TEMP_FILE, repo_type="space", token=hf_token)
    except Exception:
        # If the file does not exist in the repo, create an empty file
        pd.DataFrame(columns=["Name", "Drinks", "Food"]).to_csv(TEMP_FILE, index=False)

# Load history from the repository
def load_history():
    history = []
    files_in_repo = list_repo_files(REPO_ID, token=hf_token, repo_type="space")
    history_files = [f for f in files_in_repo if f.startswith(f"{HISTORY_DIR}/") and f.endswith(".txt")]

    for file in history_files:
        local_filepath = hf_hub_download(repo_id=REPO_ID, filename=file, token=hf_token, repo_type="space")
        summary_df = pd.read_csv(local_filepath)
        date = file.split("/")[-1].split(".txt")[0]
        history.append({"Date": date, "Summary": summary_df})
    return history

# Save the current summary to a text file and upload to the repository
def save_summary_to_file(summary_df):
    timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    filename = f"{HISTORY_DIR}/{timestamp}.txt"
    
    # Save the DataFrame to a local CSV file
    local_filepath = f"{timestamp}.txt"
    summary_df.to_csv(local_filepath, index=False)

    # Upload the file to the Space repository with `repo_type="space"`
    upload_file(path_or_fileobj=local_filepath, path_in_repo=filename, repo_id=REPO_ID, token=hf_token, repo_type="space")

# Load persistent history and temporary selections on app start
if "history" not in st.session_state:
    download_temp_file_from_repo()  # Ensure the latest temp file is present
    st.session_state.history = load_history()
    st.session_state.current_selections = load_current_selections().to_dict(orient="records")

# Sidebar for navigating through different views
menu = st.sidebar.selectbox("Select View", ["Poll", "History"])

# Function to reset the current selections after submission
def reset_selections():
    st.session_state.users = []
    st.session_state.current_selections = []

# Poll view with four consecutive steps
if menu == "Poll":
    st.title("Breakfast Poll Application")

    # Step 1: User's Name
    if "step" not in st.session_state:
        st.session_state.step = 1

    if st.session_state.step == 1:
        st.header("Step 1: Enter your name")
        name = st.text_input("Name:")
        if st.button("Next", key="step1_next") and name:
            st.session_state.users.append(name)
            st.session_state.step = 2

    # Step 2: Select Drinks
    if st.session_state.step == 2:
        st.header("Step 2: Select your drink(s)")
        drinks_options = [
            "Café con leche", "Colacao", "Descafeinado con leche", "Cortado", 
            "Aguasusia", "Aguasusia susia", "Café descafeinado con leche desnatada", 
            "Italiano", "Café con soja", "Té", "Manzanilla", "Nada"
        ]
        selected_drinks = st.multiselect("Choose your drinks:", drinks_options)
        if st.button("Next", key="step2_next") and selected_drinks:
            st.session_state.current_selections.append({"Name": st.session_state.users[-1], "Drinks": selected_drinks})
            st.session_state.step = 3

    # Step 3: Select Food
    if st.session_state.step == 3:
        st.header("Step 3: Select your food(s)")
        food_options = [
            "Barrita con aceite", "Barrita con tomate", "Palmera de chocolate", 
            "Palmera de chocolate blanco", "Yogurt", "Pincho de tortilla", "Nada"
        ]
        selected_food = st.multiselect("Choose your food:", food_options)
        if st.button("Next", key="step3_next") and selected_food:
            st.session_state.current_selections[-1]["Food"] = selected_food
            st.session_state.step = 4

    # Step 4: Display Summary
    if st.session_state.step == 4:
        st.header("Step 4: Summary of Selections")
        if st.session_state.current_selections:
            df = pd.DataFrame(st.session_state.current_selections)
            st.table(df)

            if st.button("Submit Summary", key="submit_summary"):
                # Save the current summary to a text file in the repository
                save_summary_to_file(df)

                # Save and upload current selections for real-time updates
                save_current_selection_to_file(df)
                upload_temp_file_to_repo()

                # Add to session state history
                timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                st.session_state.history.append({"Date": timestamp, "Summary": df})

                st.success(f"Summary submitted at {timestamp}")
                reset_selections()
                st.session_state.step = 1
                st.experimental_rerun()

# History view to check past summaries
elif menu == "History":
    st.title("Breakfast Poll History")
    if st.session_state.history:
        for record in st.session_state.history:
            st.subheader(f"Date: {record['Date']}")
            st.table(record["Summary"])
    else:
        st.write("No history records found.")