Spaces:
Sleeping
Sleeping
| import json | |
| import os | |
| import uuid | |
| from datetime import datetime, timedelta | |
| import requests | |
| import streamlit as st | |
| from azure.cosmos import CosmosClient | |
| from dotenv import load_dotenv | |
| from ParamClasses import Appointment, AppointmentDBItem, Attendee, CreateParams | |
| load_dotenv() | |
| def create_meeting(input_params) -> dict: | |
| try: | |
| url = f"{os.environ.get('BASE_API')}/create/zoom-meeting" | |
| header = {"x-api-key": os.environ.get("API_KEY")} | |
| response = requests.post(url=url, data=input_params, headers=header) | |
| response.raise_for_status() | |
| print(response.json()) | |
| return response.json() | |
| except Exception as e: | |
| print(f"Fehler beim erstellen des Termins: {str(e)}") | |
| st.error("Something went wrong, please contact the site admin.", icon="🚨") | |
| def adjust_datetime(original_datetime_str, offset_option): | |
| # Konvertiere den originalen DateTime-String in ein datetime-Objekt | |
| original_datetime = datetime.strptime( | |
| original_datetime_str, "%Y-%m-%dT%H:%M:%S.%fZ" | |
| ) | |
| # Überprüfe das Vorzeichen im Offset-String | |
| if offset_option.startswith("+"): | |
| # Wenn das Vorzeichen ein Pluszeichen ist, negiere den Offset | |
| offset_option = "-" + offset_option[1:] | |
| elif offset_option.startswith("-"): | |
| offset_option = "+" + offset_option[1:] | |
| else: | |
| # Wenn kein Vorzeichen vorhanden ist, füge ein Minuszeichen hinzu | |
| offset_option = "" + offset_option | |
| # Konvertiere die Offset-Option von String zu integer | |
| offset_hours = int(offset_option) | |
| # Erzeuge ein timedelta-Objekt mit dem entsprechenden Offset | |
| offset_delta = timedelta(hours=offset_hours) | |
| # Passe das ursprüngliche datetime-Objekt an | |
| adjusted_datetime = original_datetime + offset_delta | |
| # Formatieren und zurückgeben | |
| adjusted_datetime_str = adjusted_datetime.strftime("%Y-%m-%dT%H:%M:%S.%fZ") | |
| return adjusted_datetime_str | |
| def write_interview_db_object(interview_data): | |
| try: | |
| db_client: CosmosClient = st.session_state["cosmos_db"] | |
| database = db_client.get_database_client("appointment-database") | |
| container = database.get_container_client("appointments") | |
| container.create_item(body=interview_data) | |
| except Exception as e: | |
| print(f"Fehler beim erstellen des Appointment DB items: {str(e)}") | |
| st.error("Something went wrong, please contact the site admin.", icon="🚨") | |
| def write_assessment_db_object(interview_data): | |
| try: | |
| db_client: CosmosClient = st.session_state["cosmos_db"] | |
| database = db_client.get_database_client("assessment-database") | |
| container = database.get_container_client("assessments") | |
| container.create_item(body=interview_data) | |
| except Exception as e: | |
| print(f"Fehler beim erstellen des Assessment DB items: {str(e)}") | |
| st.error("Something went wrong, please contact the site admin.", icon="🚨") | |
| def create_button_handler(): | |
| with st.spinner("Creating the appointment..."): | |
| start_date_utc_str = datetime.strptime( | |
| str(st.session_state["date_input"]) | |
| + " " | |
| + str(st.session_state["time_input"]), | |
| "%Y-%m-%d %H:%M:%S", | |
| ).strftime("%Y-%m-%dT%H:%M:%S.%fZ") | |
| start_date_str = adjust_datetime( | |
| start_date_utc_str, st.session_state["time_zone_option"] | |
| ) | |
| end_date = datetime.strptime( | |
| str(st.session_state["date_input"]) | |
| + " " | |
| + str(st.session_state["time_input"]), | |
| "%Y-%m-%d %H:%M:%S", | |
| ) + timedelta(minutes=st.session_state["duration_input"]) | |
| end_date_utc_str = end_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ") | |
| end_date_str = adjust_datetime( | |
| end_date_utc_str, st.session_state["time_zone_option"] | |
| ) | |
| request_params = json.dumps( | |
| { | |
| "appointment": {"start_time": start_date_str, "end_time": end_date_str}, | |
| "subject": st.session_state["subject_input"], | |
| "recruiter": { | |
| "email": "", # st.session_state["recruiter_mail"], | |
| "name": "", # st.session_state["recruiter_mail"] | |
| }, | |
| "client": { | |
| "email": "", # st.session_state["client_mail"], | |
| "name": "", # st.session_state["client_mail"] | |
| }, | |
| "candidate": { | |
| "email": "", # st.session_state["candidate_mail"], | |
| "name": "", # st.session_state["candidate_mail"] | |
| }, | |
| } | |
| ) | |
| appointment_response = create_meeting(request_params) | |
| st.session_state["appointment_response"] = appointment_response | |
| if st.session_state["assessment_toggle"]: | |
| assessment_id = str(uuid.uuid4()) | |
| st.session_state["assessment_db_id"] = assessment_id | |
| db_item = { | |
| "id": assessment_id, | |
| "zoom_meeting_id": str(appointment_response["zoom_meeting"]["id"]), | |
| "assessment_title": st.session_state["subject_input"], | |
| "start_time": start_date_str, | |
| "end_time": end_date_str, | |
| "callback_url": "http://127.0.0.1:8000/test", | |
| "authorization_token": "asdf", | |
| "meeting_url": appointment_response["zoom_meeting"]["start_url"], | |
| "environment": str(["us"]), | |
| "process_status": "assessment_scheduled", | |
| "recruiter": { | |
| "email": "", # str(st.session_state["recruiter_mail"]), | |
| "name": "", # str(st.session_state["recruiter_mail"]) | |
| }, | |
| "client": { | |
| "email": "", # str(st.session_state["client_mail"]), | |
| "name": "", # str(st.session_state["client_mail"]) | |
| }, | |
| "candidate": { | |
| "email": "", # str(st.session_state["candidate_mail"]), | |
| "name": "", # str(st.session_state["candidate_mail"]) | |
| }, | |
| "interview_transcript": [], | |
| "questions": [], | |
| "coding_tasks": [], | |
| "transcript_summary": "", | |
| } | |
| write_assessment_db_object(db_item) | |
| else: | |
| db_item = { | |
| "id": str(uuid.uuid4()), | |
| "zoom_meeting_id": str(appointment_response["zoom_meeting"]["id"]), | |
| "process_id": str(uuid.uuid4()), | |
| "job_title": st.session_state["subject_input"], | |
| "start_time": start_date_str, | |
| "end_time": end_date_str, | |
| "meeting_url": appointment_response["zoom_meeting"]["start_url"], | |
| "environment": str(["us"]), | |
| "process_status": "interview_scheduled", | |
| "recruiter": { | |
| "email": "", # str(st.session_state["recruiter_mail"]), | |
| "name": "", # str(st.session_state["recruiter_mail"]) | |
| }, | |
| "client": { | |
| "email": "", # str(st.session_state["client_mail"]), | |
| "name": "", # str(st.session_state["client_mail"]) | |
| }, | |
| "candidate": { | |
| "email": "", # str(st.session_state["candidate_mail"]), | |
| "name": "", # str(st.session_state["candidate_mail"]) | |
| }, | |
| "summary_recruiter": "", | |
| "summary_client": "", | |
| "summary_candidate": "", | |
| } | |
| write_interview_db_object(db_item) | |
| if "appointment_response" not in st.session_state: | |
| st.session_state["appointment_response"] = None | |
| if "cosmos_db" not in st.session_state: | |
| # Cosmos DB Client erstellen | |
| client = CosmosClient(os.environ.get("DB_CONNECTION"), os.environ.get("DB_KEY")) | |
| st.session_state["cosmos_db"] = client | |
| if "assessment_db_id" not in st.session_state: | |
| st.session_state["assessment_db_id"] = None | |
| if "assessment_toggle" not in st.session_state: | |
| st.session_state["assessment_toggle"] = True | |
| col1, col2 = st.columns([2, 1]) | |
| col1.title("Appointment Tool") | |
| col2.image( | |
| "https://www.workgenius.com/wp-content/uploads/2023/03/WorkGenius_navy-1.svg" | |
| ) | |
| st.write("Please enter the date, time and duration for the appointment to be created.") | |
| st.date_input("Date of the appointment", format="DD/MM/YYYY", key="date_input") | |
| now = datetime.now() | |
| rounded_now = now + timedelta(minutes=30 - now.minute % 30) | |
| st.time_input("Starting time of the appointment", value=rounded_now, key="time_input") | |
| st.selectbox( | |
| "Please select your time zone (based on UTC time)", | |
| options=[ | |
| "+10", | |
| "+9", | |
| "+8", | |
| "+7", | |
| "+6", | |
| "+5", | |
| "+4", | |
| "+3", | |
| "+2", | |
| "+1", | |
| "0", | |
| "-1", | |
| "-2", | |
| "-3", | |
| "-4", | |
| "-5", | |
| "-6", | |
| "-7", | |
| "-8", | |
| "-9", | |
| "-10", | |
| ], | |
| index=10, | |
| key="time_zone_option", | |
| ) | |
| st.select_slider( | |
| "Duration of the appointment in minutes", | |
| [15, 30, 45, 60], | |
| value=30, | |
| key="duration_input", | |
| ) | |
| st.text_input("Enter the subject of the meeting", key="subject_input") | |
| # recruiter_mail = st.text_input("Please enter the mail of the recruiter", key="recruiter_mail") | |
| # client_mail = st.text_input("Please enter the mail of the client", key="client_mail") | |
| # candidate_mail = st.text_input("Please enter the mail of the candidate", key="candidate_mail") | |
| # st.toggle( | |
| # "Activate to create an assessment appointment, otherwise a candidate interview is going to be created", | |
| # key="assessment_toggle", | |
| # ) | |
| st.button( | |
| "Create appointment", | |
| key="create_button", | |
| disabled=False if st.session_state["subject_input"] else True, | |
| on_click=create_button_handler, | |
| ) | |
| if st.session_state["appointment_response"]: | |
| st.success("The appointment was created correctly.") | |
| st.write( | |
| "Interviewer link: " | |
| + st.session_state["appointment_response"]["zoom_meeting"]["start_url"] | |
| ) | |
| st.write( | |
| "Interviewee link: " | |
| + st.session_state["appointment_response"]["zoom_meeting"]["join_url"] | |
| ) | |
| if st.session_state["assessment_toggle"]: | |
| st.write( | |
| "Here is the link for the assessment tool: https://wg-assessment-app.azurewebsites.net/assessment/" | |
| + st.session_state["assessment_db_id"] | |
| ) | |
| st.write( | |
| "Here is the link for the code upload: https://wg-assessment-app.azurewebsites.net/candidate/" | |
| + st.session_state["assessment_db_id"] | |
| ) | |