# New Graysheet | |
import warnings | |
warnings.simplefilter('default', DeprecationWarning) | |
from fpdf import FPDF | |
import pandas as pd | |
import streamlit as st | |
from datetime import datetime | |
def generate_pdf(df): | |
num_students = df.shape[0] | |
page_body_list = [] | |
for i in range(num_students): | |
if(df.at[i, 'Exam Status'] == "Approved"): # only generates for students who are approved | |
# get the data | |
studentName = df.at[i, 'Student'] | |
course = df.at[i, 'Course'] | |
date = df.at[i, 'Date'] | |
loc = df.at[i, 'Exam_Location'] | |
scheduled_start_time = df.at[i, 'Time_Start'] | |
scheduled_end_time = df.at[i, 'Time_End'] | |
# format data with labels | |
studentName = " ".join(["Student's Name:", studentName]) | |
course = " ".join(["Course:", course]) | |
date = " ".join(["Date:", date]) | |
if loc == loc: | |
loc = " ".join(["Location:", loc]) | |
else: | |
loc = "Location: __________________" | |
scheduled_start_time = " ".join(["Scheduled Start Time:", scheduled_start_time]) | |
scheduled_end_time = " ".join(["Scheduled End Time:", scheduled_end_time]) | |
# add additional text about exam conditions | |
exam_conditions = ("\nThis exam is proctored under the specified conditions and expectations set by your faculty and Student Access. " | |
"Subverting the testing conditions or violating the Honor Code by utilizing unauthorized forms of assistance during " | |
"this exam will result in Student Access stopping your exam and reporting the incident.") | |
# put grouped info together | |
student_info = "\n".join([studentName, course, date, loc]) | |
scheduled_time = "\n".join([scheduled_start_time, scheduled_end_time]) | |
student_info_and_scheduled_time = "\n".join([student_info, scheduled_time, exam_conditions]) | |
notes = "Additional Information:\n____________________________________________________________________\n____________________________________________________________________\n____________________________________________________________________\n____________________________________________________________________" | |
actual_time = "\n".join(["Actual Start Time: _____________________________________________________", | |
"Estimated/Adjusted End Time: ___________________________________________", | |
"Actual End Time: ______________________________________________________"]) | |
proctor = "Proctor Signature: _______________________ Date: _______________________" | |
student = "Student Signature: ______________________ Date: _______________________" | |
# construct the body of the pdf | |
body = "\n\n".join([student_info_and_scheduled_time, notes, actual_time, proctor, student]) | |
# add this student's info to the list | |
page_body_list.append(body) | |
pdf = FPDF() | |
for i in range(len(page_body_list)): | |
pdf.add_page() | |
pdf.image("VandyStudentAccessLogo.png", 40, 10, w=120) | |
pdf.set_font('helvetica', 'B', size=16) | |
pdf.cell(w=210, h=9, txt="\n", border=0, new_x="LMARGIN", new_y="NEXT", align='C', fill=False) | |
pdf.set_font('helvetica', 'B', size=16) | |
pdf.cell(w=210, h=9, txt="\n", border=0, new_x="LMARGIN", new_y="NEXT", align='C', fill=False) | |
pdf.set_font('helvetica', 'B', size=8) | |
pdf.cell(w=210, h=9, txt="\n", border=0, new_x="LMARGIN", new_y="NEXT", align='C', fill=False) | |
pdf.set_font('helvetica', 'B', size=14) | |
pdf.cell(w=210, h=9, txt="Exam Check-in Form", border=0, new_x="LMARGIN", new_y="NEXT", align='C', fill=False) | |
pdf.set_font('helvetica', 'B', size=10) | |
pdf.multi_cell(w=0, h=7, txt="This form is to be completed by the proctor. The student must return this \nform along with their reminder ticket and all exam materials.\n", border=0, | |
new_x="LMARGIN", new_y="NEXT", align='C', fill=False) | |
pdf.set_font('helvetica', 'B', size=10) | |
pdf.cell(w=210, h=9, txt="\n", border=0, new_x="LMARGIN", new_y="NEXT", align='C', fill=False) | |
pdf.set_font('helvetica', size=13) | |
pdf.multi_cell(0, 7, page_body_list[i]) | |
pdf.set_font('helvetica', 'B', size=10) | |
pdf.set_xy(145, 255) | |
pdf.cell(w=0, h=7, txt="# of Exam Pages _________") | |
pdf.set_xy(145, 260) | |
pdf.cell(w=0, h=7, txt="Cover Sheets +2") | |
pdf.set_xy(145, 265) | |
pdf.cell(w=0, h=7, txt="Notes, Notecards, etc. ____") | |
pdf.set_xy(170, 270) | |
pdf.cell(w=0, h=7, txt="Total ______") | |
pdf.output("/tmp/GraySheets.pdf") | |
return "/tmp/GraySheets.pdf" | |
def main(): | |
st.title("Gray Sheet Generator") | |
# File upload | |
uploaded_file = st.file_uploader("Choose a CSV file", type="csv") | |
if uploaded_file is not None: | |
# Process the file | |
df = pd.read_csv(uploaded_file) | |
pdf_path = generate_pdf(df) | |
todays_date = datetime.now().strftime("%m_%d_%Y") | |
filename = f"GraySheets_{todays_date}.pdf" | |
# Download button | |
with open(pdf_path, "rb") as file: | |
btn = st.download_button( | |
label="Download Gray Sheet", | |
data=file, | |
file_name=filename, | |
mime="application/octet-stream" | |
) | |
if __name__ == "__main__": | |
main() | |
# Old GraySheet | |
# import warnings | |
# warnings.simplefilter('default', DeprecationWarning) | |
# from fpdf import FPDF | |
# import pandas as pd | |
# import streamlit as st | |
# from datetime import datetime | |
# def generate_pdf(df): | |
# num_students = df.shape[0] | |
# page_body_list = [] | |
# for i in range(num_students): | |
# if(df.at[i, 'Exam Status'] == "Approved"): # only generates for students who are approved, not for those who are "processing" or "cancelled" | |
# # get the data | |
# studentName = df.at[i, 'Student'] | |
# course = df.at[i, 'Course'] | |
# date = df.at[i, 'Date'] | |
# loc = df.at[i, 'Exam_Location'] | |
# scheduled_start_time = df.at[i, 'Time_Start'] | |
# scheduled_end_time = df.at[i, 'Time_End'] | |
# # format data with labels | |
# studentName = " ".join(["Student's Name:", studentName]) | |
# course = " ".join(["Course:", course]) | |
# date = " ".join(["Date:", date]) | |
# if loc == loc: | |
# loc = " ".join(["Location:", loc]) | |
# else: | |
# loc = "Location: __________________" | |
# scheduled_start_time = " ".join(["Scheduled Start Time:", scheduled_start_time]) | |
# scheduled_end_time = " ".join(["Scheduled End Time:", scheduled_end_time]) | |
# # put grouped info together | |
# student_info = "\n".join([studentName, course, date, loc]) | |
# scheduled_time = "\n".join([scheduled_start_time, scheduled_end_time]) | |
# student_info_and_scheduled_time = "\n".join([student_info, scheduled_time]) | |
# notes = "Additional Information:\n____________________________________________________________________\n____________________________________________________________________\n____________________________________________________________________\n____________________________________________________________________" | |
# actual_time = "\n\n\n".join(["Actual Start Time: _____________________________________________________", "Estimated/Adjusted End Time: ___________________________________________", "Actual End Time: ______________________________________________________"]) | |
# proctor = "\n\nProctor's Signature: _______________________ Date: _______________________" | |
# # construct the body of the pdf | |
# body = "\n\n\n".join([student_info_and_scheduled_time, notes, actual_time, proctor]) | |
# # add this student's info to the list | |
# page_body_list.append(body) | |
# pdf = FPDF() | |
# for i in range(len(page_body_list)): | |
# pdf.add_page() | |
# pdf.image("VandyStudentAccessLogo.png", 40, 10, w=120) | |
# pdf.set_font('helvetica', 'B', size=16) | |
# pdf.cell(w=210, h=9, text="\n", border=0, new_x="LMARGIN", new_y="NEXT", align='C', fill=False) | |
# pdf.set_font('helvetica', 'B', size=16) | |
# pdf.cell(w=210, h=9, text="\n", border=0, new_x="LMARGIN", new_y="NEXT", align='C', fill=False) | |
# pdf.set_font('helvetica', 'B', size=8) | |
# pdf.cell(w=210, h=9, text="\n", border=0, new_x="LMARGIN", new_y="NEXT", align='C', fill=False) | |
# pdf.set_font('helvetica', 'B', size=14) | |
# pdf.cell(w=210, h=9, text="Exam Check-in Form", border=0, new_x="LMARGIN", new_y="NEXT", align='C', fill=False) | |
# pdf.set_font('helvetica', 'B', size=10) | |
# pdf.multi_cell(w=0, h=7, text="This form is to be completed by the proctor. The student must return this \nform along with their seat ticket and all exam materials.\n", border=0, | |
# new_x="LMARGIN", new_y="NEXT", align='C', fill=False) | |
# pdf.set_font('helvetica', 'B', size=10) | |
# pdf.cell(w=210, h=9, text="\n", border=0, new_x="LMARGIN", new_y="NEXT", align='C', fill=False) | |
# pdf.set_font('helvetica', size=13) | |
# pdf.multi_cell(0, 7, page_body_list[i]) | |
# pdf.set_font('helvetica', 'B', size=10) | |
# pdf.set_xy(145, 270) | |
# pdf.cell(w=0, h=5, text="# of Exam Pages: _____") | |
# pdf.output("/tmp/GraySheets.pdf") | |
# return "/tmp/GraySheets.pdf" | |
# def main(): | |
# st.title("Gray Sheet Generator") | |
# # File upload | |
# uploaded_file = st.file_uploader("Choose a CSV file", type="csv") | |
# if uploaded_file is not None: | |
# # Process the file | |
# df = pd.read_csv(uploaded_file) | |
# pdf_path = generate_pdf(df) | |
# todays_date = datetime.now().strftime("%m_%d_%Y") | |
# filename = f"GraySheets_{todays_date}.pdf" | |
# # Download button | |
# with open(pdf_path, "rb") as file: | |
# btn = st.download_button( | |
# label="Download Gray Sheet", | |
# data=file, | |
# file_name=filename, | |
# mime="application/octet-stream" | |
# ) | |
# if __name__ == "__main__": | |
# main() |