Пример #1
0
def add_sections_to_rooms(buildings,
                          filename,
                          intersession=False,
                          only_active=True,
                          debug=False,
                          include_all_rooms=False):
    with open(filename, 'rt', encoding='utf8') as csvfile:
        reader = csv.reader(csvfile)
        next(reader, None)  # skip the header

        date_format = "%m/%d/%y"

        n_prev = 5
        prev_rows = [None] * n_prev
        i_prev = 0

        alphabetic_zero_regex = re.compile(r"^[A-Z]0")
        for row in reader:
            if len(row) > 22:
                subject = row[1]
                number = row[2]
                title = row[5]
                primary_instructor = row[6]
                instructor_id = row[7]
                status = row[8]
                campus = row[9]
                start_date_str = row[16]
                end_date_str = row[17]
                building_code = row[18]
                room_number = row[19]
                meeting_days = row[20].split('/')
                start_time = row[21]
                end_time = row[22]

                if ~intersession and campus == "Intersession":
                    if debug: print("Intersession class excluded", row)
                    continue

                if only_active and status != "Active":
                    if debug: print("Not Active class excluded", row)
                    continue

                if len(start_date_str) < 1:
                    if debug: print("ERROR: Start date invalid XXXX ", row)

                end_date = datetime.strptime(end_date_str, date_format)
                start_date = datetime.strptime(start_date_str, date_format)

                enrollment_cap = int('0' + row[11])  # default to zero
                actual_enrollment = int('0' + row[12])  # default to zero

                # Replace ...'s with values from previous row if CRN is the same
                cur_crn = row[4]
                if "..." in {
                        title, primary_instructor, instructor_id, status,
                        campus
                }:
                    for prev_row in prev_rows:
                        if prev_row is None:
                            continue
                        prev_crn = prev_row[4]
                        if prev_crn == cur_crn:
                            title = prev_row[5]
                            primary_instructor = prev_row[6]
                            instructor_id = prev_row[7]
                            status = prev_row[8]
                            campus = prev_row[9]
                prev_rows[i_prev] = row
                i_prev = (i_prev + 1) % n_prev

                building = get_building_by_code(buildings, building_code)
                if building is not None:
                    if building_code == "SEC":
                        # For sarkeys numbering, remove padded zero
                        # M0204 -> M204
                        if alphabetic_zero_regex.match(
                                room_number) is not None:
                            room_number = room_number[0] + room_number[2:]
                    room = building.get_room(room_number)
                    if room is None and include_all_rooms:
                        room = Room(building, room_number, 1)
                        building.add_room(room)
                    if room is not None:
                        section = Section(subject, number, title,
                                          instructor_id, building, room,
                                          start_time, end_time, meeting_days,
                                          campus, enrollment_cap,
                                          actual_enrollment, start_date,
                                          end_date)
                        room.addSection(section, debug=debug)
                    else:
                        if debug:
                            print(
                                "Building {} Room {} not found in centrally scheduled rooms"
                                .format(building_code, room_number))
                else:
                    if debug:
                        print(
                            "Building {} not found in centrally scheduled rooms"
                            .format(building_code))

    return buildings