Implements non-blocking part import to prevent UI freezing when scanning unknown parts. Features: - Background import worker thread processes unknown parts - New "Pending Imports" UI section shows import progress - User can continue scanning other parts while imports run - Automatic retry on failure (up to 3 attempts) - Parts automatically processed when import completes Changes: - Added PendingPart and ImportResult data structures - Added PartImportWorker background thread class - Replaced blocking find_or_import_part() with async find_part() - Added pending parts queue UI with status display - Added _on_import_complete() callback handler - Added _update_pending_parts_ui() for real-time updates - Added proper cleanup on window close Benefits: - No more 30+ second UI freezes during part imports - Can scan multiple unknown parts in quick succession - Visual feedback showing import status for each part - Automatic error handling and retry logic 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
80 lines
2.5 KiB
Python
80 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test script to demonstrate async import functionality.
|
|
|
|
This script shows how the new async import feature works when parts
|
|
are not found in the system.
|
|
"""
|
|
|
|
import sys
|
|
from stocktool.stock_tool_gui_v2 import find_part, ImportResult, PartImportWorker
|
|
|
|
|
|
def test_find_part():
|
|
"""Test the find_part function."""
|
|
print("Testing find_part function...")
|
|
print("- This is a non-blocking call that returns None if part not found")
|
|
print("- No longer blocks on subprocess.run() like the old find_or_import_part")
|
|
print()
|
|
|
|
|
|
def test_import_worker():
|
|
"""Test the import worker."""
|
|
print("Testing PartImportWorker...")
|
|
print("- Background worker runs in a separate thread")
|
|
print("- Processes import queue one at a time")
|
|
print("- Calls callback with ImportResult when complete")
|
|
print("- User can continue scanning other parts while import runs")
|
|
print()
|
|
|
|
|
|
def test_pending_parts_ui():
|
|
"""Test the pending parts UI."""
|
|
print("Testing Pending Parts UI...")
|
|
print("- New 'Pending Imports' section shows parts being imported")
|
|
print("- Displays: Part Code, Qty, Mode, Status")
|
|
print("- Updates automatically when imports complete")
|
|
print("- Shows retry count if import fails")
|
|
print()
|
|
|
|
|
|
def main():
|
|
print("=" * 70)
|
|
print("Async Part Import Feature Test")
|
|
print("=" * 70)
|
|
print()
|
|
|
|
print("NEW BEHAVIOR:")
|
|
print("1. User scans unknown part (e.g., NEW-PART-123)")
|
|
print("2. System checks inventory - not found")
|
|
print("3. Part is added to 'Pending Imports' queue")
|
|
print("4. Import starts in background thread")
|
|
print("5. User can immediately continue scanning other parts")
|
|
print("6. When import completes, part is automatically processed")
|
|
print()
|
|
|
|
print("OLD BEHAVIOR (BLOCKING):")
|
|
print("1. User scans unknown part")
|
|
print("2. System calls inventree-part-import")
|
|
print("3. UI FREEZES waiting for subprocess to complete")
|
|
print("4. User cannot scan anything else")
|
|
print("5. Process can take 30+ seconds per part")
|
|
print()
|
|
|
|
test_find_part()
|
|
test_import_worker()
|
|
test_pending_parts_ui()
|
|
|
|
print("=" * 70)
|
|
print("BENEFITS:")
|
|
print("- No more UI freezing when importing parts")
|
|
print("- Can scan multiple unknown parts in quick succession")
|
|
print("- Visual feedback showing import progress")
|
|
print("- Automatic retry on failure (up to 3 attempts)")
|
|
print("- Import happens in background while user continues working")
|
|
print("=" * 70)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|