external_link.py 2.0 KB

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