log data to csv
This commit is contained in:
5 files changed
+109
-52
No files matched your search
+15
-3
@@ -41,7 +41,8 @@ def generateScheduleV3(
|
||||
blockClassLimit: int=40, # Block class limit is the number of classrooms available per block. Default 40 classes per block
|
||||
totalBlocks: int=10, # total blocks between two semesters -> default is 10 for 5 per semester... or this can be 8 for 4 blocks per semester
|
||||
studentsDir: str="../output/raw/students.json",
|
||||
conflictsDir: str="../output/raw/conflicts.json"
|
||||
conflictsDir: str="../output/raw/conflicts.json",
|
||||
coursesDir: str="../output/raw/courses.json"
|
||||
) -> tuple[dict, Error]: # Returns the completed 'running' dictionary from above
|
||||
|
||||
# Return error that totalBlocks is invalid
|
||||
@@ -531,10 +532,21 @@ def generateScheduleV3(
|
||||
for student in students:
|
||||
for block in student["schedule"]:
|
||||
if len(student["schedule"][block]) == 0:
|
||||
student["schedule"][block].append(flex[0]) if int(block[5:]) <= 5 else student["schedule"][block].append(flex[1])
|
||||
i = 0 if int(block[5:]) <= blockPerSem else 1
|
||||
student["schedule"][block].append(flex[i])
|
||||
|
||||
# Update/log Student records
|
||||
# Read timetable and collect data on courses
|
||||
for block in running:
|
||||
for course in running[block]:
|
||||
sem = "Sem1" if int(block[5:]) <= blockPerSem else "Sem2"
|
||||
courses[running[block][course]["CrsNo"]][sem] += 1
|
||||
|
||||
# Update/log new student records
|
||||
with open(studentsDir, "w") as outfile:
|
||||
json.dump(students, outfile, indent=2)
|
||||
|
||||
# Update/log new course records
|
||||
with open(coursesDir, "w") as outfile:
|
||||
json.dump(courses, outfile, indent=2)
|
||||
|
||||
return (running, None)
|
||||
@@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env python3.11
|
||||
import json
|
||||
import csv
|
||||
from app.util.estimateGrade import getGradeFromCourseCode
|
||||
|
||||
# Get all requested courses from data
|
||||
def getCourses(
|
||||
data_dir: str,
|
||||
log: int=False,
|
||||
log_dir: str='./output/raw/courses.json',
|
||||
) -> dict[dict[str: any]]:
|
||||
|
||||
courses = {}
|
||||
|
||||
with open(data_dir, newline='') as csvfile:
|
||||
reader = csv.DictReader(csvfile)
|
||||
for row in reader:
|
||||
exists = False
|
||||
for course in courses:
|
||||
exists = True if courses[course]["CrsNo"] == row["CrsNo"] else False
|
||||
if exists: break
|
||||
if not exists:
|
||||
courses[row["CrsNo"]] = {
|
||||
"CrsNo": row["CrsNo"],
|
||||
"Requests": 0,
|
||||
"Description": row["Description"],
|
||||
"Sem1": 0,
|
||||
"Sem2":0,
|
||||
"Grade": getGradeFromCourseCode(row["CrsNo"])
|
||||
}
|
||||
|
||||
if log:
|
||||
with open(log_dir, "w") as outfile:
|
||||
json.dump(courses, outfile, indent=2)
|
||||
|
||||
return courses
|
||||
|
||||
# Writes all course data to csv file
|
||||
def writeCoursesToCSV(courses: dict, output_dir: str='./output/raw/csv/courses.csv') -> None:
|
||||
with open(output_dir, 'w') as file:
|
||||
writer = csv.writer(file)
|
||||
# Write header
|
||||
data = ("CrsNo", "Description", "Grade", "Requests", "First sem. # of Classes", "Second sem. # of Classes", "Total # of Classes")
|
||||
writer.writerow(data)
|
||||
|
||||
for course in courses:
|
||||
courseData = (
|
||||
courses[course]["CrsNo"],
|
||||
courses[course]["Description"],
|
||||
courses[course]["Grade"],
|
||||
courses[course]["Requests"],
|
||||
courses[course]["Sem1"],
|
||||
courses[course]["Sem2"],
|
||||
(courses[course]["Sem1"] + courses[course]["Sem2"])
|
||||
)
|
||||
writer.writerow(courseData)
|
||||
@@ -1,32 +0,0 @@
|
||||
#!/usr/bin/env python3.11
|
||||
import json
|
||||
import csv
|
||||
|
||||
# Get all requested courses from data
|
||||
def getCourses(
|
||||
data_dir: str,
|
||||
log: int=False,
|
||||
log_dir: str='./output/raw/courses.json',
|
||||
) -> dict[dict[str: any]]:
|
||||
|
||||
courses = {}
|
||||
|
||||
with open(data_dir, newline='') as csvfile:
|
||||
reader = csv.DictReader(csvfile)
|
||||
for row in reader:
|
||||
exists = False
|
||||
for course in courses:
|
||||
exists = True if courses[course]["CrsNo"] == row["CrsNo"] else False
|
||||
if exists: break
|
||||
if not exists:
|
||||
courses[row["CrsNo"]] = {
|
||||
"CrsNo": row["CrsNo"],
|
||||
"Requests": 0,
|
||||
"Description": row["Description"]
|
||||
}
|
||||
|
||||
if log:
|
||||
with open(log_dir, "w") as outfile:
|
||||
json.dump(courses, outfile, indent=2)
|
||||
|
||||
return courses
|
||||
@@ -57,3 +57,15 @@ def getStudents(
|
||||
json.dump(students, outfile, indent=2)
|
||||
|
||||
return students
|
||||
|
||||
# Writes all students data to csv file
|
||||
def writeStudentsToCSV(students: dict, output_dir: str='./output/raw/csv/students.csv') -> None:
|
||||
with open(output_dir, 'w') as file:
|
||||
writer = csv.writer(file)
|
||||
# Write header
|
||||
data = ("Pupil #", "# of Classes", "Grade")
|
||||
writer.writerow(data)
|
||||
|
||||
for student in students:
|
||||
studentData = (student["Pupil #"], student["classes"], student["gradelevel"])
|
||||
writer.writerow(studentData)
|
||||
@@ -4,8 +4,8 @@ import os
|
||||
import json
|
||||
from app.generator import generateScheduleV3
|
||||
from app.util.globals import Error
|
||||
from app.util.getCourses import getCourses
|
||||
from app.util.getStudents import getStudents
|
||||
from app.util.courses import getCourses, writeCoursesToCSV
|
||||
from app.util.students import getStudents, writeStudentsToCSV
|
||||
from app.util.convertRawData import putScheduleToWord, putMasterTimetable
|
||||
|
||||
eel.init('template')
|
||||
@@ -19,18 +19,22 @@ def start(
|
||||
total_blocks: int,
|
||||
) -> dict:
|
||||
|
||||
eel.post_data('Ensuring Directories Exists...')
|
||||
raw_data_dir = './output/temp/course_selection_data.csv'
|
||||
raw_json_dir = './output/raw/json'
|
||||
|
||||
# Ensure output paths exists
|
||||
eel.post_data('Ensuring Directories Exists...')
|
||||
|
||||
if not os.path.exists('output'): os.makedirs('output')
|
||||
if not os.path.exists('output/temp'): os.makedirs('output/temp')
|
||||
if not os.path.exists('output/final'): os.makedirs('output/final')
|
||||
if not os.path.exists('output/final/student_schedules'): os.makedirs('output/final/student_schedules')
|
||||
if not os.path.exists('output/raw'): os.makedirs('output/raw')
|
||||
if not os.path.exists('output/raw/json'): os.makedirs('output/raw/json')
|
||||
if not os.path.exists('output/raw/csv'): os.makedirs('output/raw/csv')
|
||||
|
||||
raw_data_dir = './output/temp/course_selection_data.csv'
|
||||
|
||||
eel.post_data('Saving raw data to local file...')
|
||||
# save raw file data to local file
|
||||
eel.post_data('Saving raw data to local file...')
|
||||
with open(raw_data_dir, 'w') as raw_file:
|
||||
raw_file.write(raw_file_data)
|
||||
|
||||
@@ -40,19 +44,19 @@ def start(
|
||||
block_class_limit = int(block_class_limit)
|
||||
total_blocks = int(total_blocks)
|
||||
|
||||
eel.post_data('Collecting student information...')
|
||||
# call pre-algorithm functions read raw data into a processable format
|
||||
eel.post_data('Collecting student information...')
|
||||
students = getStudents(
|
||||
raw_data_dir,
|
||||
log=True,
|
||||
totalBlocks=total_blocks,
|
||||
log_dir='./output/raw/students.json'
|
||||
log_dir='./output/raw/json/students.json'
|
||||
)
|
||||
eel.post_data('Collecting course information...')
|
||||
courses = getCourses(
|
||||
raw_data_dir,
|
||||
log=True,
|
||||
log_dir='./output/raw/courses.json'
|
||||
log_dir=f'{raw_json_dir}/courses.json'
|
||||
)
|
||||
|
||||
eel.post_data('Generating timetables...')
|
||||
@@ -64,26 +68,31 @@ def start(
|
||||
classCap=class_cap,
|
||||
blockClassLimit=block_class_limit,
|
||||
totalBlocks=total_blocks,
|
||||
studentsDir='./output/raw/students.json',
|
||||
conflictsDir='./output/raw/conflicts.json'
|
||||
studentsDir=f'{raw_json_dir}/students.json',
|
||||
conflictsDir=f'{raw_json_dir}/conflicts.json',
|
||||
coursesDir=f'{raw_json_dir}/courses.json'
|
||||
)
|
||||
|
||||
|
||||
if err is not None:
|
||||
eel.post_data(f'An error has occured while generating the timetable: {err.Title}')
|
||||
return err.__dict__
|
||||
|
||||
eel.post_data('Gathering latest data...')()
|
||||
# Get updated students
|
||||
with open('./output/raw/students.json', 'r') as studentFile: students = json.load(studentFile)
|
||||
eel.post_data('Gathering latest data...')
|
||||
with open(f'{raw_json_dir}/students.json', 'r') as studentFile: students = json.load(studentFile)
|
||||
|
||||
# call post-algorithm functions to present sorted data
|
||||
eel.post_data('Writing data to .csv files...')
|
||||
# get updated raw data
|
||||
with open(f'{raw_json_dir}/students.json', 'r') as sFile: students = json.load(sFile)
|
||||
with open(f'{raw_json_dir}/courses.json', 'r') as cFile: courses = json.load(cFile)
|
||||
writeStudentsToCSV(students, output_dir='./output/raw/csv/students.csv')
|
||||
writeCoursesToCSV(courses, output_dir='./output/raw/csv/courses.csv')
|
||||
|
||||
eel.post_data('Writing timetables to .docx files...')
|
||||
# call post-algorithm functions to present sorted data
|
||||
for student in students:
|
||||
putScheduleToWord(courses, student, './output/final/student_schedules')
|
||||
|
||||
# TODO: log master_timetable
|
||||
|
||||
return err.__dict__ if err is not None else None
|
||||
|
||||
eel.start('index.html', size=(800, 1000))
|
||||
Reference in new issue
Block a user