transformer.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. # -*- coding: utf-8 -*-
  2. # @Author : YY
  3. from types import NoneType
  4. from typing import Callable, List, Optional
  5. from datetime import datetime
  6. from typing_extensions import Annotated
  7. from pydantic import BeforeValidator, ValidationInfo
  8. from ruoyi_common.utils.base import DateUtil
  9. def ids_to_list(value:str) -> Optional[List[int]]:
  10. """
  11. 验证ids转换为字符串列表
  12. Args:
  13. value (str | NoneType): 传入参数
  14. Returns:
  15. Optional[List[str]]: 列表
  16. """
  17. return [int(i) for i in value.split(',')]
  18. def to_datetime(format=DateUtil.YYYY_MM_DD_HH_MM_SS) \
  19. -> Callable[[str|NoneType, ValidationInfo], datetime|NoneType]:
  20. """
  21. 根据指定格式,验证datetime
  22. Args:
  23. format (str): 日期格式. Defaults to '%Y-%m-%d %H:%M:%S'.
  24. """
  25. def validate_datetime(value:str|NoneType, info:ValidationInfo) \
  26. -> datetime|NoneType:
  27. """
  28. 验证datetime
  29. Args:
  30. value (str | NoneType): 传入参数
  31. info (ValidationInfo): pydantic的验证信息
  32. Raises:
  33. ValueError: 日期格式错误
  34. Returns:
  35. _type_: datetime
  36. """
  37. if value:
  38. if isinstance(value, str):
  39. return datetime.strptime(value, format)
  40. elif isinstance(value, datetime):
  41. return value
  42. raise ValueError(f"Invalid datetime format: {value}")
  43. else:
  44. return None
  45. return validate_datetime
  46. def str_to_int(value:str|NoneType, info:ValidationInfo) \
  47. -> int:
  48. """
  49. 验证str是否为整数,并转换为整数
  50. Args:
  51. value (str | NoneType): 传入参数
  52. info (ValidationInfo): pydantic的验证信息
  53. Raises:
  54. ValueError: 字符串格式错误
  55. Returns:
  56. int: 整数
  57. """
  58. if value:
  59. if isinstance(value, str):
  60. if value.isdecimal():
  61. return int(value)
  62. else:
  63. raise ValueError(f"Invalid str format, cannot convert to int: {value}")
  64. return value
  65. def int_to_str(value:int|NoneType)-> str:
  66. if isinstance(value, int):
  67. return str(value)
  68. else:
  69. return value
  70. ids_convertor = Annotated[List[int],BeforeValidator(ids_to_list)]