Exemple #1
0
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)
Exemple #10
0
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)