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")