external_link.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from datetime import datetime
  2. from pydantic import BaseModel, Field, field_validator
  3. class ExternalLinkBase(BaseModel):
  4. """Base schema for external links."""
  5. name: str = Field(..., min_length=1, max_length=50, description="Display name for the link")
  6. url: str = Field(..., min_length=1, max_length=500, description="External URL")
  7. icon: str = Field(default="link", max_length=50, description="Lucide icon name")
  8. @field_validator("url")
  9. @classmethod
  10. def validate_url(cls, v: str) -> str:
  11. """Validate URL format."""
  12. if not v.startswith(("http://", "https://")):
  13. raise ValueError("URL must start with http:// or https://")
  14. return v
  15. class ExternalLinkCreate(ExternalLinkBase):
  16. """Schema for creating an external link."""
  17. pass
  18. class ExternalLinkUpdate(BaseModel):
  19. """Schema for updating an external link (all fields optional)."""
  20. name: str | None = Field(default=None, min_length=1, max_length=50)
  21. url: str | None = Field(default=None, min_length=1, max_length=500)
  22. icon: str | None = Field(default=None, max_length=50)
  23. @field_validator("url")
  24. @classmethod
  25. def validate_url(cls, v: str | None) -> str | None:
  26. """Validate URL format."""
  27. if v is not None and not v.startswith(("http://", "https://")):
  28. raise ValueError("URL must start with http:// or https://")
  29. return v
  30. class ExternalLinkResponse(ExternalLinkBase):
  31. """Response schema for external links."""
  32. id: int
  33. custom_icon: str | None = None
  34. sort_order: int
  35. created_at: datetime
  36. updated_at: datetime
  37. model_config = {"from_attributes": True}
  38. class ExternalLinkReorder(BaseModel):
  39. """Schema for reordering external links."""
  40. ids: list[int] = Field(..., description="List of link IDs in desired order")