task_views.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from django.http import JsonResponse
  2. from backend.wechat import WeChatMsg
  3. from .models import ServiceBooking, CreditRecord
  4. from math import ceil
  5. from django.core import serializers
  6. from .setting import APPLICATION_NAME
  7. def schedule_tasks(request, task_name):
  8. if task_name == 'count_credit':
  9. # 每天晚上2点执行,统计今天以前,所有没有统计时长的志愿者活动
  10. count_credit_list = ServiceBooking.count_credit_by_yesterday()
  11. for service_booking in count_credit_list:
  12. # 每小时计算一分
  13. start_time = service_booking.timeslot_id.start_time
  14. end_time = service_booking.timeslot_id.end_time
  15. time_delta = (end_time.hour + end_time.minute/60)-(start_time.hour + start_time.minute/60)
  16. time_delta = ceil(time_delta)
  17. if time_delta < 0: # 遇到跨天的情况
  18. time_delta += 24
  19. # 给用户算上总分和当前的分数
  20. volunteer = service_booking.volunteer_id
  21. volunteer.current_credit += time_delta
  22. volunteer.total_credit += time_delta
  23. volunteer.save()
  24. # 添加积分增加记录
  25. # credit_record = CreditRecord(volunteer, time_delta, '系统自动结算志愿者服务时长')
  26. # 这里不能用构造函数,会报错
  27. credit_record = CreditRecord()
  28. credit_record.volunteer = volunteer
  29. credit_record.admin = None
  30. credit_record.change = time_delta
  31. credit_record.reason = '系统自动结算志愿者服务时长'
  32. credit_record.save()
  33. # 保存积分已经分发的记录
  34. service_booking.counted_in_credit = True
  35. service_booking.save()
  36. return JsonResponse(serializers.serialize('json', count_credit_list), safe=False)
  37. if task_name == 'next_day_reminder':
  38. day = 1
  39. if request.GET.get('day'):
  40. day = int(request.GET.get('day'))
  41. reminder_booking_list = ServiceBooking.service_booking_reminder_list(day)
  42. wechat_reminder_list = []
  43. for booking in reminder_booking_list:
  44. wechat_reminder_list.append({
  45. 'name': booking.volunteer_id.name,
  46. 'id': booking.volunteer_id.ID,
  47. 'wechat_id': booking.volunteer_id.wechat_id,
  48. 'date': str(booking.timeslot_id.date),
  49. 'start_time': str(booking.timeslot_id.start_time),
  50. 'end_time': str(booking.timeslot_id.end_time),
  51. 'address': booking.timeslot_id.address,
  52. })
  53. for reminder in wechat_reminder_list:
  54. if reminder['wechat_id'] != '':
  55. wechat_msg = WeChatMsg(reminder['wechat_id'],
  56. 'JH-PgN9vm5bB8npDCQ6YKqYYzYpd6gSJSm-iaa_xwvg', APPLICATION_NAME)
  57. wechat_msg.set_first('志愿者服务提醒')
  58. wechat_msg.add_keyboard(reminder['address'])
  59. wechat_msg.add_keyboard('{} {}-{}'.format(reminder['date'], reminder['start_time'], reminder['end_time']))
  60. wechat_msg.set_remark('请准时参加志愿者服务,请勿无故缺席。如有紧急情况,请尽快与管理员联系。')
  61. wechat_msg.submit()
  62. return JsonResponse(wechat_reminder_list, safe=False, charset='utf-8')