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:
parent
8558a71b4c
commit
1db34e9794
3 changed files with 23 additions and 7 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
2
run.py
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue