models.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from __future__ import annotations
  2. from enum import Enum
  3. from typing import Any
  4. from pydantic import BaseModel, Field
  5. class ComponentCategory(str, Enum):
  6. capacitor = "capacitor"
  7. resistor = "resistor"
  8. inductor = "inductor"
  9. diode = "diode"
  10. led = "led"
  11. ic = "ic"
  12. connector = "connector"
  13. crystal = "crystal"
  14. mosfet = "mosfet"
  15. sensor = "sensor"
  16. other = "other"
  17. class RowState(str, Enum):
  18. pending = "pending"
  19. scouting = "scouting"
  20. filtering = "filtering"
  21. confirmed = "confirmed"
  22. flagged = "flagged"
  23. class NormalizedParams(BaseModel):
  24. package: str | None = None
  25. value: float | None = None # SI base: F / Ω / H / Hz
  26. value_str: str | None = None # human-readable: "100nF", "10kΩ"
  27. unit: str | None = None # "F" | "Ω" | "H" | "Hz"
  28. voltage_rating: float | None = None
  29. current_rating: float | None = None
  30. power_rating: float | None = None
  31. tolerance: str | None = None # "5%", "10ppm"
  32. part_number: str | None = None # MPN if found in BOM
  33. manufacturer: str | None = None
  34. class BomRow(BaseModel):
  35. row_id: str
  36. designators: list[str] = Field(default_factory=list)
  37. quantity: int = 1
  38. raw_value: str
  39. footprint: str | None = None
  40. category: ComponentCategory
  41. normalized_params: NormalizedParams
  42. state: RowState = RowState.pending
  43. applied_filters: dict[str, Any] = Field(default_factory=dict)
  44. facet_groups: dict[str, Any] = Field(default_factory=dict)
  45. confirmed_pick: dict[str, Any] | None = None
  46. scout_candidates: list[dict[str, Any]] | None = None
  47. resolved_category_id: int | None = None
  48. resolved_category_name: str | None = None
  49. search_results: list[dict[str, Any]] = Field(default_factory=list)
  50. search_meta: dict[str, Any] = Field(default_factory=dict)
  51. class BomSession(BaseModel):
  52. session_id: str
  53. created_at: str
  54. filename: str
  55. preferred_suppliers: list[str] = Field(default_factory=list)
  56. rows: list[BomRow] = Field(default_factory=list)