1
0
Fork 0
mirror of https://github.com/EDeev/tablo.git synced 2026-10-07 20:49:31 +03:00

Исправления с продакшена: периоды через Новый год, сортировка по времени, debug выключен

- период расписания вида 01.09–03.01 больше не даёт конец раньше начала: конец
  относится к следующему году;
- занятия сортируются по времени начала как по числу, «9:00» больше не оказывается
  после «10:00»;
- run.py запускает сервер без режима отладки.
This commit is contained in:
Деев Егор Викторович 2026-10-02 13:07:38 +00:00
parent 8558a71b4c
commit 1db34e9794
3 changed files with 23 additions and 7 deletions

View file

@ -66,7 +66,7 @@ def export_csv(schedule) -> bytes:
def _build_week_view_active(schedule_data: list) -> dict: def _build_week_view_active(schedule_data: list) -> dict:
"""Слоты по дням — только из периодов, которые ещё не закончились на сегодня.""" """Слоты по дням — только из периодов, которые ещё не закончились на сегодня."""
from datetime import date from datetime import date
from app.services.schedule_helpers import _parse_date_range from app.services.schedule_helpers import _parse_date_range, _time_sort_key
today = date.today() today = date.today()
days = {i: [] for i in range(7)} days = {i: [] for i in range(7)}
for item in schedule_data: for item in schedule_data:
@ -106,7 +106,7 @@ def _build_week_view_active(schedule_data: list) -> dict:
if key not in seen: if key not in seen:
seen.add(key) seen.add(key)
unique.append(s) unique.append(s)
days[i] = sorted(unique, key=lambda s: s.get('time') or '') days[i] = sorted(unique, key=lambda s: _time_sort_key(s.get('time')))
return days return days

View file

@ -12,8 +12,13 @@ def _parse_date_range(dr: str):
try: try:
start_str, end_str = dr[:5], dr[6:] start_str, end_str = dr[:5], dr[6:]
year = date.today().year year = date.today().year
start = date(year, int(start_str[3:5]), int(start_str[0:2])) start_month, start_day = int(start_str[3:5]), int(start_str[0:2])
end = date(year, int(end_str[3:5]), int(end_str[0:2])) end_month, end_day = int(end_str[3:5]), int(end_str[0:2])
start = date(year, start_month, start_day)
# Период может пересекать Новый год (например "01.09-03.01") —
# тогда конец периода относится к следующему году
end_year = year if (end_month, end_day) >= (start_month, start_day) else year + 1
end = date(end_year, end_month, end_day)
return start, end return start, end
except Exception: except Exception:
return None, None return None, None
@ -36,6 +41,17 @@ def _merge_same_subject(slots: list) -> dict:
return merged return merged
def _time_sort_key(time_str):
"""Ключ сортировки по времени начала занятия (устойчив к '9:00' вместо '09:00')"""
if time_str:
try:
h, m = time_str.split('-', 1)[0].strip().split(':')
return (int(h), int(m))
except (ValueError, IndexError):
pass
return (99, 99)
def _group_by_time(slots: list) -> list: def _group_by_time(slots: list) -> list:
"""Группирует слоты по времени; один предмет — мёрджит поля; разные предметы — группа""" """Группирует слоты по времени; один предмет — мёрджит поля; разные предметы — группа"""
by_time = defaultdict(list) by_time = defaultdict(list)
@ -43,7 +59,7 @@ def _group_by_time(slots: list) -> list:
by_time[slot.get('time') or ''].append(slot) by_time[slot.get('time') or ''].append(slot)
result = [] result = []
for time_key in sorted(by_time.keys()): for time_key in sorted(by_time.keys(), key=_time_sort_key):
group = by_time[time_key] group = by_time[time_key]
subjects = {s['subject'] for s in group} subjects = {s['subject'] for s in group}
if len(subjects) == 1: if len(subjects) == 1:
@ -87,7 +103,7 @@ def build_day_view(schedule_data: list, target_date: date) -> list:
'day': day_name, 'day': day_name,
}) })
raw.sort(key=lambda x: x.get('time') or '') raw.sort(key=lambda x: _time_sort_key(x.get('time')))
return _group_by_time(raw) return _group_by_time(raw)

2
run.py
View file

@ -6,4 +6,4 @@ from app import create_app
app = create_app() app = create_app()
if __name__ == '__main__': if __name__ == '__main__':
app.run(debug=True) app.run(debug=False)