File size: 3,787 Bytes
5a94297
01b734e
f128fe5
5a94297
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40fa5b9
5a94297
40fa5b9
5a94297
40fa5b9
f128fe5
40fa5b9
 
f128fe5
5a94297
f128fe5
 
 
40fa5b9
f128fe5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
01b734e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f128fe5
 
01b734e
f128fe5
 
01b734e
f128fe5
 
 
 
 
 
 
 
 
01b734e
 
 
 
 
 
 
 
f128fe5
 
 
 
 
 
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
import streamlit as st
from streamlit_gsheets import GSheetsConnection
import hmac

# Standard imports
import numpy as np
import pandas as pd
from datetime import datetime
import os
import random

# Import torch
import torch

# Data visualization
import matplotlib.pyplot as plt
import seaborn as sns

# Path manipulation
from pathlib import Path
import sys

# Custom and other imports
import project_config
from utils import add_logo
from menu import menu

# Insert logo
# add_logo(project_config.MEDIA_DIR / 'gravity_logo.png')

# Initialize st.session_state.role to None
if "role" not in st.session_state:
    st.session_state.role = None

# # Retrieve the role from Session State to initialize the widget
# st.session_state._role = st.session_state.role

# def set_role():
#     # Callback function to save the role selection to Session State
#     st.session_state.role = st.session_state._role

def check_password():
    """Returns `True` if the user had a correct password."""

    def login_form():
        """Form with widgets to collect user information"""
        with st.form("Credentials"):
            st.text_input("Username", key="username")
            st.text_input("Password", type="password", key="password")
            st.form_submit_button("Log In", on_click=password_entered)

    def password_entered():
        """Checks whether a password entered by the user is correct."""
        
        # Create a connection object to Google Sheets
        conn = st.connection("gsheets", type=GSheetsConnection)

        # Read the user database
        user_db = conn.read()
        user_db.dropna(axis=0, how="all", inplace=True)
        user_db.dropna(axis=1, how="all", inplace=True)

        # Check if the username is in the database
        if st.session_state["username"] in user_db.username.values:

            st.session_state["username_correct"] = True

            # Check if the password is correct
            if hmac.compare_digest(
                st.session_state["password"],
                user_db.loc[user_db.username == st.session_state["username"], "password"].values[0],
            ):
                
                st.session_state["password_correct"] = True
                
                # Check if the username is an admin
                if st.session_state["username"] in user_db[user_db.role == "admin"].username.values:
                    st.session_state["role"] = "admin"
                else:
                    st.session_state["role"] = "user"

                # Retrieve and store user name and team
                st.session_state["name"] = user_db.loc[user_db.username == st.session_state["username"], "name"].values[0]
                st.session_state["team"] = user_db.loc[user_db.username == st.session_state["username"], "team"].values[0]

                # Don't store the username or password
                del st.session_state["password"]
                # del st.session_state["username"]

            else:
                st.session_state["password_correct"] = False

        else:
            st.session_state["username_correct"] = False
            st.session_state["password_correct"] = False

    # Return True if the username + password is validated
    if st.session_state.get("password_correct", False):
        return True

    # Show inputs for username + password
    login_form()
    if "password_correct" in st.session_state:

        if not st.session_state["username_correct"]:
            st.error("User not found.")
        elif not st.session_state["password_correct"]:
            st.error("The password you entered is incorrect.")
        else:
            st.error("An unexpected error occurred.")

    return False

menu() # Render the dynamic menu!

if not check_password():
    st.stop()