force_device_unbind.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. """
  4. 将部分设备化为全新状态,原则上尽量不使用该功能
  5. """
  6. import os
  7. import sys
  8. import cPickle
  9. import itertools
  10. import xlrd
  11. import click
  12. #: current_dir - 2
  13. PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
  14. sys.path.insert(0, PROJECT_ROOT)
  15. from script.base import init_env, get_logger
  16. logger = get_logger(__name__)
  17. init_env(interactive = True)
  18. from apps.web.device.models import Device, DeviceDict
  19. from apps.web.dealer.models import Dealer
  20. def check(rows):
  21. for l in rows:
  22. device = Device.get_dev_by_logicalCode(l)
  23. click.echo(device['ownerId'])
  24. if device['ownerId']:
  25. click.echo('one target found, dev(logicalCode)=%s' % (l,))
  26. return
  27. @click.command()
  28. @click.option('-l', '--logicalcode', default = '')
  29. @click.option('-f', '--filepath', prompt = u'请输入要转换的表格文件路径', default = '')
  30. @click.option('-t', '--tablename', prompt = u'表名', default = 'Sheet0')
  31. @click.option('-a', '--agent', prompt = u'代理商的ID', default = '5abdebc68732d665bd804e66')
  32. def unbind(logicalcode, filepath, tablename, agent):
  33. if not any([logicalcode, filepath]):
  34. raise SystemExit('logicalcode filepath 必提供其一')
  35. if filepath:
  36. book = xlrd.open_workbook(filepath)
  37. sheet = book.sheet_by_name(tablename)
  38. raw_rows = (sheet.row_values(i) for i in range(1, sheet.nrows) if sheet.row_values(i))
  39. rows = set([str(int(_)) for _ in itertools.chain.from_iterable(raw_rows) if _])
  40. else:
  41. rows = logicalcode.split(',')
  42. click.echo('we are going to process(%d) devices' % (len(rows),))
  43. with open('before-processed-dump.pickle', 'w') as f:
  44. f.write(cPickle.dumps(rows))
  45. click.echo('before-processed-dump.pickle rows pickled saved')
  46. processed = []
  47. dev_no_list = []
  48. group_id_list = []
  49. for logicalCode in rows:
  50. try:
  51. device = Device.get_dev_by_logicalCode(logicalCode) # type: DeviceDict
  52. if not device.is_registered:
  53. continue
  54. dealer = Dealer.objects(id = str(device['ownerId'])).get()
  55. if dealer.agentId != agent:
  56. click.echo('not his device!!, logicalCode=%s, dealerId=%s' % (logicalCode, str(dealer.id)))
  57. continue
  58. dev_no_list.append(device.devNo)
  59. group_id_list.append(device.groupId)
  60. processed.append(logicalCode)
  61. except Exception, e:
  62. logger.exception('l=%s, error=%s' % (logicalCode, e,))
  63. with open('processed-dump.pickle', 'w') as f:
  64. f.write(cPickle.dumps(rows))
  65. try:
  66. emptyValue = {
  67. 'groupId': Device.groupId.default,
  68. 'devType': Device.devType.default,
  69. 'groupNumber': Device.groupNumber.default,
  70. 'expireDate': Device.expireDate.default,
  71. 'washConfig': Device.washConfig.default,
  72. 'remarks': Device.remarks.default,
  73. 'instructions': Device.instructions.default,
  74. 'ownerId': ''
  75. }
  76. Device.get_collection().update_many({'devNo': {'$in': dev_no_list}}, {'$set': emptyValue})
  77. finally:
  78. Device.invalid_many_device_cache(dev_no_list)
  79. Device.invalid_group_device_list_cache(group_id_list)
  80. click.echo('processed-dump.pickle saved')
  81. click.echo('you have processed %d entries' % (len(processed, )))
  82. click.echo('finished!')
  83. if __name__ == '__main__':
  84. unbind()