vehicles.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # app/schemas/vehicles.py
  2. from typing import Literal, Optional
  3. from pydantic import BaseModel, Field
  4. # --- Vehicles ---
  5. class VehicleBase(BaseModel):
  6. id: str = Field(..., description="Unique vehicle identifier")
  7. name: str = Field(..., description="Vehicle display name")
  8. # --- Remote Information ---
  9. class RemoteInfo(BaseModel):
  10. """Git remote repository information."""
  11. name: str = Field(..., description="Remote name (e.g., 'ardupilot')")
  12. url: str = Field(..., description="Git repository URL")
  13. # --- Versions ---
  14. class VersionBase(BaseModel):
  15. id: str = Field(..., description="Unique version identifier")
  16. name: str = Field(..., description="Version display name")
  17. type: Literal["beta", "stable", "latest", "tag"] = Field(
  18. ..., description="Version type classification"
  19. )
  20. remote: RemoteInfo = Field(
  21. ..., description="Git remote repository information for the version"
  22. )
  23. commit_ref: Optional[str] = Field(
  24. None, description="Git reference (tag, branch name, or commit SHA)"
  25. )
  26. class VersionOut(VersionBase):
  27. vehicle_id: str = Field(
  28. ..., description="Vehicle identifier associated with this version"
  29. )
  30. # --- Boards ---
  31. class BoardBase(BaseModel):
  32. id: str = Field(..., description="Unique board identifier")
  33. name: str = Field(..., description="Board display name")
  34. class BoardOut(BoardBase):
  35. vehicle_id: str = Field(..., description="Associated vehicle identifier")
  36. version_id: str = Field(..., description="Associated version identifier")
  37. # --- Features ---
  38. class CategoryBase(BaseModel):
  39. id: str = Field(..., description="Unique category identifier")
  40. name: str = Field(..., description="Category display name")
  41. description: Optional[str] = Field(
  42. None, description="Category description"
  43. )
  44. class FeatureDefault(BaseModel):
  45. enabled: bool = Field(
  46. ..., description="Whether feature is enabled by default"
  47. )
  48. source: Literal["firmware-server", "build-options-py"] = Field(
  49. ...,
  50. description=(
  51. "Source of the default value: 'firmware-server' from "
  52. "firmware.ardupilot.org, 'build-options-py' from git repository"
  53. )
  54. )
  55. class FeatureBase(BaseModel):
  56. id: str = Field(..., description="Unique feature identifier/flag name")
  57. name: str = Field(..., description="Feature display name")
  58. category: CategoryBase = Field(..., description="Feature category")
  59. description: Optional[str] = Field(
  60. None, description="Feature description"
  61. )
  62. class FeatureOut(FeatureBase):
  63. vehicle_id: str = Field(..., description="Associated vehicle identifier")
  64. version_id: str = Field(..., description="Associated version identifier")
  65. board_id: str = Field(..., description="Associated board identifier")
  66. default: FeatureDefault = Field(
  67. ..., description="Default state for this feature on this board"
  68. )
  69. dependencies: list[str] = Field(
  70. default_factory=list,
  71. description="List of feature IDs that this feature depends on"
  72. )