[Bug] precision: datetime: дедупликация падает с TypeError (naive vs aware datetime) #58
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
При
period.precision: datetimeи заполненномperiod.last_used.toдедупликация time entries падает с ошибкой:Цепочка причин:
_compute_dedup_cutoff()(redmine_reporter/cli.py:126-129) приводит cutoff к timezone-aware:python-redmineвозвращаетcreated_on/updated_onкак naive datetime: redminelib парсит"2026-07-10T12:00:00Z"черезdatetime.strptime(value, "%Y-%m-%dT%H:%M:%SZ")(redminelib/resources/base.py), аtzinfoпроставляется только если в конструкторRedmine(...)передан параметрtimezone— проект его не передаёт (client.py:52-59).Сравнение
created >= dedup_beforeв цикле дедупликации (redmine_reporter/client.py:279-294) находится вне try-блока (try — строки 258-274), поэтомуTypeErrorне оборачивается вRedmineAPIError, а улетает в общийexcept Exceptionв CLI с непонятным «Unexpected error».Вторая проблема того же участка:
--commitсохраняетlast_used.toкак naive локальное время:При следующем запуске
_compute_dedup_cutoffинтерпретирует эту строку как UTC (replace(tzinfo=timezone.utc)). Для часового пояса ≠ UTC cutoff смещается на величину смещения зоны — записи могут дублироваться или теряться.Пример воспроизведения
Подтверждено экспериментом:
_parse_datetime(naive_dt) >= aware_cutoff→TypeError.Рекомендации
created_on/updated_onв_parse_datetimeтрактовать naive как UTC (redminelib отдаёт именно UTC-время в формате...Z).--commitсохранять aware UTC:datetime.now(timezone.utc).isoformat(timespec="seconds").RedmineAPIErrorс понятным сообщением.created_onпротив aware cutoff; roundtrip--commit→ чтение cutoff в часовом поясе ≠ UTC.Связанные места
redmine_reporter/cli.py:111-131(_compute_dedup_cutoff)redmine_reporter/cli.py:523-528(сохранениеlast_used.toв--commit)redmine_reporter/client.py:258-294(try-блок и цикл дедупликации)redmine_reporter/client.py(_parse_datetime)Критерии приёмки
last_used.toсохраняется в UTC с tzinfo; cutoff не зависит от локального часового пояса.RedmineAPIErrorс понятным текстом.