123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- """
- 将部分设备化为全新状态,原则上尽量不使用该功能
- """
- import os
- import sys
- import cPickle
- import itertools
- import xlrd
- import click
- #: current_dir - 2
- PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
- sys.path.insert(0, PROJECT_ROOT)
- from script.base import init_env, get_logger
- logger = get_logger(__name__)
- init_env(interactive = True)
- from apps.web.device.models import Device, DeviceDict
- from apps.web.dealer.models import Dealer
- def check(rows):
- for l in rows:
- device = Device.get_dev_by_logicalCode(l)
- click.echo(device['ownerId'])
- if device['ownerId']:
- click.echo('one target found, dev(logicalCode)=%s' % (l,))
- return
- @click.command()
- @click.option('-l', '--logicalcode', default = '')
- @click.option('-f', '--filepath', prompt = u'请输入要转换的表格文件路径', default = '')
- @click.option('-t', '--tablename', prompt = u'表名', default = 'Sheet0')
- @click.option('-a', '--agent', prompt = u'代理商的ID', default = '5abdebc68732d665bd804e66')
- def unbind(logicalcode, filepath, tablename, agent):
- if not any([logicalcode, filepath]):
- raise SystemExit('logicalcode filepath 必提供其一')
- if filepath:
- book = xlrd.open_workbook(filepath)
- sheet = book.sheet_by_name(tablename)
- raw_rows = (sheet.row_values(i) for i in range(1, sheet.nrows) if sheet.row_values(i))
- rows = set([str(int(_)) for _ in itertools.chain.from_iterable(raw_rows) if _])
- else:
- rows = logicalcode.split(',')
- click.echo('we are going to process(%d) devices' % (len(rows),))
- with open('before-processed-dump.pickle', 'w') as f:
- f.write(cPickle.dumps(rows))
- click.echo('before-processed-dump.pickle rows pickled saved')
- processed = []
- dev_no_list = []
- group_id_list = []
- for logicalCode in rows:
- try:
- device = Device.get_dev_by_logicalCode(logicalCode) # type: DeviceDict
- if not device.is_registered:
- continue
- dealer = Dealer.objects(id = str(device['ownerId'])).get()
- if dealer.agentId != agent:
- click.echo('not his device!!, logicalCode=%s, dealerId=%s' % (logicalCode, str(dealer.id)))
- continue
- dev_no_list.append(device.devNo)
- group_id_list.append(device.groupId)
- processed.append(logicalCode)
- except Exception, e:
- logger.exception('l=%s, error=%s' % (logicalCode, e,))
- with open('processed-dump.pickle', 'w') as f:
- f.write(cPickle.dumps(rows))
- try:
- emptyValue = {
- 'groupId': Device.groupId.default,
- 'devType': Device.devType.default,
- 'groupNumber': Device.groupNumber.default,
- 'expireDate': Device.expireDate.default,
- 'washConfig': Device.washConfig.default,
- 'remarks': Device.remarks.default,
- 'instructions': Device.instructions.default,
- 'ownerId': ''
- }
- Device.get_collection().update_many({'devNo': {'$in': dev_no_list}}, {'$set': emptyValue})
- finally:
- Device.invalid_many_device_cache(dev_no_list)
- Device.invalid_group_device_list_cache(group_id_list)
- click.echo('processed-dump.pickle saved')
- click.echo('you have processed %d entries' % (len(processed, )))
- click.echo('finished!')
- if __name__ == '__main__':
- unbind()
|