Raykov-MS 721712d86a Accept several XML files and archives as attachments
The uploader took a single .zip, so a day split across several archives, or a
handful of loose XML files, needed one run each.

- main.py and scripts/local_zip_test_app.py now use accept_multiple_files and
  take .xml alongside .zip and the tar family. Each attachment is written to
  its own temp subdirectory, because two attachments may share a name.
- run_batch takes input_paths instead of zip_path.
- New app/pipeline/attachments.py flattens the attachments into a list of XML
  files. Archive format is detected from the content rather than the suffix,
  since exports arrive with the wrong extension often enough. .rar and .7z are
  recognised only to explain why they are refused.
- A broken attachment no longer aborts the run. It becomes one protocol row
  and the remaining attachments are still processed; the reason is also shown
  in the UI, not only in the protocol file.
- Files repeated across attachments are processed once and the repeats are
  recorded with status "skip". Attaching the same archive twice would
  otherwise double every row of the report.
- Archives are unpacked member by member with the target path checked against
  the extraction directory. tarfile.data_filter only exists from Python 3.11.4
  and extractall would otherwise let a "../" member escape.
- The protocol gains a "Вложение" column, so it is clear which attachment a
  file came from when names repeat across archives.

Checked end to end on the 03.02.2023 export: six attachments (two archives,
two loose XML files, one broken archive, one duplicate archive) give 57 files
processed, 9 repeats skipped, one attachment refused with its reason, and the
report is still produced.
2026-09-24 16:57:26 +03:00
2026-09-17 13:04:35 +03:00
fix
2026-08-11 01:09:07 +03:00
2026-06-04 14:13:30 +03:00
2026-06-04 14:13:30 +03:00
fix
2026-08-11 01:09:07 +03:00
2026-09-17 13:04:35 +03:00
2026-06-04 14:13:30 +03:00
2026-06-22 07:25:27 +03:00
2026-09-17 13:04:35 +03:00

SFM Streamlit

Production-ready Streamlit приложение для обработки ФЭС XML файлов в Excel-отчет и протокол с доступом к файлам через SAMBA (rail_connectors).

Архитектура

main.py
app/
  app_config.py            # константы приложения и user-id
  path_store.py            # JSON-хранилище персональных путей
  path_settings.py         # UI-модалка изменения пути
  samba_access.py          # проверка доступа к SAMBA папке
  auth/
    service.py             # orchestration auth/session
    providers.py
    mock_provider.py
  pipeline/
    config.py              # шаблоны имен/путей пайплайна
    file_manager.py        # scan/move/upload/download в SAMBA
    parser.py              # namespace-aware парсер ФЭС XML
    report.py              # генерация report.xlsx
    protocol.py            # генерация protocol.xlsx
    service.py             # run_batch orchestration
tests/
  unit/
  smoke/

Основной поток

  1. Пользователь вводит SAMBA логин/пароль.
  2. При необходимости меняет персональный input_dir (с pre-check доступа).
  3. Нажимает Запустить обработку xml в excel.
  4. Пайплайн:
    • сканирует входную папку;
    • невалидные имена переносит в Err;
    • валидные XML парсит и формирует строки отчета;
    • создает report.xlsx, protocol.xlsx, process.log;
    • сохраняет артефакты в Out/YYYY/MM_YYYY/YYYYMMDD/run_number/;
    • успешные файлы переносит в Processed.
  5. В UI отображаются счетчики и пути к артефактам.

Переменные окружения

Используются переменные авторизации Raisa (OPENBAO__SETTINGS__*).
SMBA source и дефолтный путь входа задаются в коде (app/app_config.py).

Быстрый старт

python -m venv .venv
.\.venv\Scripts\activate
pip install -r requirements.txt
copy .env.example .env
streamlit run main.py

Тесты и качество

pytest
ruff check .
black --check .
isort --check-only .

Pre-commit

pre-commit install
pre-commit run --all-files

Хуки:

  • black
  • isort
  • ruff
  • ruff-format
Description
No description provided
Readme 12 MiB
Languages
Python 100%