import streamlit as st from dotenv import load_dotenv from app.app_config import ACCESS_SUPPORT_CONTACT, SFM_SMB_BASE_PATH, resolve_user_id from app.auth.service import AuthService, clear_session from app.path_settings import ( close_path_editor, ensure_user_path_state, get_resolved_input_dir, open_path_editor, render_path_editor, ) from app.path_store import set_user_path from app.pipeline.service import run_batch from app.samba_access import check_access_and_list_files def main() -> None: load_dotenv() st.set_page_config(page_title="СФМ", page_icon=":lock:", layout="wide") st.title("СФМ") if not AuthService().run(): return _, center_col, _ = st.columns([1, 2, 1]) with center_col: user_id = resolve_user_id() current_input_dir = ensure_user_path_state(user_id) resolved_input_dir = get_resolved_input_dir(user_id) st.subheader("Подключение к сетевому диску") samba_user = st.text_input( "Логин SAMBA", placeholder="Ivanov-IIv", help="Логин учетной записи для доступа к SMB-шаре.", ) samba_password = st.text_input( "Пароль SAMBA", type="password", placeholder="12345abc", help="Пароль учетной записи для доступа к SMB-шаре.", ) if st.button("Изменить путь", use_container_width=True): open_path_editor(current_input_dir) edited_path = render_path_editor() if edited_path is not None: ok, message, _ = check_access_and_list_files( smb_base_path=SFM_SMB_BASE_PATH, input_dir=edited_path, samba_user=samba_user, samba_password=samba_password, ) if ok: set_user_path(user_id, edited_path) close_path_editor() st.success("Путь сохранен.") st.rerun() else: st.error(f"{message} Обратитесь к {ACCESS_SUPPORT_CONTACT}.") resolved_input_dir = get_resolved_input_dir(user_id) st.caption(f"Текущий путь: `{resolved_input_dir}`") if st.button( "Запустить обработку xml в excel", type="primary", use_container_width=True, ): with st.spinner("Выполняется обработка..."): launcher_name = samba_user.strip() or user_id batch_result = run_batch( smb_base_path=SFM_SMB_BASE_PATH, input_dir=resolved_input_dir, samba_user=samba_user, samba_password=samba_password, launcher=launcher_name, ) if batch_result.status == "success": st.success("Обработка завершена успешно.") elif batch_result.status == "partial": st.warning("Обработка завершена частично.") else: st.error("Обработка завершена с ошибками.") st.write( { "processed": batch_result.processed, "partial": batch_result.partial, "errors": batch_result.errors, "report_path": batch_result.report_path, "protocol_path": batch_result.protocol_path, "log_path": batch_result.log_path, } ) if batch_result.messages: st.caption("Последние сообщения обработки:") for message in batch_result.messages: st.write(f"- {message}") if st.button("Проверить доступ к папке", use_container_width=True): ok, message, files = check_access_and_list_files( smb_base_path=SFM_SMB_BASE_PATH, input_dir=resolved_input_dir, samba_user=samba_user, samba_password=samba_password, ) if not ok: st.error(f"{message} Обратитесь к {ACCESS_SUPPORT_CONTACT}.") else: if files: st.success(f"Папка доступна. Найдено файлов: {len(files)}") st.write(files) else: st.info("Папка доступна, но пуста.") if st.button("Выйти", type="secondary"): clear_session() st.rerun() if __name__ == "__main__": main()