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:
|
||||
"""Слоты по дням — только из периодов, которые ещё не закончились на сегодня."""
|
||||
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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
|||
2
run.py
2
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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue