File size: 8,779 Bytes
628e667
 
 
 
 
299c487
 
8888446
628e667
 
 
 
 
09d32c8
 
628e667
 
09d32c8
628e667
09d32c8
628e667
 
 
 
 
 
 
299c487
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6baadb7
299c487
 
 
 
 
a280d3b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8888446
 
 
 
628e667
 
 
 
 
 
09d32c8
628e667
 
09d32c8
628e667
 
 
299c487
 
 
 
628e667
 
 
 
 
 
 
 
299c487
 
6baadb7
 
 
 
299c487
6baadb7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
299c487
6baadb7
 
 
a280d3b
8888446
a280d3b
 
 
 
6baadb7
a280d3b
6baadb7
 
a280d3b
 
 
 
 
 
 
299c487
 
 
 
 
 
 
6baadb7
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
import streamlit as st
from dotenv import load_dotenv
from azure.cosmos import CosmosClient
from typing import List 
import os
import requests
import json
import re

load_dotenv()

def get_db_items(offset: int, database_name: str, container_name: str, num_items: int = 10) -> List[dict]:
    try:
        client: CosmosClient = st.session_state["db_items"]
        database = client.get_database_client(database_name)
        container = database.get_container_client(container_name)
        
        query = f"SELECT * FROM c ORDER BY c._ts DESC OFFSET {offset} LIMIT {num_items}"  
        items = list(container.query_items(query=query, enable_cross_partition_query=True))

        return items
    
    except Exception as e:
        print(f"Fehler beim Abrufen der Daten aus der Cosmos DB: {e}")
        st.error("Someting went wrong. Please try again later.", icon="🚨")
        return []

def update_db_item(item: dict, database_name: str, container_name: str):
    try:
        database = st.session_state["db_items"].get_database_client(database_name)
        container = database.get_container_client(container_name)
        container.upsert_item(item)
    except Exception as e:
        print(f"Fehler beim Updaten des Items: {e}")
        st.error("Someting went wrong. Please try again later.", icon="🚨")

def get_summary(input_params) -> dict:
    try:
        url = f"{os.environ.get('BASE_API')}/api/create-interview-summary"
        response = requests.post(url=url,data=input_params)
        response.raise_for_status()  
        return response.json()
    except Exception as e: 
        print(f"Fehler beim erstellen des Termins: {str(e)}")
        #Mache abfrage auf den HTTP Status Code
        if response.status_code == 500:
            st.info("There is currently no recording available from Zoom. Please try again in a few minutes.", icon="ℹ️")
        else:
            st.error(f"Something went wrong: {str(e)}", icon="🚨")

def change_meeting_items():
    st.session_state["detailed_view"] = False
    st.session_state["selected_item"] = None
    if st.session_state["meeting_type"] == "Candidate interview":
        st.session_state["items_to_show"] = st.session_state["interview_items"]
    else:
        st.session_state["items_to_show"] = st.session_state["assessment_items"]

def back_to_overview():
    st.session_state["detailed_view"] = False
    st.session_state["selected_item"] = None
    st.session_state["created_question_evaluations"] = []

def summary_button_clicked(interview_object: dict):
    st.session_state["detailed_view"] = True
    st.session_state["selected_item"] = interview_object

def update_assessment_db_item():
    try:
        client: CosmosClient = st.session_state["db_items"]
        database = client.get_database_client("assessment-database")
        container = database.get_container_client("assessments")
        assessment_item = st.session_state["selected_item"]
        assessment_item["process_status"] = "evaluations_created"
        for i, question in enumerate(assessment_item["questions"]):
            question["score"] = st.session_state[f"rating_question_{i}"]
            question["evaluation"] = st.session_state[f"evaluation_question_{i}"]
        for i, tasks in enumerate(assessment_item["coding_tasks"]):
            tasks["score"] = st.session_state[f"rating_coding_task_{i}"]
            tasks["evaluation"] = st.session_state[f"evaluation_coding_task_{i}"]
        container.upsert_item(assessment_item)
    except Exception as e:
        print(f"Fehler beim Updaten des Items: {e}")
        st.error("Someting went wrong. Please try again later.", icon="🚨")

def remove_html_tags(input_string: str):  
    clean = re.compile('<.*?>')  
    return re.sub(clean, '', input_string) 

if "db_items" not in st.session_state:
    endpoint = os.getenv("COSMOS_DB_ENDPOINT")
    key = os.getenv("COSMOS_DB_KEY")
    client = CosmosClient(endpoint, key)
    st.session_state["db_items"] = client
if "interview_items" not in st.session_state:
    initial_items = get_db_items(0, "appointment-database", "appointments", 50)
    st.session_state["interview_items"] = initial_items
if "assessment_items" not in st.session_state:
    initial_items = get_db_items(0, "assessment-database", "assessments", 50)
    st.session_state["assessment_items"] = initial_items
if "items_to_show" not in st.session_state:
    st.session_state["items_to_show"] = st.session_state["interview_items"]
if "detailed_view" not in st.session_state:
    st.session_state["detailed_view"] = False
if "selected_item" not in st.session_state:
    st.session_state["selected_item"] = None

col1, col2 = st.columns([2, 1])

col1.title("Meeting Manager")
col2.image("https://www.workgenius.com/wp-content/uploads/2023/03/WorkGenius_navy-1.svg")

st.radio("Select a meeting type", ("Candidate interview", "Peer to peer assessment"), key="meeting_type", on_change=change_meeting_items)
st.divider()

if st.session_state["detailed_view"]:
    if st.session_state["meeting_type"] == "Candidate interview":
        st.subheader("Summary for meeting: "+st.session_state["selected_item"]["job_title"])
        print(isinstance(st.session_state["selected_item"]["summary_recruiter"],str))
        if isinstance(st.session_state["selected_item"]["summary_recruiter"],str):
            
            with st.spinner("Creating summary..."):
                input_params = {
                    "meeting_id": st.session_state["selected_item"]["zoom_meeting_id"],
                }
                summary = get_summary(json.dumps(input_params))
                copied_db_item = st.session_state["selected_item"].copy()
                
                if summary:
                    if st.session_state["meeting_type"] == "Candidate interview":
                        #Operations for candidate interviews
                        copied_db_item["process_status"] = "summaries_created"
                        copied_db_item["summary_recruiter"] = summary
                        update_db_item(copied_db_item, "appointment-database", "appointments")
                    else:
                        #TODO: Operations for peer to peer assessments
                        print("To implement")
                    st.write(summary)
        else:
            st.write(st.session_state["selected_item"]["summary_recruiter"])
        st.button("Back to overview", on_click=back_to_overview)
    else:
        st.subheader("Evaluation for meeting: "+st.session_state["selected_item"]["assessment_title"])
        with st.expander("Interview transcript"):
            st.write(st.session_state["selected_item"]["interview_transcript"])
        for i, question in enumerate(st.session_state["selected_item"]["questions"]):
            with st.expander(f"Question {i+1}: {remove_html_tags(question['question'])}"):
                st.number_input("Score (1-10)", key=f"rating_question_{i}", min_value=1, max_value=10)
                st.text_area("Your evaluation:", key=f"evaluation_question_{i}")
                st.write("AI based score: "+str(question["score"]))
                st.write("AI based evalutaion: "+question["evaluation"])
        for i, tasks in enumerate(st.session_state["selected_item"]["coding_tasks"]):
            with st.expander(f"Coding task {i+1}: {tasks['coding_task']}"):
                st.number_input("Score (1-10)", key=f"rating_coding_task_{i}", min_value=1, max_value=10)
                st.text_area("Your evaluation:", key=f"evaluation_coding_task_{i}")
                st.write("AI based score: "+str(tasks["score"]))
                st.write("AI based evalutaion: "+tasks["evaluation"])
        col_evaluations = st.columns([1,2,1])
        with col_evaluations[0]:
            st.button("Back to overview", on_click=back_to_overview, use_container_width=True)
        with col_evaluations[2]:
            st.button("Save evaluation", on_click=update_assessment_db_item, use_container_width=True)
else:
    st.subheader("Candidate interview:" if st.session_state["meeting_type"] == "Candidate interview" else "Peer to peer assessments:")
    # st.write(st.session_state["interview_items"])
    meeting_title = st.columns([6,2])   
    meeting_title[0].write("**Meeting title:**") 
    for i, interview in enumerate(st.session_state["items_to_show"]):
        cols = st.columns([6,2])
        if st.session_state["meeting_type"] == "Candidate interview":
            cols[0].write(interview["job_title"])
            cols[1].button("Summary", key=f"button_{i}", on_click=summary_button_clicked, args=(interview,))
        else:
            cols[0].write(interview["assessment_title"])
            cols[1].button("Evaluation", key=f"button_{i}", on_click=summary_button_clicked, args=(interview,))