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