# app.py
import streamlit as st
import pandas as pd
import os
from io import BytesIO
st.set_page_config(
page_title="Specialization Selection System",
layout="wide"
)
st.markdown("""
""", unsafe_allow_html=True)
st.image("logo.png", width=450)
st.markdown('
Specialization Priority Selection System
', unsafe_allow_html=True)
st.markdown('University Engineering Specialization Selection Portal
', unsafe_allow_html=True)
excel_file = "For Specialisation.xlsx"
df_students = pd.read_excel(excel_file)
all_choices = [
"Civil Engineering (Baccalaureate level)",
"Architectural Engineering (Baccalaureate level)",
"Quantity Surveying & Cost Estimation (Baccalaureate level)",
"Mechanical Engineering (Baccalaureate level)",
"Chemical Engineering (Baccalaureate level)",
"Heating Ventilation & Air Conditioning (Diploma level)",
"Oil and Gas (Diploma level)",
"Electrical Power Engineering (Baccalaureate level)",
"Electronics and Telecommunication Engineering (Baccalaureate level)",
"Computer Engineering (Baccalaureate level)"
]
female_choices = [
"Civil Engineering (Baccalaureate level)",
"Architectural Engineering (Baccalaureate level)",
"Quantity Surveying & Cost Estimation (Baccalaureate level)",
"Mechanical Engineering (Baccalaureate level)",
"Chemical Engineering (Baccalaureate level)",
"Oil and Gas (Diploma level)",
"Electrical Power Engineering (Baccalaureate level)",
"Electronics and Telecommunication Engineering (Baccalaureate level)",
"Computer Engineering (Baccalaureate level)"
]
def convert_df_to_excel(df):
output = BytesIO()
with pd.ExcelWriter(output, engine="openpyxl") as writer:
df.to_excel(writer, index=False, sheet_name="Student Choices")
output.seek(0)
return output
student_id = st.text_input("Enter Student ID")
if student_id:
matched = df_students[df_students["Student No"].astype(str) == student_id]
if not matched.empty:
row = matched.iloc[0]
st.success("Student ID Verified Successfully")
st.write(f"### Student Name: {row['Student Name']}")
st.write(f"### Advisor Name: {row['Advisor Name']}")
gender = st.radio("Select Gender", ["Male", "Female"])
phone = st.text_input("Enter Phone Number")
st.markdown("---")
st.subheader("Select Your Prioritized Choices")
if gender == "Male":
choices_available = all_choices
required_choices = 10
else:
choices_available = female_choices
required_choices = 9
selected_choices = []
for i in range(required_choices):
remaining = [x for x in choices_available if x not in selected_choices]
choice = st.selectbox(
f"Choice {i + 1}",
remaining,
key=f"choice_{i}"
)
selected_choices.append(choice)
if st.button("Submit Choices"):
if phone.strip() == "":
st.error("Please enter phone number before submitting.")
else:
submission = {
"Student ID": student_id,
"Student Name": row["Student Name"],
"Advisor Name": row["Advisor Name"],
"Gender": gender,
"Phone Number": phone
}
for i, c in enumerate(selected_choices):
submission[f"Choice {i + 1}"] = c
submit_df = pd.DataFrame([submission])
csv_file = "submissions.csv"
if os.path.exists(csv_file):
old_df = pd.read_csv(csv_file)
old_df = old_df[old_df["Student ID"].astype(str) != student_id]
final_df = pd.concat([old_df, submit_df], ignore_index=True)
else:
final_df = submit_df
final_df.to_csv(csv_file, index=False)
st.success("Choices Submitted Successfully")
else:
st.error("Invalid Student ID")
st.markdown("---")
st.header("Admin Dashboard and Report Download")
admin_password = st.text_input("Enter Admin Password", type="password")
if admin_password == "admin123":
if os.path.exists("submissions.csv"):
report_df = pd.read_csv("submissions.csv")
st.subheader("Submitted Student Choices")
st.dataframe(report_df, use_container_width=True)
st.subheader("Choice Analytics")
choice_columns = [col for col in report_df.columns if col.startswith("Choice")]
selected_choice_column = st.selectbox(
"Select Choice Level for Analytics",
choice_columns
)
chart_data = report_df[selected_choice_column].value_counts().reset_index()
chart_data.columns = ["Specialization", "Number of Students"]
st.bar_chart(chart_data.set_index("Specialization"))
st.subheader("Overall Specialization Demand Across All Choices")
all_selected_choices = report_df[choice_columns].melt(value_name="Specialization")
overall_chart_data = all_selected_choices["Specialization"].value_counts().reset_index()
overall_chart_data.columns = ["Specialization", "Total Times Selected"]
st.bar_chart(overall_chart_data.set_index("Specialization"))
excel_data = convert_df_to_excel(report_df)
st.download_button(
label="Download Report Excel",
data=excel_data,
file_name="specialization_report.xlsx",
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
else:
st.warning("No submissions available yet")