upgrade_1220.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. #: 升级用户模型
  4. #: 为提升`用户管理`模块的检索性能, 每次在用户完成充值|消费后,在记录充值|消费记录之后,应增加total_recharged|total_consumed字段
  5. #: 为将旧数据兼容,这里做处理
  6. import os
  7. import sys
  8. import datetime
  9. #: current_dir - 2
  10. PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
  11. sys.path.insert(0, PROJECT_ROOT)
  12. from script.base import init_env, get_logger
  13. init_env(interactive=True)
  14. from apps.web.user.models import RechargeRecord, ConsumeRecord, MyUser
  15. from apps.web.device.models import Group
  16. from apilib.utils_mongo import BulkHandler
  17. logger = get_logger(__name__)
  18. def insert_user_total_consumed_and_total_recharged():
  19. groups = Group.objects()
  20. users = MyUser.objects()
  21. start_time = datetime.datetime.now()
  22. user_bulk_handler = BulkHandler(MyUser.get_collection())
  23. for group in groups:
  24. groupId = str(group.id)
  25. for index, user in enumerate(users(groupId=groupId)):
  26. logger.info(u'No[%s] updating user(%s)' % (index+1, user.openId,))
  27. total_recharged_amount = float(sum( r.money for r in RechargeRecord.objects(openId=user.openId,
  28. groupId=groupId,
  29. via='recharge',
  30. result='success')))
  31. total_consumed_amount = \
  32. float(
  33. sum( r.coin for r in ConsumeRecord.objects(openId=user.openId, groupId=groupId, isNormal=True) ))
  34. user_bulk_handler.update(query_dict={
  35. 'groupId': user.groupId,
  36. 'openId': user.openId
  37. },
  38. update_dict={
  39. '$set':{
  40. 'total_recharged': total_recharged_amount,
  41. 'total_consumed': total_consumed_amount
  42. }})
  43. logger.info('start bulk update')
  44. result = user_bulk_handler.execute()
  45. if result['success'] == 0:
  46. logger.error('exception = %s' % result['info'])
  47. logger.info('finished, time cost=%s' % (datetime.datetime.now() - start_time,))
  48. insert_user_total_consumed_and_total_recharged()