transformer.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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=None) -> Callable[[str | NoneType, ValidationInfo], datetime | NoneType]:
  19. """
  20. 根据指定格式,验证datetime
  21. Args:
  22. format (str): 日期格式. Defaults to '%Y-%m-%d %H:%M:%S'.
  23. """
  24. if format is None:
  25. formats: List[str] = [DateUtil.YYYY_MM_DD_HH_MM_SS, DateUtil.YYYY_MM_DD]
  26. elif isinstance(format, (list, tuple, set)):
  27. formats = list(format)
  28. else:
  29. formats = [format]
  30. def validate_datetime(value: str | NoneType, info: ValidationInfo) -> datetime | NoneType:
  31. """
  32. 验证datetime
  33. Args:
  34. value (str | NoneType): 传入参数
  35. info (ValidationInfo): pydantic的验证信息
  36. Raises:
  37. ValueError: 日期格式错误
  38. Returns:
  39. _type_: datetime
  40. """
  41. if not value:
  42. return None
  43. if isinstance(value, datetime):
  44. return value
  45. if isinstance(value, str):
  46. for fmt in formats:
  47. try:
  48. return datetime.strptime(value, fmt)
  49. except ValueError:
  50. continue
  51. raise ValueError(f"time data '{value}' does not match formats: {formats}")
  52. raise ValueError(f"Invalid datetime format: {value}")
  53. return validate_datetime
  54. def str_to_int(value:str|NoneType, info:ValidationInfo) \
  55. -> int:
  56. """
  57. 验证str是否为整数,并转换为整数
  58. Args:
  59. value (str | NoneType): 传入参数
  60. info (ValidationInfo): pydantic的验证信息
  61. Raises:
  62. ValueError: 字符串格式错误
  63. Returns:
  64. int: 整数
  65. """
  66. if value:
  67. if isinstance(value, str):
  68. if value.isdecimal():
  69. return int(value)
  70. else:
  71. raise ValueError(f"Invalid str format, cannot convert to int: {value}")
  72. return value
  73. def int_to_str(value:int|NoneType)-> str:
  74. if isinstance(value, int):
  75. return str(value)
  76. else:
  77. return value
  78. ids_convertor = Annotated[List[int],BeforeValidator(ids_to_list)]