# -*- 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()