import gradio as gr import os from process import process_data def makeButtonClickableFiles(files): """Makes a button interactive only if all files in the list have correct extensions. Args: files (list): List of uploaded file objects. Returns: _type_: Button state (interactive or not) and possibly a warning message. """ if not files: return gr.Button(interactive=False) allowed_extensions = ["xls", "xlsx"] for file in files: base_name = os.path.basename(file.name) # Extract the file extension and check if it's in the allowed list. if base_name.split('.')[-1].lower() not in allowed_extensions: raise gr.Error(f"Unsupported file: {base_name}.Allowed extensions: .xls .xlsx") return gr.Button(interactive=True) # Define a Gradio interface with gr.Blocks() as demo: with gr.Row(): header = gr.Markdown(("

MindBody VS. Medserv Checker

")) with gr.Row(): with gr.Column(): file_uploader_mindbody = gr.Files( label=("Upload MindBody"), file_count="multiple", file_types=[".xlsx", '.xls'], container=True, interactive=True, scale=1, ) with gr.Column(): file_uploader_medserv = gr.Files( label=("Upload Medserv"), file_count= "multiple", file_types=[".xlsx", '.xls'], container=True, interactive=True, scale=1, ) with gr.Row(): tollerance = gr.Slider(0, 7, value = 1, step = 1, interactive = True, label="Days Tolerance", info="Set the number of days of tolerance to match the sale dates between MindBody and Medserve (0 = no tolerance / exact match).") with gr.Row(): file_process_button = gr.Button( value="PROCESS FILES", interactive=False, ) with gr.Row(): processed_file = gr.Files( label=("Output File"), file_count="single", interactive=False, elem_classes="gradio-file", ) file_uploader_mindbody.change( fn=makeButtonClickableFiles, inputs=[file_uploader_mindbody], outputs=[file_process_button]) file_uploader_medserv.change( fn=makeButtonClickableFiles, inputs=[file_uploader_medserv], outputs=[file_process_button]) file_process_button.click( fn = process_data, inputs = [file_uploader_mindbody, file_uploader_medserv, tollerance], outputs = processed_file) if __name__ == "__main__": demo.queue().launch()