Скрытое в таблице не парсим

Правило: если строка или столбец в таблице скрыт, его данные не попадают в
расписание — раньше скрытые столбцы пропускались только при поиске групп.

- xlsx: у листа появился набор скрытых строк (Worksheet.hidden_rows);
- расписание, недели: скрытые строки пропускаются;
- аудитории и справочник ФИО: скрытые столбцы не читаются вовсе (убрана
  двухпроходная логика «сначала видимые, потом скрытые»);
- тесты: билдер умеет скрытые строки, добавлены проверки «скрытое не парсится».

Проверено на таблице: группы и всё расписание совпали байт в байт (скрытых
строк нет), из аудиторий ушли только те, что лежат в скрытых столбцах
(402, 405, 415), справочник ФИО стал короче на 2 скрытые записи, у 223
осталось описание из видимого столбца (20 мест, интерактивная панель).
Тесты: 171.
This commit is contained in:
2026-10-12 12:07:39 +03:00
parent 172636f227
commit d131adbcb8
4 changed files with 44 additions and 17 deletions

View File

@@ -302,7 +302,7 @@ def test_lowercase_except_abbreviations():
def test_room_visible_column_wins_over_hidden_duplicate():
"""У 223 в таблице два столбца: видимый (с панелью) и скрытый (без). Берём видимый."""
"""Скрытый столбец-дубль (у 223) не парсится вовсе — берём видимый."""
from xlsx_builder import SheetSpec
spec = SheetSpec(
@@ -322,8 +322,8 @@ def test_room_visible_column_wins_over_hidden_duplicate():
assert room["type"] == "комп.класс linux/windows"
def test_room_only_in_hidden_column_still_parsed():
"""Аудитория, у которой есть только скрытый столбец, не пропадает."""
def test_room_only_in_hidden_column_not_parsed():
"""Скрытое не парсим: аудитория со скрытым столбцом описания не получает."""
from xlsx_builder import SheetSpec
spec = SheetSpec(
@@ -334,5 +334,24 @@ def test_room_only_in_hidden_column_still_parsed():
hidden_cols=[(6, 7)],
)
info = parsing.parse_rooms_info(make_sheets({parsing.ROOMS_SHEET: spec}))
assert info["ауд. 402"]["available_days"] == ["четверг", "пятница"]
assert info["ауд. 410"]["capacity"] == 30
assert info == {}
def test_hidden_rows_not_parsed(monkeypatch):
"""Скрытые строки листа в расписание не попадают."""
from fixtures import fixture_sheets
from xlsx_builder import SheetSpec, build_workbook
sheets = fixture_sheets()
main = sheets[parsing.MAIN_SHEET]
# строки: 0 заголовок, 1 с/по, 2..5 понедельник, 6..7 вторник — скроем строку с первым вторником
spec = SheetSpec(
rows=main.rows,
merges=main.merges,
hidden_cols=main.hidden_cols,
hidden_rows=[6],
)
data = parsing.parse_schedule(make_sheets({parsing.MAIN_SHEET: spec}))
tuesday = data["ИВТ-11БО"]["days"].get("вторник", {})
assert not tuesday, "строка вторника скрыта — занятий быть не должно"
assert data["ИВТ-11БО"]["days"]["понедельник"][1]["ч"] # понедельник на месте

View File

@@ -28,6 +28,7 @@ class SheetSpec:
rows: list[list]
merges: list[str] = field(default_factory=list)
hidden_cols: list[tuple[int, int]] = field(default_factory=list) # 0-based, инклязивно
hidden_rows: list[int] = field(default_factory=list) # 0-based
def build_workbook(sheets: dict[str, SheetSpec]) -> bytes:
@@ -83,7 +84,8 @@ def build_workbook(sheets: dict[str, SheetSpec]) -> bytes:
t = f' t="{t_attr}"' if t_attr else ""
cells.append(f'<c r="{col_letter(c)}{r}"{t}><v>{escape(str(v))}</v></c>')
if cells:
row_xml.append(f'<row r="{r}">{"".join(cells)}</row>')
hidden = ' hidden="1"' if (r - 1) in spec.hidden_rows else ""
row_xml.append(f'<row r="{r}"{hidden}>{"".join(cells)}</row>')
merges_xml = ""
if spec.merges: