import pandas as pd import gradio as gr ADMIN_USERNAME = "admin" ADMIN_PASSWORD = "adminpassword" def is_data_exist(): if "sheets" in globals(): return True else: return False # Function to handle file upload by the admin def update_data(excel_file): global sheets sheets = pd.read_excel(excel_file, sheet_name=None) # Read the uploaded file if ("timesheet_all" not in sheets) | ("employee_authentication" not in sheets): raise gr.Error( "the excel file must contain the following sheets ['timesheet_all', 'employee_authentication']" ) else: gr.Info(f"Data updated successfully") # Function to display a list of usernames def list_usernames(): if is_data_exist(): if isinstance(sheets, dict) and "employee_authentication" in sheets: data = sheets["employee_authentication"] usernames = data["ชื่อ-สกุลพนักงาน"].unique() # Display usernames in an HTML table for easy copying html_content = "

Available Usernames:

" return html_content else: return "No data available. Please wait for the admin to upload data." else: return "No data available. Please wait for the admin to upload data." def authenticate(input_username, input_password): if is_data_exist(): auth_data = sheets["employee_authentication"] if input_username not in set(auth_data["ชื่อ-สกุลพนักงาน"]): raise gr.Warning( "Can not find the specified employee name in the authenticate data" ) true_password = auth_data.loc[ auth_data["ชื่อ-สกุลพนักงาน"] == input_username, "password" ].values[0] return str(true_password) == str(input_password) # Simplified for this example def show_employee_data(username, password): if is_data_exist(): data = sheets["timesheet_all"] if authenticate(username, password): if not data.empty: # Filter data for the logged-in user employee_data = data[data["ชื่อ-สกุลพนักงาน"] == username] if not employee_data.empty: return employee_data else: raise gr.Error("No data found for this user.") else: raise gr.Error("No data uploaded by admin.") else: gr.Warning("Invalid username or password.") # Function to clear input fields (resets them to empty) def clear_fields(): return "", "" # Returns empty strings to reset username and password fields def clear_data(): if "sheets" in globals(): del globals()["sheets"] gr.Info("Now the data is cleared") else: gr.Warning("No data to clear") ########3 building app ############## # Create the Gradio interface with gr.Blocks() as demo: # create admin tab with gr.Tab("Admin Interface"): with gr.Group(): gr.Markdown("### Admin Login") login_inputs = [gr.Textbox(label="Username"), gr.Textbox(label="Password")] login_button = gr.Button("Log in") clear_button = gr.Button("Clear") # File upload section (initially hidden) with gr.Group(visible=False) as upload_group: gr.Markdown("### Upload Data (an Excel file)") upload_inputs = [ gr.File(label="Upload Excel File", file_types=[".xls", ".xlsx"]) ] upload_button = gr.Button("Upload") clear_upload_button = gr.Button("Clear Uploaded Data") # Function for Admin login def admin_login(username, password): global admin_authenticated if username == ADMIN_USERNAME and password == ADMIN_PASSWORD: admin_authenticated = True gr.Info("Login successful. You can now upload data.") return { upload_group: gr.Group(visible=True), } else: admin_authenticated = False raise gr.Error("Invalid username or password.") # Link the login button to the validation function login_button.click( fn=admin_login, inputs=login_inputs, outputs=[upload_group] ) # Link the clear button to the clear_fields function to reset the inputs clear_button.click( fn=clear_fields, inputs=[], # No inputs are needed outputs=login_inputs, # Clear the username and password fields ) # Link the upload button to the file upload function upload_button.click( fn=update_data, inputs=upload_inputs, ) # Link the clear data button clear_upload_button.click( fn=clear_data, ) with gr.Tab("Employee Interface"): with gr.Tab("View Data"): gr.Markdown( "### Is there any question? Contect Nitchakarn Chuangsuwanich (Prim)" ) show_user_button = gr.Button("show username") view_username = gr.Markdown(label="Avilable username") view_inputs = [ gr.Textbox(label="Username"), gr.Textbox(label="Password"), ] view_button = gr.Button("View") clear_button = gr.Button("Clear") view_outputs = gr.DataFrame(label="View data") show_user_button.click(list_usernames, outputs=view_username) view_button.click( show_employee_data, inputs=view_inputs, outputs=view_outputs ) clear_button.click( fn=clear_fields, inputs=[], # No inputs are needed outputs=view_inputs, # Clear the username and password fields ) demo.launch(share=True, debug=False)