diff --git a/README.md b/README.md index 2c5759e..3cd8add 100644 --- a/README.md +++ b/README.md @@ -99,8 +99,8 @@ nginx (https://schedule.our-place.ru) → 127.0.0.1:8090 ошибка, число групп); - **вставить новую ссылку**: она проверяется скачиванием и разбором таблицы до сохранения — нерабочая не применится, данные на сайте не пострадают; -- **принудительно обновить расписание** — вне интервала и без проверки - «таблица не менялась» (то же, что делает фоновое обновление, но сейчас); +- **принудительно обновить расписание** — вне интервала, не дожидаясь + фонового обновления (интервал и так перечитывает таблицу целиком); - **задать интервал обновления** в минутах (`1…1440`). Как это устроено: @@ -128,7 +128,7 @@ src/ source.py загрузка файла по публичной ссылке Я.Диска lessons.py разбор ячеек занятий (общий конвейер ролей) parsing.py листы → расписание, недели, индексы преподавателей/аудиторий - cache.py ScheduleCache: блокировка, интервал, modified, stale-while-error + cache.py ScheduleCache: блокировка, интервал, stale-while-error settings.py хранилище настроек админки (ссылка, интервал) в JSON-файле errors.py ScheduleError frontend/ @@ -152,7 +152,7 @@ tests/ test_lessons.py все форматы ячеек test_xlsx.py чтение книги test_parsing.py разбор листов, недели, индексы - test_api.py API и поведение кэша (TTL/modified/stale, 404/400/502) + test_api.py API и поведение кэша (интервал/stale, 404/400/502) ``` ## API diff --git a/src/backend/main.py b/src/backend/main.py index a5c57a6..276f7b8 100644 --- a/src/backend/main.py +++ b/src/backend/main.py @@ -67,6 +67,13 @@ def default_settings() -> SettingsStore: def default_cache(settings: SettingsStore | None = None) -> ScheduleCache: settings = settings or default_settings() + if SCHEDULE_LINK and settings.link and settings.link != SCHEDULE_LINK: + log.warning( + "Ссылка в настройках (%s) отличается от SCHEDULE_LINK из окружения (%s); " + "работаем по ссылке из настроек — её видно и можно поменять в админке", + settings.link, + SCHEDULE_LINK, + ) return ScheduleCache(settings=settings, retry_after=RETRY_AFTER) diff --git a/src/backend/schedule/cache.py b/src/backend/schedule/cache.py index c30c7e7..0c5eb79 100644 --- a/src/backend/schedule/cache.py +++ b/src/backend/schedule/cache.py @@ -2,8 +2,9 @@ - однопоточная перезагрузка (lock): параллельные запросы во время загрузки ждут один download вместо N скачиваний; -- TTL (интервал обновления), а также проверка modified таблицы: если таблица - не менялась, скачивание не повторяется; +- интервал обновления: по его истечении таблица перечитывается целиком + (поле modified у публичной ссылки может «застыть», поэтому на него не + опираемся — оно только показывается в админке); - stale-while-error: если таблица перестала скачиваться, отдаём последнее удачное состояние и повторяем попытку не чаще, чем раз в retry_after секунд (вместо скачивания на каждый запрос); @@ -208,16 +209,10 @@ class ScheduleCache: if not self._link: self._fail(ScheduleError(NO_LINK_ERROR), now) return + # Обновление интервала всегда перечитывает таблицу: поле modified у + # публичной ссылки может «застыть» (кэш на стороне Диска), и тогда + # проверка «таблица не менялась» держала бы старые данные бесконечно. modified = fetch_table_modified(self._link) - if ( - self._data is not None - and modified is not None - and modified == self._modified - ): - # таблица не менялась — источник доступен, данные актуальны - self._loaded_at = now - self._error = None - return try: self._load(now, modified) except ScheduleError as exc: diff --git a/src/frontend/admin.html b/src/frontend/admin.html index c5a3579..4ec6887 100644 --- a/src/frontend/admin.html +++ b/src/frontend/admin.html @@ -80,7 +80,8 @@ -