Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| from tqdm import tqdm | |
| import utils | |
| import config | |
| import pandas as pd | |
| def output(file, text1, text2, text3, text4, text5, text6, template, progress: gr.Progress = gr.Progress(track_tqdm=True)): | |
| output_text = "" | |
| if file is None: | |
| return gr.Error("No file uploaded.") | |
| file_path = file.name | |
| structured_data = utils.process_resume(file_path) | |
| if structured_data is None: | |
| return gr.Error("Unsupported file type.") | |
| # Get the selected template value | |
| selected_template = config.template[template] | |
| prompt = f""" | |
| {{ | |
| "Hiring Manager's Name": "{text1}", | |
| "Company Name": "{text2}", | |
| "Industry/Field": "{text3}", | |
| "Specific Projects, Innovations, or Company Achievements": "{text4}", | |
| "Specific Skills or Tools Relevant to the Job": "{text5}", | |
| "Specific Roles, Teams, or Projects at the Company": "{text6}", | |
| "resume": {structured_data} | |
| }} | |
| """ | |
| progress(0.5) | |
| output_text = utils.generate_email(prompt, selected_template) | |
| progress(1) | |
| return output_text, output_text | |
| def bulk_output(excel, pdf, template, progress: gr.Progress = gr.Progress(track_tqdm=True)): | |
| # Check for uploaded files | |
| if excel is None: | |
| return gr.Error("No Excel file uploaded.") | |
| if pdf is None: | |
| return gr.Error("No PDF file uploaded.") | |
| # Determine file extension and read accordingly | |
| file_ext = os.path.splitext(excel.name)[-1].lower() | |
| try: | |
| if file_ext == '.csv': | |
| df = pd.read_csv(excel.name) | |
| elif file_ext in ['.xls', '.xlsx']: | |
| df = pd.read_excel(excel.name) | |
| else: | |
| return gr.Error("Unsupported file type. Please upload a .csv or .xlsx file.") | |
| except Exception as e: | |
| return gr.Error(f"Failed to read the file: {str(e)}") | |
| # Check required columns | |
| required_columns = [ | |
| 'Hiring Managers Name', 'Company Name', 'Industry/Field', | |
| 'Specific Projects, Innovations, or Company Achievements', | |
| 'Specific Skills or Tools Relevant to the Job', | |
| 'Specific Roles, Teams, or Projects at the Company' | |
| ] | |
| missing_columns = [col for col in required_columns if col not in df.columns] | |
| if missing_columns: | |
| return gr.Error(f"The uploaded Excel file is missing required columns: {', '.join(missing_columns)}") | |
| # Process the resume | |
| structured_data = utils.process_resume(pdf.name) | |
| if structured_data is None: | |
| return gr.Error("Unsupported or unreadable resume file.") | |
| # Get the selected template value | |
| selected_template = config.template[template] | |
| # Loop through each row and generate emails | |
| for _, row in tqdm(df.iterrows(), total=len(df), desc="Generating emails"): | |
| prompt = f""" | |
| {{ | |
| "Hiring Manager's Name": "{row['Hiring Managers Name']}", | |
| "Company Name": "{row['Company Name']}", | |
| "Industry/Field": "{row['Industry/Field']}", | |
| "Specific Projects, Innovations, or Company Achievements": "{row['Specific Projects, Innovations, or Company Achievements']}", | |
| "Specific Skills or Tools Relevant to the Job": "{row['Specific Skills or Tools Relevant to the Job']}", | |
| "Specific Roles, Teams, or Projects at the Company": "{row['Specific Roles, Teams, or Projects at the Company']}", | |
| "resume": {structured_data} | |
| }} | |
| """ | |
| try: | |
| email = utils.generate_email(prompt, selected_template) | |
| config.write_email(row['Hiring Managers Name'], row['Company Name'], email) | |
| except Exception as e: | |
| return gr.Error(f"Error generating email for {row['Company Name']}: {str(e)}") | |
| return "Emails have been drafted and saved as Word documents." | |
| def generate_and_download(name, company, ai_email): | |
| file_path = config.write_email(name, company, ai_email) | |
| return file_path | |
| def bulk_generate_and_download(): | |
| zip_file_path = config.return_bulk_file() | |
| return zip_file_path | |
| with gr.Blocks(css="body { background: #f8fafc; font-family: 'Inter'; }") as demo: | |
| with gr.Tabs(): | |
| with gr.TabItem("Single Email"): | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| text1 = gr.Textbox(label="Hiring Manager's Name") | |
| text2 = gr.Textbox(label="Company Name") | |
| text3 = gr.Textbox(label="Industry/Field") | |
| text4 = gr.Textbox(label="Specific Projects, Innovations, or Company Achievements") | |
| text5 = gr.Textbox(label="Specific Skills or Tools Relevant to the Job") | |
| text6 = gr.Textbox(label="Specific Roles, Teams, or Projects at the Company") | |
| with gr.Row(): | |
| template = gr.Dropdown(choices=list(config.template.keys()), label="Select Email Template", interactive=True) | |
| pdf_input = gr.File(label="Upload PDF", file_types=[".pdf", ".docx"], interactive=True, scale=1) | |
| submit_btn = gr.Button("Submit") | |
| with gr.Column(scale=1): | |
| output_box = gr.Textbox(label="Output", lines=10, autoscroll=True) | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| write_btn = gr.Button("Draft Email") | |
| with gr.Column(scale=1): | |
| download_button = gr.File(label="Download Word Document") | |
| state = gr.State() | |
| submit_btn.click(output, inputs=[pdf_input, text1, text2, text3, text4, text5, text6, template], outputs=[output_box, state]) | |
| write_btn.click(generate_and_download, inputs=[text1, text2, state], outputs= [download_button]) | |
| with gr.TabItem("Batch Email"): | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| pdf_input = gr.File(label="Upload PDF", file_types=[".pdf", ".docx"], interactive=True, scale=1) | |
| excel_input = gr.File(label="Upload Excel", file_types=[".xlsx", ".csv"], interactive=True, scale=1) | |
| with gr.Row(): | |
| template = gr.Dropdown(choices=list(config.template.keys()), label="Select Email Template", interactive=True) | |
| submit_btn = gr.Button("Submit and Draft") | |
| with gr.Column(scale=1): | |
| output_box = gr.Textbox(label="Output", lines=10, autoscroll=True) | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| Zip_btn = gr.Button("Make Zip File") | |
| with gr.Column(scale=1): | |
| download_button = gr.File(label="Download ZIP File") | |
| submit_btn.click(bulk_output, inputs=[excel_input, pdf_input, template], outputs=[output_box]) | |
| Zip_btn.click(bulk_generate_and_download, inputs=[], outputs=[download_button]) | |
| demo.launch() |