news_lists.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. """
  2. 获取在展示期内的所有卡片的列表
  3. """
  4. import datetime
  5. import re
  6. from homepagebuilder.interfaces import script, Logger
  7. LOGGER = Logger('NewsList')
  8. TIME_FORMAT = '%Y-%m-%d %H:%M:%S'
  9. DATE_FORMAT = '%Y-%m-%d'
  10. def strptime(date_str):
  11. """将字符串转换为datetime对象"""
  12. if not date_str:
  13. return None
  14. if isinstance(date_str, datetime.datetime):
  15. return date_str
  16. try:
  17. return datetime.datetime.strptime(date_str, TIME_FORMAT)
  18. except ValueError:
  19. try:
  20. return datetime.datetime.strptime(date_str, DATE_FORMAT)
  21. except ValueError:
  22. LOGGER.warning("无法解析日期字符串: %s", date_str)
  23. return None
  24. DELTA_PATTEN = re.compile(r'(?P<weeks>\d+w)?\s*(?P<days>\d+d)?\s*(?P<hours>\d+h)?\s*(?P<minutes>\d+m)?\s*(?P<seconds>\d+s)?')
  25. def strpdelta(time_str):
  26. """将字符串转换为datetime对象"""
  27. match = DELTA_PATTEN.match(time_str)
  28. if not match:
  29. return None
  30. weeks = int(match.group('weeks')[:-1]) if match.group('weeks') else 0
  31. days = int(match.group('days')[:-1]) if match.group('days') else 0
  32. hours = int(match.group('hours')[:-1]) if match.group('hours') else 0
  33. minutes = int(match.group('minutes')[:-1]) if match.group('minutes') else 0
  34. seconds = int(match.group('seconds')[:-1]) if match.group('seconds') else 0
  35. return datetime.timedelta(weeks=weeks, days=days, hours=hours, minutes=minutes, seconds=seconds)
  36. @script('NewsList')
  37. def news_list(context,**_):
  38. cardlist = []
  39. now = datetime.datetime.now()
  40. for card in context.project.get_all_card():
  41. card_name = card.get('card_id')
  42. disptime = card.get('display_time')
  43. hidetime = card.get('hide_time')
  44. timespan = card.get('display_span')
  45. expired = True
  46. disptime = strptime(disptime)
  47. hidetime = strptime(hidetime)
  48. timespan = strpdelta(timespan) if timespan else datetime.timedelta(seconds=0)
  49. if hidetime and now < hidetime:
  50. expired = False
  51. cardlist.append(card['card_id'])
  52. elif disptime and now < disptime + timespan:
  53. expired = False
  54. cardlist.append(card['card_id'])
  55. if disptime or hidetime:
  56. LOGGER.debug("%s [%s-%s][%s][%s]",
  57. card_name, disptime, hidetime, timespan, 'EXPIRED' if expired else 'VAILD')
  58. return str.join(';', cardlist)