from datetime import datetime from typing import Any from device_detector import DeviceDetector from pycountry import countries from pydantic import BaseModel, computed_field, field_validator class ShortUrl(BaseModel): short_url: str url: str is_personalized: bool created_at: datetime additional_attributes: dict[str, Any] | None = None class ShortUrlsUrl(BaseModel): short_url: str additional_attributes: dict[str, Any] | None = None class ShortUrls(BaseModel): short_urls: list[ShortUrlsUrl] url: str created_at: datetime class RequestInfo(BaseModel): client_ip: str | None user_agent: str | None country_code: str | None domain: str @field_validator("country_code") @classmethod def country_code_validator(cls, country_code: str | None) -> str | None: if not country_code or not countries.get(alpha_2=country_code): return None return country_code @computed_field def is_bot(self) -> bool | None: if self.user_agent: device = DeviceDetector(self.user_agent).parse() # pyright: ignore [reportArgumentType] if isinstance(device, DeviceDetector): return device.is_bot() return None