Exemplo n.º 1
0
def assign_course_faculty(master_map):

    for room in master_map:

        for time_slot_key in master_map[room]:

            start = None
            end = None

            try:
                start, end = get_dates_from_key(time_slot_key)

            except:
                print(
                    f"****** ERROR: Invalid time slot key '{time_slot_key}' in room {room} ******"
                )
                print("Invigilation will not be done for this slot",
                      os.linesep)
                continue

            left_course = master_map[room][time_slot_key]["left_course"]
            right_course = master_map[room][time_slot_key]["right_course"]

            no_invigilator = master_map[room][time_slot_key][
                "left_invigilator"] is None and master_map[room][
                    time_slot_key]["right_invigilator"] is None

            if left_course is right_course and no_invigilator:

                faculty = left_course.get_available_faculty(start, end)

                if faculty is None:
                    continue

                master_map[room][time_slot_key]["left_invigilator"] = faculty
                faculty.duties.append(Duty(room, left_course, start, end))
                continue

            if master_map[room][time_slot_key]["left_invigilator"] is None:

                faculty = left_course.get_available_faculty(start, end)

                if faculty is None:
                    continue

                master_map[room][time_slot_key]["left_invigilator"] = faculty
                faculty.duties.append(Duty(room, left_course, start, end))

            if master_map[room][time_slot_key]["right_invigilator"] is None:

                faculty = right_course.get_available_faculty(start, end)

                if faculty is None:
                    continue

                master_map[room][time_slot_key]["right_invigilator"] = faculty
                faculty.duties.append(Duty(room, right_course, start, end))
Exemplo n.º 2
0
def assign_ics(master_map):

    ic_assigned_set = set()

    for room in master_map:

        for time_slot_key in master_map[room]:

            start = None
            end = None

            try:
                start, end = get_dates_from_key(time_slot_key)
            except:
                print(
                    f"****** ERROR: Invalid time slot key '{time_slot_key}' in room {room} ******"
                )
                print("Invigilation will not be done for this slot",
                      os.linesep)
                continue

            left_course = master_map[room][time_slot_key]["left_course"]
            right_course = master_map[room][time_slot_key]["right_course"]

            if (left_course is not None) and (left_course.code
                                              not in ic_assigned_set):
                ic_assigned_set.add(left_course.code)

                if left_course.ic is not None and left_course.ic.is_available(
                        start, end):
                    master_map[room][time_slot_key][
                        "left_invigilator"] = left_course.ic
                    left_course.ic.duties.append(
                        Duty(room, left_course, start, end))

                else:
                    print(
                        f"****** ERROR: IC not available at {left_course.code} timings ******"
                    )

            if (right_course is not None) and (right_course.code
                                               not in ic_assigned_set):
                ic_assigned_set.add(right_course.code)

                if right_course.ic is not None and right_course.ic.is_available(
                        start, end):
                    master_map[room][time_slot_key][
                        "right_invigilator"] = right_course.ic
                    right_course.ic.duties.append(
                        Duty(room, right_course, start, end))

                else:
                    print(
                        f"****** ERROR: IC not available at {right_course.code} timings ******"
                    )
Exemplo n.º 3
0
def assign_reserved_duties(master_map, invigilator_list, reserve_duties):

    assigned_set = set()
    dummy_course = Course("NA", "RESERVED DUTY")
    dummy_ic = Invigilator("NA", "NA", "NA", "NA", False)
    dummy_course.ic = dummy_ic

    for room in master_map:

        for time_slot_key in master_map[room]:

            start = None
            end = None

            try:
                start, end = get_dates_from_key(time_slot_key)
            except:
                continue

            if time_slot_key not in assigned_set:

                assigned_set.add(time_slot_key)

                for i in range(0, reserve_duties):

                    invigilator = get_reserved_invigilator(
                        invigilator_list, start, end)

                    if invigilator is None:
                        print(
                            f"****** ERROR: No reserve invigilator for {time_slot_key} ******")
                        continue

                    invigilator.duties.append(
                        Duty("C317", dummy_course, start, end))
Exemplo n.º 4
0
def assign_big_room_invigilators(master_map, invigilator_list, big_rooms):

    for room in master_map:

        if room not in big_rooms:
            continue

        for time_slot_key in master_map[room]:

            start = None
            end = None

            try:
                start, end = get_dates_from_key(time_slot_key)
            except:
                continue

            left_course = master_map[room][time_slot_key]["left_course"]
            right_course = master_map[room][time_slot_key]["right_course"]

            for course in (left_course, right_course):

                invigilator = get_secondary_invigilator(
                    course, invigilator_list, start, end)

                if invigilator is None:
                    print(
                        f"****** ERROR: Could not allot big room invigilator at '{time_slot_key}' in room {room} ******")
                    break

                invigilator.duties.append(Duty(room, course, start, end))
Exemplo n.º 5
0
def assign_big_course_invigilators(master_map, invigilator_list, big_course_cutoffs):

    extra_assigned_set = set()

    for room in master_map:

        for time_slot_key in master_map[room]:

            start = None
            end = None

            try:
                start, end = get_dates_from_key(time_slot_key)
            except:
                continue

            left_course = master_map[room][time_slot_key]["left_course"]
            right_course = master_map[room][time_slot_key]["right_course"]

            intervals = big_course_cutoffs

            if left_course.code not in extra_assigned_set:

                for value in intervals:

                    if left_course.enrolment_count >= value:
                        extra_invigilator = get_primary_invigilator(
                            left_course, invigilator_list, start, end)

                        if extra_invigilator is None:
                            extra_invigilator = get_secondary_invigilator(
                                left_course, invigilator_list, start, end)

                        if extra_invigilator is None:
                            print(
                                f"****** ERROR: No EXTRA Invigilators left for {left_course.code} @ {time_slot_key} ******")
                            continue

                        extra_invigilator.duties.append(
                            Duty("TBA", left_course, start, end))

                extra_assigned_set.add(left_course.code)

            if right_course.code not in extra_assigned_set:

                for value in intervals:

                    if right_course.enrolment_count >= value:

                        extra_invigilator = get_primary_invigilator(
                            right_course, invigilator_list, start, end)

                        if extra_invigilator is None:
                            extra_invigilator = get_secondary_invigilator(
                                right_course, invigilator_list, start, end)

                        if extra_invigilator is None:
                            print(
                                f"****** ERROR: No EXTRA Invigilators left for {right_course.code} @ {time_slot_key} ******")
                            continue

                        extra_invigilator.duties.append(
                            Duty("TBA", right_course, start, end))

                extra_assigned_set.add(right_course.code)
Exemplo n.º 6
0
def assign_invigilators(master_map, invigilator_list):

    for room in master_map:

        for time_slot_key in master_map[room]:

            start = None
            end = None

            try:
                start, end = get_dates_from_key(time_slot_key)
            except:
                continue

            left_course = master_map[room][time_slot_key]["left_course"]
            right_course = master_map[room][time_slot_key]["right_course"]
            left_invigilator = master_map[room][time_slot_key]["left_invigilator"]
            right_invigilator = master_map[room][time_slot_key]["right_invigilator"]

            if (left_invigilator is not None) and (right_invigilator is not None):
                continue

            elif (left_invigilator is None) and (right_invigilator is None):

                left_primary = get_primary_invigilator(
                    left_course, invigilator_list, start, end)
                right_primary = get_primary_invigilator(
                    right_course, invigilator_list, start, end)

                if (left_primary is None) and (right_primary is None):
                    print(
                        f"****** ERROR: Could not allot primary invigilator at '{room}' for '{right_course.code}'  ******")
                    continue

                elif left_primary is right_primary:

                    left_invigilator = left_primary
                    left_invigilator.duties.append(
                        Duty(room, left_course, start, end))

                    right_invigilator = get_secondary_invigilator(
                        right_course, invigilator_list, start, end)
                    right_invigilator.duties.append(
                        Duty(room, right_course, start, end))

                    master_map[room][time_slot_key]["left_invigilator"] = left_invigilator
                    master_map[room][time_slot_key]["right_invigilator"] = right_invigilator

                else:

                    if len(left_course.faculty) > len(right_course.faculty):

                        left_invigilator = left_primary

                        left_invigilator.duties.append(
                            Duty(room, left_course, start, end))

                        right_invigilator = get_secondary_invigilator(
                            right_course, invigilator_list, start, end)

                        right_invigilator.duties.append(
                            Duty(room, right_course, start, end))

                        master_map[room][time_slot_key]["left_invigilator"] = left_invigilator
                        master_map[room][time_slot_key]["right_invigilator"] = right_invigilator

                    else:
                        right_invigilator = right_primary

                        right_invigilator.duties.append(
                            Duty(room, right_course, start, end))

                        left_invigilator = get_secondary_invigilator(
                            left_course, invigilator_list, start, end)

                        left_invigilator.duties.append(
                            Duty(room, left_course, start, end))

                        master_map[room][time_slot_key]["left_invigilator"] = left_invigilator
                        master_map[room][time_slot_key]["right_invigilator"] = right_invigilator

            elif left_invigilator is None:

                left_invigilator = get_secondary_invigilator(
                    left_course, invigilator_list, start, end)

                if left_invigilator is None:
                    print(
                        f"****** ERROR: Could not allot secondary invigilator at '{room}' for '{left_course.code}'  ******")
                    continue

                left_invigilator.duties.append(
                    Duty(room, left_course, start, end))
                master_map[room][time_slot_key]["left_invigilator"] = left_invigilator

            elif right_invigilator is None:

                right_invigilator = get_secondary_invigilator(
                    right_course, invigilator_list, start, end)

                if right_invigilator is None:
                    print(
                        f"****** ERROR: Could not allot secondary invigilator at '{room}' for '{right_course.code}'  ******")
                    continue

                right_invigilator.duties.append(
                    Duty(room, right_course, start, end))
                master_map[room][time_slot_key]["right_invigilator"] = right_invigilator