# coding=utf-8 import csv import datetime from tqdm import tqdm from base import init_env init_env(False) from apps.web.device.models import Device, DeviceDict, Group from apilib.monetary import VirtualCoin from apps.web.user.models import MyUser # class CoinError(Exception): # pass # # # notEqualDevs = list() # notWashDevs = list() # # for _dev in Device.objects.only("washConfig", "id", "ownerId", "devNo"): # if not _dev.ownerId: # continue # washConfig = _dev.washConfig # try: # for _wash in washConfig.values(): # if _wash["price"] != _wash["coins"]: # raise CoinError() # except CoinError: # notEqualDevs.append(_dev.devNo) # except Exception as e: # notWashDevs.append(_dev.devNo) # # notEqualMap = list() # notWashMap = list() # for _devNo in notEqualDevs: # print _devNo # dealer = Dealer.get_dealer(Device.get_dev(_devNo).ownerId) # if not dealer: # continue # notEqualMap.append({"devNo": _devNo, "dealer": "{}-{}".format(dealer.get("id"), dealer.get("username"))}) # # # for _devNo in notWashDevs: # dealer = Dealer.get_dealer(Device.get_dev(_devNo).ownerId) # if not dealer: # continue # notWashMap.append({"devNo": _devNo, "dealer": "{}-{}".format(dealer.get("id"), dealer.get("username"))}) # # headers = ["devNo", "dealer"] # with open("notEqual.csv", "w") as f: # w = csv.DictWriter(f, fieldnames=headers) # w.writeheader() # w.writerows(notEqualMap) # # with open("notWash.csv", "w") as f: # w = csv.DictWriter(f, fieldnames=headers) # w.writeheader() # w.writerows(notWashMap) from collections import namedtuple DealerInfo = namedtuple("DealerInfo", ["id", "devCount", "offlineDevCount", "userCount", "coinCount"]) def read_csv(): with open("notEqual.csv", "r") as f: csvReader = csv.DictReader(f) data = [row.get("dealer").split("-")[0] for row in csvReader] return set(data) def get_dev_count(dealerInfo): # type: (DealerInfo) -> int dealerId = dealerInfo.id devCount = Device.objects.filter(ownerId=dealerId).count() return devCount def get_offline_dev_count(dealerInfo): # type: (DealerInfo) -> int dealerId = dealerInfo.id groupIds = Group.get_group_ids_of_dealer(dealerId) devNos = Device.get_devNos_by_group(groupIds) count = 0 for _devNo in devNos: dev = Device.get_dev(_devNo) # type: DeviceDict if not dev.online and datetime.datetime.fromtimestamp(int(str(Device.get_dev("867435053358115").offTime)[0:10])) < datetime.datetime(2021, 2, 1): count += 1 return count def get_user_count(dealerInfo): # type:(DealerInfo) -> int dealerId = dealerInfo.id groupIds = Group.get_group_ids_of_dealer(dealerId) return MyUser.objects.filter(groupId__in=groupIds).count() def get_user_coin_count(dealerInfo): dealerId = dealerInfo.id groupIds = Group.get_group_ids_of_dealer(dealerId) users = MyUser.objects.filter(groupId__in=groupIds).only("balance", "groupId") return sum((_user.balance for _user in users), VirtualCoin(0)) def main(): dealerIds = read_csv() resultList = list() for _id in tqdm(dealerIds): dealerInfo = DealerInfo(id=_id, devCount=-1, offlineDevCount=-1, userCount=-1, coinCount=-1) devCount = get_dev_count(dealerInfo) offDevCount = get_offline_dev_count(dealerInfo) userCount = get_user_count(dealerInfo) coinCount = get_user_coin_count(dealerInfo) dealerInfo = dealerInfo._replace(devCount=devCount, offlineDevCount=offDevCount, userCount=userCount, coinCount=coinCount) resultList.append(dealerInfo._asdict()) with open("notEqualDealer.csv", "w") as f: w = csv.DictWriter(f, fieldnames=resultList[0].keys()) w.writeheader() w.writerows(resultList) if __name__ == '__main__': main()