File size: 3,734 Bytes
64eae68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
01697bf
 
 
 
 
 
 
64eae68
 
 
 
 
 
 
8084291
64eae68
 
 
 
 
 
01697bf
 
 
 
 
 
 
 
 
64eae68
 
 
 
 
8084291
64eae68
 
 
 
 
 
 
 
01697bf
64eae68
 
 
01697bf
64eae68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
from Backend import get_correction_and_comments, generate_questions
from logger import logger
from pymongo import MongoClient, errors
import interpreter
from dotenv import load_dotenv
import os

load_dotenv()

# Configure the page
st.set_page_config(page_title="Interactive Code Assistant", layout="wide")
st.title("✨ Interactive Code Assistant with Python Interpreter ✨")

# Initialize session state for feedback to persist data
if "helpful" not in st.session_state:
    st.session_state.helpful = None  # Initialize feedback as None

# Set up MongoDB connection
try:
    client = MongoClient(os.getenv("MONGO_URI"), serverSelectionTimeoutMS=5000)
    client.server_info()  # Trigger an exception if MongoDB is not reachable
    db = client["Capstone"]
    feedback_collection = db["Feedback"]
except errors.ServerSelectionTimeoutError:
    st.error("Error: Could not connect to MongoDB. Please ensure MongoDB is running.")

# Create two expanded columns for wider side-by-side text areas
colu1, colu2 = st.columns([1, 1])  # Both columns have equal width

# Text area in the first column for entering code
with colu1:
    st.subheader("Code Input")
    code_input = st.text_area("Enter Your Python Code:", height=400, max_chars=10000)

# Text area in the second column to display the output from Google Gemini
with colu2:
    st.subheader("Corrected Output")
    gemini_output = st.empty()

# Dropdown to select the type of question
st.subheader("Select Question Type")
question_type = st.selectbox(
    "Choose the type of questions to generate:",
    ["Logical Questions", "Interview-Based Questions", "Code Analysis Questions"]
)

# Buttons for different functionalities
col1, col2, col3 = st.columns([0.3, 0.3, 0.3])
with col1:
    if st.button("Run Code"):
        try:
            output = interpreter.run_code(code_input)
            st.subheader("✨ Code Output ✨")
            st.text_area("Execution Output", output, height=600, max_chars=None)
        except Exception as e:
            st.error(f"Error: {e}")
            logger.error(f"Code execution error: {e}")

with col2:
    if st.button("Generate Questions"):
        logger.info(f"Generating {question_type.lower()}.")
        try:
            # Generate questions based on user selection
            generated_questions = generate_questions(code_input, question_type)
            st.subheader(f"🤖 Model-Generated {question_type}")
            st.write(generated_questions)
        except Exception as e:
            st.error(f"Error: Could not generate questions: {e}")
            logger.error(f"Question generation error: {e}")

with col3:
    if st.button("Corrected Code"):
        logger.info("User requested code correction.")
        corrected_code = get_correction_and_comments(code_input)
        gemini_output.code(corrected_code, language="python")

# Feedback form (outside of the columns, after all content)
st.subheader("Feedback")
st.session_state.helpful = st.radio("Were the questions helpful?", ("Yes", "No"))

if st.button("Submit Feedback"):
    if st.session_state.helpful is not None:
        try:
            feedback_collection.insert_one({"helpful": st.session_state.helpful, "question_type": question_type})
            st.success("Feedback submitted successfully.")
        except Exception as e:
            st.error(f"Failed to submit feedback: {e}")

# Hide Streamlit's default menu and style adjustments for a cleaner look
st.markdown(
    """
    <style>
    .reportview-container .main .block-container {
        padding-top: 1rem;
        padding-bottom: 1rem;
        max-width: 1200px;
    }
    .stTextArea {
        font-size: 14px;
    }
    </style>
    """,
    unsafe_allow_html=True
)