From 1db34e97941f21ab48cacd0784d84607940a02cd Mon Sep 17 00:00:00 2001 From: Egor Deev Date: Fri, 2 Oct 2026 13:07:38 +0000 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=20=D0=BF=D1=80=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=D0=BA=D1=88=D0=B5=D0=BD=D0=B0:=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=BE=D0=B4=D1=8B=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20?= =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=B3=D0=BE=D0=B4,=20=D1=81?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8,=20debug=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - период расписания вида 01.09–03.01 больше не даёт конец раньше начала: конец относится к следующему году; - занятия сортируются по времени начала как по числу, «9:00» больше не оказывается после «10:00»; - run.py запускает сервер без режима отладки. --- app/services/export.py | 4 ++-- app/services/schedule_helpers.py | 24 ++++++++++++++++++++---- run.py | 2 +- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/app/services/export.py b/app/services/export.py index 385cec0..d5f5026 100644 --- a/app/services/export.py +++ b/app/services/export.py @@ -66,7 +66,7 @@ def export_csv(schedule) -> bytes: def _build_week_view_active(schedule_data: list) -> dict: """Слоты по дням — только из периодов, которые ещё не закончились на сегодня.""" 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() days = {i: [] for i in range(7)} for item in schedule_data: @@ -106,7 +106,7 @@ def _build_week_view_active(schedule_data: list) -> dict: if key not in seen: seen.add(key) 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 diff --git a/app/services/schedule_helpers.py b/app/services/schedule_helpers.py index ed5c804..265778b 100644 --- a/app/services/schedule_helpers.py +++ b/app/services/schedule_helpers.py @@ -12,8 +12,13 @@ def _parse_date_range(dr: str): try: start_str, end_str = dr[:5], dr[6:] year = date.today().year - start = date(year, int(start_str[3:5]), int(start_str[0:2])) - end = date(year, int(end_str[3:5]), int(end_str[0:2])) + start_month, start_day = int(start_str[3:5]), int(start_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 except Exception: return None, None @@ -36,6 +41,17 @@ def _merge_same_subject(slots: list) -> dict: 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: """Группирует слоты по времени; один предмет — мёрджит поля; разные предметы — группа""" by_time = defaultdict(list) @@ -43,7 +59,7 @@ def _group_by_time(slots: list) -> list: by_time[slot.get('time') or ''].append(slot) 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] subjects = {s['subject'] for s in group} if len(subjects) == 1: @@ -87,7 +103,7 @@ def build_day_view(schedule_data: list, target_date: date) -> list: '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) diff --git a/run.py b/run.py index 8beb920..42d7f0c 100644 --- a/run.py +++ b/run.py @@ -6,4 +6,4 @@ from app import create_app app = create_app() if __name__ == '__main__': - app.run(debug=True) + app.run(debug=False)