Skip to content

Fix: address filter crash, Excel export with None fields, and GUI freeze - #327

Open
eminsk wants to merge 1 commit into
Duff89:masterfrom
eminsk:fix/geo-excel-gui-issues
Open

eminsk wants to merge 1 commit into
Duff89:masterfrom
eminsk:fix/geo-excel-gui-issues

Conversation

@eminsk

@eminsk eminsk commented Sep 4, 2026

Copy link
Copy Markdown

Комплексное исправление критических ошибок парсера, экспорта и GUI

PR устраняет взаимосвязанные проблемы и краевые сбои в обработке данных Avito, экспорте и графическом интерфейсе Flet.

1. Падение и краевые сбои фильтрации (Fixes #324)

  • Фильтр по адресу (filters/ads_filter.py): заменено некорректное обращение .get() на Pydantic-модели Item на безопасный доступ ad.geo.formattedAddress, добавлена нечувствительность к регистру и очистка пробелов (.strip().lower()).
  • Фильтр по диапазону цен: устранена критическая уязвимость, при которой наличие хотя бы одного объявления без цены (priceDetailed is None — обычное дело для вакансий или договорных цен) приводило к исключению в генераторе списка и аварийному возврату всех объявлений без фильтрации по цене. Теперь валидация производится поэлементно с дефолтом 0.
  • Проверка продвижения (isPromotion): добавлена защита от None в (step.payload or {}).get("vas") — ранее при значении vas: null в JSON возникало TypeError: 'NoneType' object is not iterable.
  • Устаревший вызов datetime.utcnow() заменен на datetime.now(timezone.utc).

2. Ошибки экспорта в Excel и базы данных (Fixes #325)

  • parser/export/excel.py:
    • Добавлена безопасная обработка объявлений без фото (ad.images is None), без цены (ad.priceDetailed is None), без ссылки (ad.urlPath is None) и без координат (ad.coords is None).
    • Обернуто в try/except извлечение даты публикации: поврежденные таймстампы больше не срывают экспорт всего файла.
    • Сохранено легитимное число просмотров 0 (ранее ad.total_views or "" заменяло 0 на пустую ячейку).
    • Защита от Formula Injection (=, +, -, @) для всех строковых полей.
  • db_service.py:
    • Безопасное извлечение цены при записи в SQLite-таблицу viewed при отсутствии priceDetailed.

3. Зависание интерфейса Flet и остановка парсера (Fixes #326)

  • AvitoParser.py:
    • Рабочий цикл парсера перенесен в отдельный поток _worker, освобождая UI-поток Flet для мгновенной реакции на кнопку «Стоп».
    • Удалена устаревшая неиспользуемая функция run_process() с блокирующим вызовом .join().
    • Завершение фонового потока и закрытие окна обернуты в безопасный перехват исключений.
  • parser_cls.py:
    • Исправлен сброс флага остановки: вместо ошибочной перезаписи self.stop_event = True (ломавшей объект threading.Event в булево значение) теперь вызывается self.stop_event.set().

Тестирование

Создан структурированный набор модульных тестов в директории tests/:

  • tests/test_ads_filter.py — проверка адресного фильтра, ценового диапазона с отсутствующими ценами, промо-пакетов с null и фильтра по времени.
  • tests/test_excel_export.py — проверка экспорта объявлений с None-полями, нулевыми просмотрами, защитой от CSV/Excel injection и координатами.
  • tests/test_db_service.py — проверка записи в SQLite записей без цены и проверки дубликатов.
  • tests/test_parser_cls.py — проверка сохранения объекта threading.Event, очистки null-объявлений и фильтрации.

Все 17 тестов успешно проходят (17 passed in 0.96s).

- Fix AttributeError in geo address filter by accessing Pydantic model attributes safely (fixes Duff89#324)
- Fix price range filter to validate items individually without dropping the whole batch on None price
- Safely handle None images, priceDetailed, urlPath, and sortTimeStamp in Excel export (fixes Duff89#325)
- Preserve integer 0 view count instead of empty string in Excel export
- Safely handle None in vas promotion payloads in parser_cls and ads_filter
- Run parser loop in worker thread to prevent Flet GUI freeze and allow stop button to respond (fixes Duff89#326)
- Fix stop_event handling in parser_cls by calling .set() instead of assigning bool (fixes Duff89#326)
- Add comprehensive unit test suite in tests/
@eminsk
eminsk force-pushed the fix/geo-excel-gui-issues branch from 8990aac to 62bfaed Compare September 4, 2026 16:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment