def specific_distribute(): client = MongoClient(MONGO_HOST, MONGO_PORT) db = client[MONGO_DBNAME] raw_selections = db["selections"] raw_students = db["students"] raw_courses = db["courses"] raw_preselects = db["preselects"] student_in_course_data = {} for data in request.get_json(): student_in_course_data[data["course_id"]] = data["students"] db.results.delete_many({}) course_names = getCourseid(raw_courses) if len(student_in_course_data) == 0: try: courses = genCourse(raw_courses) except ValueError: return "Invalid course type detected", 400 students = genStudent(raw_students, raw_selections, course_names) preselects = genPreselect(raw_preselects) results = Algorithm.distribute(courses, students, preselects) db.results.insert_many(results) else: results = [] for course_name in course_names: try: courses = genCourse(raw_courses, course_name = course_name) except ValueError: return "Invalid course type detected", 400 students = genStudent(raw_students, raw_selections, course_names, student_in_course_data) preselects = genPreselect(raw_preselects) result = Algorithm.distribute(courses, students, preselects) results.extend(result) db.results.insert_many(results) client.close() return ""
def test_04_priority_2(self): # test for priority = 2 student1 = Student("Michael", "B09901186", {"Ten-Select-Two": ["自動控制"]}, 2) student2 = Student("Mecoli", "610736", {"Ten-Select-Two": ["自動控制"]}, 4) students = [student1, student2] course1 = Course({ "id": "Ten-Select-Two", "name": "十選二實驗", "type": "Ten-Select-Two", "options": { "自動控制": { "limit": 1, "priority": 2 }, } }) courses = [course1] expected = [{ "studentID": "B09901186", "courseName": "十選二實驗", "optionName": "自動控制", }] results = list_to_set(Algorithm.distribute(courses, students)) expected = list_to_set(expected) self.assertEqual(results, expected)
def test_03_priority_0(self): # test for priority = 0 student1 = Student( "Michael", "B09901186", {"Electronic-Circuits-Experiment": ["teacher1a", "teacher1b"]}, 2) student2 = Student( "Mecoli", "610736", {"Electronic-Circuits-Experiment": ["teacher1a", "teacher1b"]}, 1) student3 = Student( "Mecoli", "610736", {"Electronic-Circuits-Experiment": ["teacher1a", "teacher1b"]}, 1) students = [student1, student2, student3] course1 = Course({ "id": "Electronic-Circuits-Experiment", "name": "電路學實驗", "type": "EE-Lab", "description": "", "options": { "teacher1a": { "limit": 1, "priority": 0 }, "teacher1b": { "limit": 1, "priority": 0 } } }) courses = [course1] results = list_to_set(Algorithm.distribute(courses, students)) self.assertEqual(len(results), 2)
def test_09_preselect(self): # test for preselect student1 = Student("Michael", "B09901186", {"course1": ["電力電子", "自動控制", "數電實驗"]}, 3) student2 = Student("Mecoli", "610736", {"course1": ["嵌入式系統", "數電實驗", "自動控制"]}, 1) students = [student1, student2] course1 = Course({ "id": "course1", "name": "Ten-Select-Two", "type": "Ten-Select-Two", "description": "", "options": { "電力電子": { "limit": 1, "priority": 0 }, "自動控制": { "limit": 1, "priority": 0 }, "數電實驗": { "limit": 1, "priority": 0 }, "嵌入式系統": { "limit": 1, "priority": 0 } } }) courses = [course1] expected = [ { "studentID": "B09901186", "courseName": "Ten-Select-Two", "optionName": "電力電子", }, { "studentID": "B09901186", "courseName": "Ten-Select-Two", "optionName": "數電實驗", }, { "studentID": "610736", "courseName": "Ten-Select-Two", "optionName": "嵌入式系統", }, { "studentID": "610736", "courseName": "Ten-Select-Two", "optionName": "自動控制", }, ] preselect = ["B09901186"] results = list_to_set( Algorithm.distribute(courses, students, preselect)) expected = list_to_set(expected) self.assertEqual(results, expected)
def test_08_ten_select_two( self): # test for bigger number (100) of students students = [] for i in range(100): students.append( Student("Michael", "B09901186" + str(i), { "Electronic-Circuits-Experiment": ["teacher1a", "teacher1b"] }, 2)) course1 = Course({ "id": "Electronic-Circuits-Experiment", "name": "電路學實驗", "type": "EE-Lab", "description": "", "options": { "teacher1a": { "limit": 25, "priority": 0 }, "teacher1b": { "limit": 25, "priority": 0 } } }) courses = [course1] results = list_to_set(Algorithm.distribute(courses, students)) self.assertEqual(len(results), 50)
def test_13_EElab_2(self): # test for EE-Lab student1 = Student( "Michael", "B09901186", { "Electronic-Circuits-Experiment": ["teacher1a", "teacher1b", "teacher1c"] }, 2) student2 = Student( "Mecoli", "610736", { "Electronic-Circuits-Experiment": ["teacher1a", "teacher1c", "teacher1b"] }, 3) student3 = Student( "Pekoli", "VIP888", { "Electronic-Circuits-Experiment": ["teacher1c", "teacher1b", "teacher1a"] }, 4) students = [student1, student2, student3] course1 = Course({ "id": "Electronic-Circuits-Experiment", "name": "電路學實驗", "type": "EE-Lab", "description": "", "options": { "teacher1a": { "limit": 2, "priority": 0 }, "teacher1b": { "limit": 2, "priority": 0 }, "teacher1c": { "limit": 2, "priority": 0 } } }) courses = [course1] expected = [ { "studentID": "B09901186", "courseName": "電路學實驗", "optionName": "teacher1a", }, { "studentID": "610736", "courseName": "電路學實驗", "optionName": "teacher1a", }, { "studentID": "VIP888", "courseName": "電路學實驗", "optionName": "teacher1c", }, ] results = list_to_set(Algorithm.distribute(courses, students)) expected = list_to_set(expected) self.assertEqual(results, expected)
def test_07_priority_5(self): # test for priority = 5 student4 = Student("Mike", "AAA5678", {"Ten-Select-Two": ["自動控制", "電力電子"]}, 1) student5 = Student("Pekoli", "BBB2021", {"Ten-Select-Two": ["自動控制", "電力電子"]}, 2) student1 = Student("Michael", "B09901186", {"Ten-Select-Two": ["自動控制", "電力電子"]}, 3) student2 = Student("Mecoli", "610736", {"Ten-Select-Two": ["自動控制", "電力電子"]}, 4) student3 = Student("Michael Jackson", "ABC1234", {"Ten-Select-Two": ["自動控制", "電力電子"]}, 4) students = [student1, student2, student3, student4, student5] course1 = Course({ "id": "Ten-Select-Two", "name": "十選二實驗", "type": "Ten-Select-Two", "options": { "電力電子": { "limit": 2, "priority": 0 }, "自動控制": { "limit": 3, "priority": 5 }, } }) courses = [course1] expected = [{ "studentID": "B09901186", "courseName": "十選二實驗", "optionName": "自動控制", }, { "studentID": "610736", "courseName": "十選二實驗", "optionName": "自動控制", }, { "studentID": "ABC1234", "courseName": "十選二實驗", "optionName": "自動控制", }, { "studentID": "AAA5678", "courseName": "十選二實驗", "optionName": "電力電子", }, { "studentID": "BBB2021", "courseName": "十選二實驗", "optionName": "電力電子", }] results = list_to_set(Algorithm.distribute(courses, students)) expected = list_to_set(expected) self.assertEqual(results, expected)
def test_15_2_courses2(self): # test for multiple courses student1 = Student( "Michael", "B09901186", { "course1": ["teacher1a", "teacher1b"], "course2": ["teacher2a", "teacher2b"] }, 2) student2 = Student( "Mecoli", "610736", { "course1": ["teacher1a", "teacher1b"], "course2": ["teacher2a", "teacher2b"] }, 3) student3 = Student( "Pekoli", "A123456", { "course1": ["teacher1a", "teacher1b"], "course2": ["teacher2a", "teacher2b"] }, 4) students = [student1, student2, student3] course1 = Course({ "id": "course1", "name": "電路學實驗", "type": "EE-Lab", "description": "", "options": { "teacher1a": { "limit": 2, "priority": 0 }, "teacher1b": { "limit": 1, "priority": 0 } } }) course2 = Course({ "id": "course2", "name": "電子學實驗", "type": "EE-Lab", "description": "", "options": { "teacher2a": { "limit": 1, "priority": 0 }, "teacher2b": { "limit": 1, "priority": 0 } } }) courses = [course1, course2] results = Algorithm.distribute(courses, students) self.assertEqual(len(results), 5)
def test_02_required(self): # test for priority = -1 student1 = Student("Michael", "B09901186", {"course1": ["teacher1a", "teacher1b"]}, 2) student2 = Student("Mecoli", "610736", {"course1": ["teacher1a", "teacher1b"]}, 1) students = [student1, student2] course1 = Course({ "id": "course1", "name": "電路學", "type": "1", "description": "", "options": { "teacher1a": { "limit": 1, "priority": -1 }, "teacher1b": { "limit": 1, "priority": -1 } } }) courses = [course1] results = Algorithm.distribute(courses, students) expected = [ { "studentID": "610736", "courseName": "電路學", "optionName": "teacher1b", }, { "studentID": "B09901186", "courseName": "電路學", "optionName": "teacher1a", }, ] results = list_to_set(results) expected = list_to_set(expected) self.assertEqual(results, expected)
def distribute(): client = MongoClient(MONGO_HOST, MONGO_PORT) db = client[MONGO_DBNAME] raw_selections = db["selections"] raw_students = db["students"] raw_courses = db["courses"] raw_preselects = db["preselects"] try: courses = genCourse(raw_courses) except ValueError: return "Invalid course type detected", 400 course_names = getCourseid(raw_courses) students = genStudent(raw_students, raw_selections, course_names) preselects = genPreselect(raw_preselects) results = Algorithm.distribute(courses, students, preselects) db.results.delete_many({}) db.results.insert_many(results) client.close() return ""
def test_19_4_courses1(self): # test for multiple courses student1 = Student( "Michael", "B09901186", { "course1": ["teacher1a", "teacher1b"], "course2": ["teacher2a", "teaher2b"], "course4": ["自動控制", "電力電子"] }, 2) student2 = Student( "Mecoli", "610736", { "course1": ["teacher1a", "teacher1b"], "course3": ["teacher3a", "teacher3b"], "course4": ["自動控制", "電力電子"] }, 3) students = [student1, student2] course1 = Course({ "id": "course1", "name": "電子學(一)", "type": "2", "description": "", "options": { "teacher1a": { "limit": 1, "priority": -1 }, "teacher1b": { "limit": 1, "priority": -1 } } }) course2 = Course({ "id": "course2", "name": "電磁學(一)", "type": "2", "description": "", "options": { "teacher2a": { "limit": 1, "priority": -1 }, "teacher2b": { "limit": 1, "priority": -1 } } }) course3 = Course({ "id": "course3", "name": "電子學實驗", "type": "EE-Lab", "description": "", "options": { "teacher3a": { "limit": 1, "priority": 0 }, "teacher3b": { "limit": 1, "priority": 0 } } }) course4 = Course({ "id": "course4", "name": "十選二實驗", "type": "Ten-Select-Two", "description": "", "options": { "電力電子": { "limit": 1, "priority": 0 }, "自動控制": { "limit": 1, "priority": 3 } } }) courses = [course1, course2, course3, course4] results = Algorithm.distribute(courses, students) expected = [ { "studentID": "610736", "courseName": "電子學(一)", "optionName": "teacher1a", }, { "studentID": "B09901186", "courseName": "電子學(一)", "optionName": "teacher1b", }, { "studentID": "B09901186", "courseName": "電磁學(一)", "optionName": "teacher2a", }, { "studentID": "610736", "courseName": "電子學實驗", "optionName": "teacher3a", }, { "studentID": "610736", "courseName": "十選二實驗", "optionName": "自動控制", }, { "studentID": "B09901186", "courseName": "十選二實驗", "optionName": "電力電子", }, ] results = list_to_set(results) expected = list_to_set(expected) self.assertEqual(results, expected)
def test_16_2_courses3(self): # test for multiple courses student1 = Student( "Michael", "B09901186", { "course1": ["teacher1a", "teacher1b"], "course2": ["teacher2b", "teacher2a"] }, 4) student2 = Student( "Mecoli", "610736", { "course1": ["teacher1a", "teacher1b"], "course2": ["teacher2a", "teacher2b"] }, 2) students = [student1, student2] course1 = Course({ "id": "course1", "name": "電子學(一)", "type": "2", "description": "", "options": { "teacher1a": { "limit": 1, "priority": -1 }, "teacher1b": { "limit": 1, "priority": -1 } } }) course2 = Course({ "id": "course2", "name": "電子學實驗", "type": "EE-Lab", "description": "", "options": { "teacher2a": { "limit": 1, "priority": 0 }, "teacher2b": { "limit": 1, "priority": 0 } } }) courses = [course1, course2] results = Algorithm.distribute(courses, students) expected = [ { "studentID": "610736", "courseName": "電子學(一)", "optionName": "teacher1b", }, { "studentID": "B09901186", "courseName": "電子學(一)", "optionName": "teacher1a", }, { "studentID": "610736", "courseName": "電子學實驗", "optionName": "teacher2a", }, { "studentID": "B09901186", "courseName": "電子學實驗", "optionName": "teacher2b", }, ] results = list_to_set(results) expected = list_to_set(expected) self.assertEqual(results, expected)
def test_20_4_courses2(self): # test for multiple courses student1 = Student( "Michael", "B09901186", { "course1": ["teacher1a", "teacher1b"], "course2": ["teacher2a", "teacher2b"], "course3": ["teacher3a", "teacher3b"], "course4": ["自動控制", "嵌入式系統", "電力電子"] }, 2) student2 = Student( "Mecoli", "610736", { "course1": ["teacher1a", "teacher1b"], "course2": ["teacher2a", "teacher2b"], "course3": ["teacher3a", "teacher3b"], "course4": ["自動控制", "電力電子", "嵌入式系統"] }, 3) student3 = Student( "Pekoli", "VIP8888", { "course1": ["teacher1a", "teacher1b"], "course2": ["teacher2a", "teacher2b"], "course3": ["teacher3a", "teacher3b"], "course4": ["電力電子", "嵌入式系統", "自動控制"] }, 3) student4 = Student( "Mike", "A123456", { "course1": ["teacher1a", "teacher1b"], "course2": ["teacher2a", "teacher2b"], "course3": ["teacher3a", "teacher3b"], "course4": ["嵌入式系統", "自動控制", "電力電子"] }, 4) students = [student1, student2, student3, student4] course1 = Course({ "id": "course1", "name": "電子學(一)", "type": "2", "description": "", "options": { "teacher1a": { "limit": 10, "priority": -1 }, "teacher1b": { "limit": 10, "priority": -1 } } }) course2 = Course({ "id": "course2", "name": "電磁學(一)", "type": "2", "description": "", "options": { "teacher2a": { "limit": 1, "priority": -1 }, "teacher2b": { "limit": 1, "priority": -1 } } }) course3 = Course({ "id": "course3", "name": "電子學實驗", "type": "EE-Lab", "description": "", "options": { "teacher3a": { "limit": 1, "priority": 0 }, "teacher3b": { "limit": 2, "priority": 0 } } }) course4 = Course({ "id": "course4", "name": "十選二實驗", "type": "Ten-Select-Two", "description": "", "options": { "電力電子": { "limit": 1, "priority": 0 }, "自動控制": { "limit": 1, "priority": 3 }, "嵌入式系統": { "limit": 1, "priority": 0 } } }) courses = [course1, course2, course3, course4] results = Algorithm.distribute(courses, students) results = list_to_set(results) self.assertEqual(len(results), 12)
def test_01_empty(self): students = [] courses = [] results = [] self.assertEqual(Algorithm.distribute(courses, students), results)