Spaces:
Sleeping
Sleeping
import os | |
import streamlit as st | |
from settings import BASE_DIR, NUMBER_OF_TECHNICAL_QUESTIONS, NUMBER_OF_COMMON_QUESTIONS | |
from core.slack_notifier import SlackNotifier | |
from core.questions_loader_local import QuestionLoaderLocal | |
from presentation.layout import Layout | |
# Slack Webhook | |
SLACK_WEBHOOK_URL = os.environ["SLACK_WEBHOOK_URL"] | |
layout = Layout() | |
def call(): | |
# Check if questions are already loaded | |
if 'questions' not in st.session_state: | |
# Define questions | |
questions = QuestionLoaderLocal( | |
os.path.join(BASE_DIR, "questions", st.session_state['technology'].lower(), "questions.csv"), | |
NUMBER_OF_TECHNICAL_QUESTIONS | |
).fetch_questions() | |
if not questions: | |
st.markdown("Work in progress!!") | |
return | |
common_questions = QuestionLoaderLocal( | |
os.path.join(BASE_DIR, "questions", "common", "questions.csv"), | |
NUMBER_OF_COMMON_QUESTIONS | |
).fetch_questions() | |
questions.extend(common_questions) | |
# Store questions in session state to persist across interactions | |
st.session_state['questions'] = questions | |
# Retrieve the questions from session state | |
questions = st.session_state['questions'] | |
score = 0 | |
total_questions = len(questions) | |
answered_all = True | |
for idx, question in enumerate(questions): | |
# Section for each question with styling | |
selected_option = layout.render_test_question(question, idx) | |
if not selected_option: | |
answered_all = False | |
# Checking for correct answer and assigning points based on difficulty | |
if selected_option == question['answer']: | |
score += 1 | |
if st.button("Submit Test", use_container_width=True, type="primary"): | |
if answered_all: | |
st.session_state['test_started'] = False | |
layout.render_completion_message(score, total_questions) | |
result = (score / total_questions) * 100 | |
SlackNotifier(SLACK_WEBHOOK_URL).send_candidate_info( | |
st.session_state['name'], | |
st.session_state['email'], | |
st.session_state['experience'], | |
st.session_state['technology'], | |
f"{result:.2f}%" | |
) | |
else: | |
# Show a message asking the user to answer all questions | |
st.warning("Please answer all questions before submitting.") | |
def main(): | |
# Set page config with custom title and layout | |
st.set_page_config(page_title="Candidate MCQ Platform", layout="wide") | |
layout.render_header() | |
if 'test_started' not in st.session_state: | |
st.session_state['test_started'] = False | |
if not st.session_state['test_started']: | |
st.title("Welcome to the Candidate Assessment Platform") | |
name, email, experience, technology, submit = layout.render_signup_form() | |
if name and email: | |
st.session_state['name'] = name | |
st.session_state['email'] = email | |
st.session_state['experience'] = experience | |
st.session_state['technology'] = technology | |
st.session_state['test_wip'] = True | |
if submit: | |
st.session_state['test_started'] = True | |
st.rerun() | |
layout.render_instructions() | |
else: | |
call() | |
if __name__ == "__main__": | |
main() | |