Spaces:
Sleeping
Sleeping
import sqlite3 | |
import uuid | |
import json | |
import streamlit as st | |
from utilities import ( | |
load_local_css, | |
set_header, | |
load_authenticator, | |
send_email, | |
) | |
import streamlit_authenticator as stauth | |
import yaml | |
from yaml import SafeLoader | |
import os | |
import datetime | |
import subprocess | |
import shutil | |
import pandas as pd | |
from st_aggrid import AgGrid | |
from st_aggrid import GridOptionsBuilder, GridUpdateMode | |
import pickle | |
from pathlib import Path | |
st.set_page_config(layout="wide") | |
load_local_css("styles.css") | |
set_header() | |
# def authenticator(): | |
for k, v in st.session_state.items(): | |
if k not in ["logout", "login", "config"] and not k.startswith( | |
"FormSubmitter" | |
): | |
st.session_state[k] = v | |
with open("config.yaml") as file: | |
config = yaml.load(file, Loader=SafeLoader) | |
st.session_state["config"] = config | |
authenticator = stauth.Authenticate( | |
config["credentials"], | |
config["cookie"]["name"], | |
config["cookie"]["key"], | |
config["cookie"]["expiry_days"], | |
config["preauthorized"], | |
) | |
st.session_state["authenticator"] = authenticator | |
name, authentication_status, username = authenticator.login("Login", "main") | |
auth_status = st.session_state.get("authentication_status") | |
if auth_status == True: | |
authenticator.logout("Logout", "main") | |
is_state_initiaized = st.session_state.get("initialized", False) | |
if not is_state_initiaized: | |
if "session_name" not in st.session_state: | |
st.session_state["session_name"] = None | |
cols1 = st.columns([2, 1]) | |
with cols1[0]: | |
st.markdown(f"**Welcome {name}**") | |
with cols1[1]: | |
st.markdown( | |
f"**Current Session: {st.session_state['session_name']}**" | |
) | |
# relative_path = Path('DB_Sample','..' ,'DB', 'User.db') | |
# absolute_path = Path.cwd() / relative_path | |
# st.write(absolute_path) | |
# database_file=Path(__file__).parent / relative_path | |
database_file = r"C:\Users\ManojP\Documents\Mastercard\Build\DB_Sample\V6_persistant_data_home_page_connected_pages\DB\User.db" | |
conn = sqlite3.connect(database_file) # connection with sql db | |
c = conn.cursor() | |
c.execute("SELECT * from sessions") | |
st.write(c.fetchall()) | |
# c.executemany("INSERT INTO users (username, email) VALUES (?, ?)", | |
# [("Geetha Krishna", "geetha1732@gmail.com"), | |
# ("Samkeet Sangai", "samkeet.sangai@blend360.com"), | |
# ('Manoj P','manojp1732@gmail.com'), | |
# ('Srishti Verma','srishti.verma@blend360.com'), | |
# ('Ismail mohammed',"mohammed.ismail@blend360.com"), | |
# ('Sharon Sheng','sharon.sheng@mastercard.com'), | |
# ('Ioannis Papadopoulos','ioannis.papadopoulos@mastercard.com'), | |
# ('Herman Kwong',"herman.kwong@mastercard.com") | |
# ]) | |
# conn.commit() | |
# c.execute("DELETE from sessions") | |
# conn.commit() | |
# st.write(c.fetchall()) | |
page_name = "Home Page" | |
c.execute( | |
"SELECT email, user_id, user_type FROM users WHERE username = ?", | |
(name,), | |
) | |
user_data = c.fetchone() | |
email, user_id, user_type = user_data | |
# st.write(user_type) | |
# with st.sidebar: | |
# # if user_type != 'technical': | |
# st.page_link("home.py", label="Home123") | |
# st.page_link('pages/1_Data_Import.py',label='Data Import') | |
# st.page_link('pages/2_Data_Validation.py',label="Data Validation") | |
# st.page_link('pages/3_Transformations.py',label='Transformations') | |
# st.page_link("pages/4_Model_Build.py") | |
# st.page_link('pages/5_Model_Tuning_with_panel.py',label='Model Tuning') | |
# st.page_link('pages/5_Saved_Model_Results.py',label="Saved Model Results") | |
# st.write(pd.to_datetime(created_time)) | |
# c.execute("DELETE FROM sessions") | |
# c.execute('select * from sessions') | |
# conn.commit() | |
# output = c.fetchall() | |
# st.write(output) | |
# if emails is not None: | |
# email = emails[0] | |
folder_path = r"C:\Users\ManojP\Documents\Mastercard\Build\DB_Sample\V6_persistant_data_home_page_connected_pages\Users" | |
user_folder_path = os.path.join(folder_path, email) | |
# project_dct = { | |
# 'data_import': { | |
# "granularity_selection":0, | |
# 'cat_dct':{}, | |
# "merged_df":None, | |
# 'edited_df':None, | |
# "numeric_columns":None, | |
# "files_dict":None, | |
# 'formatted_panel1_values':None, | |
# 'formatted_panel2_values':None, | |
# "missing_stats_df":None, | |
# 'edited_stats_df':None | |
# }, | |
# 'data_validation': {"target_column":0, | |
# 'selected_panels':None, | |
# "selected_feature":0, | |
# "validated_variables":[], | |
# "Non_media_variables":0 | |
# }, | |
# 'transformations': {}, | |
# 'model_build': {}, | |
# 'model_tuning':{}, | |
# 'saved_model_results': {}, | |
# 'model_result_overview': {}, | |
# 'build_response_curves': {}, | |
# 'scenario_planner': {}, | |
# 'saved_scenarios': {}, | |
# 'optimized_result_analysis': {} | |
# } | |
# st.session_state['project_dct']=project_dct | |
# st.write(project_dct) | |
def dump_session_details_db(allowed_users, session_name): | |
created_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") | |
session_id = str(uuid.uuid4()) | |
if len(allowed_users) == 0: | |
c.execute( | |
"INSERT INTO sessions VALUES (?, ?, ?, ?, ?, ?, ?,?)", | |
( | |
user_id, | |
name, | |
session_id, | |
session_name, | |
page_name, | |
created_time, | |
created_time, | |
None, | |
), | |
) | |
conn.commit() | |
else: | |
for allowed_user in allowed_users: | |
c.execute( | |
"INSERT INTO sessions VALUES (?, ?, ?, ?, ?, ?, ?,?)", | |
( | |
user_id, | |
name, | |
session_id, | |
session_name, | |
page_name, | |
created_time, | |
created_time, | |
allowed_user, | |
), | |
) | |
conn.commit() | |
# st.success('Project created') | |
if "session_path" not in st.session_state: | |
st.session_state["session_path"] = None | |
# creating dir for user | |
if not os.path.exists(user_folder_path): | |
os.makedirs(user_folder_path) | |
c.execute("SELECT DISTINCT username FROM users ") | |
allowed_users_db = [user[0] for user in c.fetchall() if user[0] != name] | |
c.execute( | |
"SELECT session_name from sessions WHERE allowed_users = ?", (name,) | |
) | |
available_sessions = c.fetchall() # all sessions available for user | |
c.execute( | |
"SELECT Distinct Session_name, status, updated_time as last_updated FROM sessions WHERE owner=?", | |
(name,), | |
) | |
session_summary = c.fetchall() | |
session_summary_df = pd.DataFrame( | |
session_summary, | |
columns=["Project Name", "Last Page Edited", "Modified Date"], | |
) | |
session_summary_df["Modified Date"] = session_summary_df[ | |
"Modified Date" | |
].map(lambda x: pd.to_datetime(x)) | |
session_summary_df = session_summary_df.sort_values( | |
by=["Modified Date"], ascending=False | |
) | |
st.header("Manage Projects") | |
st.markdown( | |
""" | |
* **Load Existing Project:** Select the project you want and click 'Load Project'. | |
* **Delete Project:** If you wish to delete a project, select it and click 'Delete Project'. | |
* **Modify User Access:** Make changes to user access permissions as needed. | |
""" | |
) | |
# session_col=st.columns([5,5]) | |
# with session_col[0]: | |
gd = GridOptionsBuilder.from_dataframe(session_summary_df) | |
gd.configure_pagination( | |
enabled=True, paginationAutoPageSize=False, paginationPageSize=10 | |
) | |
gd.configure_selection(use_checkbox=True) | |
gridoptions = gd.build() | |
if session_summary_df.shape[0] < 5: | |
height = (session_summary_df.shape[0]) * 20 + 100 | |
else: | |
height = None | |
table = AgGrid( | |
session_summary_df, | |
gridOptions=gridoptions, | |
update_mode=GridUpdateMode.SELECTION_CHANGED, | |
height=height, | |
fit_columns_on_grid_load=True, | |
) | |
if len(table.selected_rows) > 0: | |
selected_rows = table.selected_rows | |
project_name = selected_rows[0]["Project Name"] | |
project_col = st.columns(2) | |
with project_col[0]: | |
project_path = os.path.join(user_folder_path, project_name) | |
st.session_state["project_path"] = project_path # load project dct | |
project_dct_path = os.path.join(project_path, "project_dct.pkl") | |
with open(project_dct_path, "rb") as f: | |
st.session_state["project_dct"] = pickle.load(f) | |
# st.write(st.session_state['project_dct']) | |
with st.spinner("Redirecting to last Saved Page"): | |
page_link = st.page_link( | |
"pages/1_Data_Import.py", | |
label=f"Load Project - **{project_name}**", | |
) | |
with project_col[1]: | |
if st.button( | |
f"Delete Project - **{selected_rows[0]['Project Name']}**" | |
): | |
project_name_to_delete = selected_rows[0]["Project Name"] | |
st.warning( | |
f"{project_name_to_delete} will be deleted permanentaly and all the information regarding the project will be lost" | |
) | |
with st.expander("Modify user access for selected project"): | |
c.execute( | |
"SELECT DISTINCT allowed_users FROM sessions WHERE session_name = ?", | |
(project_name,), | |
) | |
present_users = c.fetchall() | |
present_users = [ | |
user[0] | |
for user in present_users | |
if user[0] != name and user[0] is not None | |
] | |
present_users = None if len(present_users) == 0 else present_users | |
allowed_users = st.multiselect( | |
"Modify other users access", | |
allowed_users_db, | |
default=present_users, | |
) | |
if st.button("Save Changes", use_container_width=True): | |
pass | |
c.execute("SELECT Session_name FROM sessions WHERE owner=?", (name,)) | |
user_projects = [ | |
project[0] for project in c.fetchall() | |
] # user owned sessions | |
with st.expander("Create New Project"): | |
st.markdown( | |
"To create a new project, Enter Project name below, select user who you want to give access of this project and click **Create New Project**" | |
) | |
project_col1 = st.columns(2) | |
with project_col1[0]: | |
project_name = st.text_input("Enter Project Name") | |
if project_name in user_projects: | |
st.warning("Project already exists please enter new name") | |
with project_col1[1]: | |
allowed_users = st.multiselect( | |
"Select Users who can access to this Project", allowed_users_db | |
) | |
allowed_users = list(allowed_users) | |
Create = st.button("Create New Project", use_container_width=True) | |
# st.button("Label", use_container_width=True) | |
if Create: | |
allowed_users.append(name) | |
if project_name in user_projects: | |
st.warning("Project already exists please enter new name") | |
st.stop() | |
project_path = os.path.join(user_folder_path, project_name) | |
os.makedirs(project_path) | |
dump_session_details_db(allowed_users, project_name) | |
project_dct = { | |
"data_import": { | |
"granularity_selection": 0, | |
"cat_dct": {}, | |
"merged_df": None, | |
"edited_df": None, | |
"numeric_columns": None, | |
"files_dict": None, | |
"formatted_panel1_values": None, | |
"formatted_panel2_values": None, | |
"missing_stats_df": None, | |
"edited_stats_df": None, | |
}, | |
"data_validation": { | |
"target_column": 0, | |
"selected_panels": None, | |
"selected_feature": 0, | |
"validated_variables": [], | |
"Non_media_variables": 0, | |
}, | |
"transformations": {"Media": {}, "Exogenous": {}}, | |
"model_build": { | |
"sel_target_col": None, | |
"all_iters_check": False, | |
"iterations": 0, | |
"build_button": False, | |
"show_results_check": False, | |
"session_state_saved": {}, | |
}, | |
"model_tuning": { | |
"sel_target_col": None, | |
"sel_model": {}, | |
"flag_expander": False, | |
"start_date_default": None, | |
"end_date_default": None, | |
"repeat_default": "No", | |
"flags": None, | |
"select_all_flags_check": {}, | |
"selected_flags": {}, | |
"trend_check": False, | |
"week_num_check": False, | |
"sine_cosine_check": False, | |
"session_state_saved": {}, | |
}, | |
"saved_model_results": { | |
"selected_options": None, | |
"model_grid_sel": [1], | |
}, | |
"model_result_overview": {}, | |
"build_response_curves": {}, | |
"scenario_planner": {}, | |
"saved_scenarios": {}, | |
"optimized_result_analysis": {}, | |
} | |
st.session_state["project_dct"] = project_dct | |
st.session_state["project_path"] = project_path | |
project_dct_path = os.path.join(project_path, "project_dct.pkl") | |
st.session_state["session_path"] = project_path | |
with open(project_dct_path, "wb") as f: | |
pickle.dump(project_dct, f) | |
st.success("Project Created") | |
# st.header('Clone Project') | |
with st.expander("**Clone saved projects**"): | |
c.execute( | |
"SELECT DISTINCT owner FROM sessions WHERE allowed_users=?", | |
(name,), | |
) # owner | |
owners = c.fetchall() | |
owners = [owner[0] for owner in owners] | |
if len(owners) == 0: | |
st.warning("You dont have any shared project yet!") | |
st.stop() | |
cols = st.columns(2) | |
with cols[0]: | |
owner = st.selectbox("Select Owner", owners) | |
c.execute("SELECT email FROM users WHERE username=?", (owner,)) | |
owner_email = c.fetchone()[0] | |
owner_folder_path = os.path.join(folder_path, owner_email) | |
with cols[1]: | |
c.execute( | |
"SELECT session_name FROM sessions WHERE owner=? AND allowed_users = ?", | |
(owner, name), | |
) # available sessions for user | |
project_names = c.fetchall() | |
project_name_owner = st.selectbox( | |
"Select a saved Project available for you", | |
[project_name[0] for project_name in project_names], | |
) | |
owner_project_path = os.path.join(owner_folder_path, project_name) | |
with cols[0]: | |
project_name_user = st.text_input( | |
"Enter Project Name", value=project_name_owner | |
) | |
if project_name in user_projects: | |
st.warning( | |
"This Project name already exists in your directory Please enter a different name" | |
) | |
# st.stop() | |
project_path = os.path.join(user_folder_path, project_name_user) | |
owner_project_path = os.path.join( | |
owner_folder_path, project_name_owner | |
) | |
with cols[1]: | |
allowed_users = st.multiselect( | |
"Select Users who can access this session", allowed_users_db | |
) | |
allowed_users = list(allowed_users) | |
if st.button("Load Project", use_container_width=True): | |
if os.path.exists(project_path): | |
st.warning( | |
"This Project name already exists in your directory Please enter a different name" | |
) | |
st.stop() | |
shutil.copytree(owner_project_path, project_path) | |
project_dct_path = os.path.join(project_path, "project_dct.pkl") | |
with open(project_dct_path, "rb") as f: | |
st.session_state["project_dct"] = pickle.load(f) | |
st.session_state["session_path"] = project_path | |
st.session_state["project_path"] = project_path | |
# st.write(st.session_state['project_dct']) | |
dump_session_details_db(allowed_users, project_name_user) | |
st.success("Project Cloned") | |