diff --git a/.gitignore b/.gitignore index bdc6076..7f5735a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ # Environment -.env \ No newline at end of file +.env + +# Pycache +/test/__pycache__/* \ No newline at end of file diff --git a/test/courses.py b/test/courses.py index 8c2bdfc..620f972 100644 --- a/test/courses.py +++ b/test/courses.py @@ -5,7 +5,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl2": { "name": "class2", @@ -13,7 +13,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl3": { "name": "class3", @@ -21,7 +21,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl4": { "name": "class4", @@ -29,7 +29,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl5": { "name": "class5", @@ -37,7 +37,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl6": { "name": "class6", @@ -45,7 +45,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl7": { "name": "class7", @@ -53,7 +53,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl8": { "name": "class8", @@ -61,7 +61,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl9": { "name": "class9", @@ -69,7 +69,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl10": { "name": "class10", @@ -77,7 +77,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl11": { "name": "class11", @@ -85,7 +85,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl12": { "name": "class12", @@ -93,7 +93,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl13": { "name": "class13", @@ -101,7 +101,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl14": { "name": "class14", @@ -109,7 +109,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl15": { "name": "class15", @@ -117,7 +117,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl16": { "name": "class16", @@ -125,7 +125,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl17": { "name": "class17", @@ -133,7 +133,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl18": { "name": "class18", @@ -141,7 +141,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl19": { "name": "class19", @@ -149,7 +149,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl20": { "name": "class20", @@ -157,7 +157,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl21": { "name": "class21", @@ -165,7 +165,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl22": { "name": "class22", @@ -173,7 +173,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl23": { "name": "class23", @@ -181,7 +181,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] }, "cl24": { "name": "class24", @@ -189,7 +189,7 @@ courses = { "credits": 4, "gradelevel": 11, "totalrequests": 0, - "studentindexs": [] + "studentindexes": [] } } diff --git a/test/test.py b/test/test.py index 563922f..cac9cc6 100644 --- a/test/test.py +++ b/test/test.py @@ -9,16 +9,18 @@ # } # } +# query = { +# "code1": { +# "name": "hello", +# "value": 3 +# } +# } -# if "code1" in myList: -# print(True) -# print(list(myList).index("code2")) +# myList = ["a","b","c","d","e","f","g","h","i","j"] +# print(len(myList)) -myList = ["a","b","c","d","e","f","g","h","i","j"] -print(len(myList)) +# for i in range(len(myList)-2): # Subtract last 2 classes as they are alternatives +# print() -for i in range(len(myList)-2): # Subtract last 2 classes as they are alternatives - print() - -# Get first alternative -print(myList[len(myList)-2]) \ No newline at end of file +# # Get first alternative +# print(myList[len(myList)-2]) diff --git a/test/tinker.py b/test/tinker.py index 9a08a72..479bade 100644 --- a/test/tinker.py +++ b/test/tinker.py @@ -1,5 +1,8 @@ #!/usr/bin/python3 import random +import names +import math +from prettytable import PrettyTable from courses import courses, activeCourses ''' @@ -34,16 +37,16 @@ schedule: { running example: running: { "semester1": { - "block1": {classCode:{"className":name,"remaining":number},classCode:{"className":name,"remaining":number}}, - "block2": {classCode:{"className":name,"remaining":number},classCode:{"className":name,"remaining":number}}, - "block3": {classCode:{"className":name,"remaining":number},classCode:{"className":name,"remaining":number}}, - "block4": {classCode:{"className":name,"remaining":number},classCode:{"className":name,"remaining":number}} + "block1": {classCode:{"className":name,"students":[student Name]},classCode:{"className":name,"students":[student Name]}}, + "block2": {classCode:{"className":name,"students":[student Name]},classCode:{"className":name,"students":[student Name]}}, + "block3": {classCode:{"className":name,"students":[student Name]},classCode:{"className":name,"students":[student Name]}}, + "block4": {classCode:{"className":name,"students":[student Name]},classCode:{"className":name,"students":[student Name]}} }, "semester2": { - "block1": {classCode:{"className":name,"remaining":number},classCode:{"className":name,"remaining":number}}, - "block2": {classCode:{"className":name,"remaining":number},classCode:{"className":name,"remaining":number}}, - "block3": {classCode:{"className":name,"remaining":number},classCode:{"className":name,"remaining":number}}, - "block4": {classCode:{"className":name,"remaining":number},classCode:{"className":name,"remaining":number}} + "block1": {classCode:{"className":name,"students":[student Name]},classCode:{"className":name,"students":[student Name]}}, + "block2": {classCode:{"className":name,"students":[student Name]},classCode:{"className":name,"students":[student Name]}}, + "block3": {classCode:{"className":name,"students":[student Name]},classCode:{"className":name,"students":[student Name]}}, + "block4": {classCode:{"className":name,"students":[student Name]},classCode:{"className":name,"students":[student Name]}} ] } ''' @@ -57,15 +60,15 @@ running = [] def generateMockStudents(n): for _ in range(n): newStudent = { - "name": "someName", - "requests": [], + "name": names.get_full_name(), + "requests": [], # list of class codes "schedule": {} } # Get list of random class choices with no repeats # 8 primary choices, 2 secondary choices - courseSelection = random.sample(range(0, len(courses), 10)) + courseSelection = random.sample(range(0, len(courses)), 10) for courseNum in courseSelection: - newStudent["requests"] = courses[courseNum]["code"] + newStudent["requests"].append(list(courses)[courseNum]) mockStudents.append(newStudent) @@ -75,20 +78,51 @@ def generateSchedule(): # Tally class request for request in student["requests"]: courses[request]["totalrequests"] += 1 - courses[request]["studentindexes"].append(i) - # Add course to active list if enough requests - if courses[request]["totalRequests"] > minReq and courses[request] not in activeCourses: activeCourses.append(courses[request]) + courses[request]["studentindexes"].append(mockStudents.index(student)) + # Add course to active list if enough requests + if courses[request]["totalrequests"] > minReq and courses[request]["code"] not in activeCourses: activeCourses[courses[request]["code"]] = courses[request] + + # calculate # of times to run class + for i in range(len(activeCourses)): + classRunCount = math.floor(activeCourses[list(activeCourses)[i]]["totalrequests"] / classCap) + # If there is 18+ requests left, 1 more class could be run + if (activeCourses[list(activeCourses)[i]]["totalrequests"] % classCap) > minReq: classRunCount += 1 + activeCourses[list(activeCourses)[i]]["classRunCount"] = classRunCount for student in mockStudents: - blockIndex = 0 - semesterIndex = 0 - for i in range(len(student["requests"])-2): # Subtract last 2 classes as they are alternatives - currentClass = student - if student["requests"][i] in activeCourses: - pass - elif student["requests"][i] not in activeCourses: - # Get first alternative - student["requests"][len(student["requests"])-2] + alternateOffset = len(student["requests"])-8 + for i in range(len(student["requests"])-alternateOffset): # Subtract x classes as they are alternatives + currentCourse = student["requests"][i] + while True: + if currentCourse in activeCourses: + blockIndex = 1 + semesterIndex = 1 + while True: + block = f"block{blockIndex}" + semester = f"semester{semesterIndex}" + if currentCourse in running[semester][block]: + # Add student to class + if len(running[semester][block][currentCourse]["students"]) == classCap: + # TODO: Class is full, find next class or generate new class + break + else: + running[semester][block][currentCourse]["students"].append(student["name"]) + student["schedule"][semester][block] = running[semester][block][currentCourse]["name"] + else: + if semesterIndex == 2 and blockIndex == 4: + # TODO: Class does not exist, create class in first available slot + break + elif blockIndex == 4: # 4th Block (final block) + blockIndex = 0 + semesterIndex += 1 + else: blockIndex += 1 + break + elif currentCourse not in activeCourses: + if alternateOffset == 0: + # TODO: No more alternatives, solve problem + break + currentCourse = student["requests"][len(student["requests"])-alternateOffset] + alternateOffset -= 1 # for course in courses: # blockIndex = 0 @@ -125,8 +159,9 @@ def generateSchedule(): # else: # running["semester1"][blockIndex].append(q) - # for studentIndex in course["studentindexs"]: + # for studentIndex in course["studentindexes"]: # if studentIndex == i: # pass -generateMockStudents(400) \ No newline at end of file +generateMockStudents(400) +generateSchedule() \ No newline at end of file