From 774b3c107abe4990cb1eb1ac9ff0efad7b727ac3 Mon Sep 17 00:00:00 2001 From: bashmak Date: Sat, 18 Mar 2017 15:15:50 +0300 Subject: [PATCH] FIXBUG --- djing/utils/load_from_nodeny.py | 69 ++++++------ djing/utils/save_from_nodeny.py | 190 ++++++++++++++++++++++---------- 2 files changed, 171 insertions(+), 88 deletions(-) diff --git a/djing/utils/load_from_nodeny.py b/djing/utils/load_from_nodeny.py index 10e005d..30cadb2 100755 --- a/djing/utils/load_from_nodeny.py +++ b/djing/utils/load_from_nodeny.py @@ -1,48 +1,55 @@ -#!/bin/env python2 +#!/bin/env python3 # coding=utf-8 -import os import MySQLdb from json import dumps -if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") - - db = MySQLdb.connect(host="localhost", user="root", passwd="PASSWORD", db="nodeny", charset='utf8') - cursor = db.cursor() - - result = dict() +def load_users(cursor, grp_id): # выбираем абонентов - sql = r"SELECT users.name, users.fio, data0._adr_telefon, dictionary.v, data0._adr_house, data0._birthday, users.grp FROM users LEFT JOIN data0 ON (data0.uid=users.id) LEFT JOIN dictionary ON (dictionary.k=data0._adr_street AND dictionary.type='street') WHERE users.grp=23" + sql = r"SELECT users.name, users.fio, data0._adr_telefon, dictionary.v AS street, data0._adr_house, data0._birthday, users.grp, INET_NTOA(ip_pool.ip) AS ip, users.balance, AES_DECRYPT(users.passwd, 'Vu6saiZa') as decr_passwd FROM users LEFT JOIN data0 ON (data0.uid = users.id) LEFT JOIN dictionary ON (dictionary.k = data0._adr_street AND dictionary.type = 'street') LEFT JOIN ip_pool ON (ip_pool.uid = users.id) WHERE users.grp = %d" % grp_id cursor.execute(sql) - result['users'] = list() - res = cursor.fetchone() - while res: - result['users'].append({ - 'name': res[0], - 'fio': res[1], - 'tel': res[2], - 'addr': u"ул. %s д. %s" % (res[3], res[4]), - 'birth': int(res[5]), - 'grp': int(res[6]) - }) - res = cursor.fetchone() - + users = [{ + 'name': str(res[0]), + 'fio': str(res[1]), + 'tel': str(res[2]), + 'street': str(res[3] or ''), + 'house': str(res[4]), + 'birth': res[5], + 'grp': int(res[6]), + 'ip': str(res[7] or ''), + 'balance': float(res[8]), + 'passw': res[9].decode("utf-8") if res[9] is not None else '' + } for res in cursor.fetchall()] + return users + + + +def load_groups(cursor): # выбираем группы sql = r'SELECT grp_id, grp_name FROM user_grp' cursor.execute(sql) - result['groups'] = list() - res = cursor.fetchone() - while res: - result['groups'].append({ + groups = list() + for res in cursor.fetchall(): + users = load_users(cursor=cursor, grp_id=int(res[0])) + groups.append({ 'gid': int(res[0]), - 'gname': res[1] + 'gname': res[1], + 'users': users }) - res = cursor.fetchone() + return groups + + + +if __name__ == "__main__": + db = MySQLdb.connect(host="127.0.0.1", user="", passwd="", db="db", charset='utf8') + cursor = db.cursor() + + result = dict() + result['groups'] = load_groups(cursor=cursor) db.close() - f = open('dump_chkal.json', 'w') - f.write(dumps(result, ensure_ascii=False).encode('utf8')) + f = open('dump.json', 'w') + f.write(dumps(result, ensure_ascii=False)) f.close() diff --git a/djing/utils/save_from_nodeny.py b/djing/utils/save_from_nodeny.py index f575aba..a1f1acd 100755 --- a/djing/utils/save_from_nodeny.py +++ b/djing/utils/save_from_nodeny.py @@ -4,67 +4,143 @@ import os from json import load import django +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") +django.setup() +from abonapp.models import Abon, AbonGroup, AbonRawPassword, AbonStreet +from ip_pool.models import IpPoolItem -if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") - django.setup() - from abonapp.models import Abon, AbonGroup, AbonTariff, AbonRawPassword - from ip_pool.models import IpPoolItem - from tariff_app.models import Tariff - from accounts_app.models import UserProfile - - with open('dump_pshen.json', 'r') as f: - dat = load(f) - #for dt in dat['groups']: - # try: - # grp = AbonGroup.objects.get(title=dt['gname']) - # except AbonGroup.DoesNotExist: - # grp = AbonGroup(title=dt['gname']) - # grp.save() - # dt['obj'] = grp - - grp = AbonGroup.objects.get(id=43) - pshen_trf = Tariff.objects.get(id=3) - print(pshen_trf) - iam = UserProfile.objects.get(id=1) - for dt in dat['users']: - #grp = [gr for gr in dat['groups'] if dt['grp']==gr['gid']] - #grp = grp[0]['obj'] if len(grp)>0 else None +class DumpAbon(object): + + def __init__(self, obj=None): + if obj is None: return + self.name = obj['name'] + self.fio = obj['fio'] + self.tel = obj['tel'] + self.street = obj['street'] + self.house = obj['house'] + self.birth = obj['birth'] + self.grp = obj['grp'] + self.ip = obj['ip'] + self.balance = obj['balance'] + self.passw = obj['passw'] + + @staticmethod + def build_from_django(obj): + assert isinstance(obj, Abon) + self = DumpAbon() + self.name = obj.username + self.fio = obj.fio + self.tel = obj.telephone + self.street = obj.street + self.house = obj.house + self.birth = obj.birth_day + self.grp = obj.group.pk + self.ip = obj.ip_address + self.balance = obj.ballance try: - abon = Abon.objects.get(username=dt['name']) - except Abon.DoesNotExist: - abon = Abon(username=dt['name']) + raw_passw = AbonRawPassword.objects.get(account=obj) + except AbonRawPassword.DoesNotExist: + raw_passw = '' + self.passw = raw_passw + return self + + def __eq__(self, other): + assert isinstance(other, DumpAbon) + r = self.name == other.name + r = r and self.name == other.name + r = r and self.fio == other.fio + r = r and self.tel == other.tel + r = r and self.street == other.street + r = r and self.house == other.house + r = r and self.birth == other.birth + r = r and self.grp == other.grp + r = r and self.ip == other.ip + r = r and self.balance == other.ballance + return r + + def __ne__(self, other): + return not self.__eq__(other) + + +def load_users(obj, group): + for usr in obj: + # абонент из дампа + dump_abon = DumpAbon(usr) + # абонент из биллинга + print('\t', dump_abon.name, dump_abon.fio, dump_abon.ip) try: - ip_addr = IpPoolItem.objects.get(ip=dt['ip']) - except IpPoolItem.DoesNotExist: - ip_addr = None - abon.fio = dt['fio'] - abon.telephone=dt['tel'] - abon.house=dt['addr'] - abon.group=grp - abon.ballance=dt['balance'] - abon.ip_address=ip_addr - abon.set_password(dt['passw']) - abon.save() + abon = Abon.objects.get(username=dump_abon.name) + bl_abon = DumpAbon.build_from_django(abon) + if bl_abon != dump_abon: + update_user(abon, dump_abon, group) + except Abon.DoesNotExist: + # добавляем абонента + add_user(dump_abon, group) + + +def add_user(obj, user_group): + assert isinstance(obj, DumpAbon) + street = None + ip = None + try: + ip = IpPoolItem.objects.get(ip=obj.ip) + street = AbonStreet.objects.get(name=obj.street) + except IpPoolItem.DoesNotExist: + ip = IpPoolItem.objects.create(ip=obj.ip) + except AbonStreet.DoesNotExist: + street = AbonStreet.objects.create(name=obj.street, group=user_group) + + Abon.objects.create( + username=obj.name, + fio=obj.fio, + telephone=obj.tel, + street=street, + house=obj.house, + birth_day=obj.birth, + group = user_group, + ip_address=ip, + ballance=obj.balance + ) + + +def update_user(db_abon, obj, user_group): + assert isinstance(obj, DumpAbon) + assert isinstance(db_abon, Abon) + street = None + ip = None + try: + ip = IpPoolItem.objects.get(ip=obj.ip) + street = AbonStreet.objects.get(name=obj.street, group=user_group) + except IpPoolItem.DoesNotExist: + if obj.ip: + ip = IpPoolItem.objects.create(ip=obj.ip) + except AbonStreet.DoesNotExist: + street = AbonStreet.objects.create(name=obj.street, group=user_group) + db_abon.fio = obj.fio + db_abon.telephone = obj.tel + db_abon.street = street + db_abon.house = obj.house + #db_abon.birth_day = datetime(obj.birth) + db_abon.group = user_group + db_abon.ip_address = ip + db_abon.ballance = obj.balance + db_abon.save() + + + +if __name__ == "__main__": + + with open('dump.json', 'r') as f: + dat = load(f) + + for grp in dat['groups']: try: - abon_raw_passw = AbonRawPassword.objects.get(account=abon) - abon_raw_passw.passw_text = dt['passw'] - abon_raw_passw.save(update_fields=['passw_text']) - except AbonRawPassword.DoesNotExist: - AbonRawPassword.objects.create( - account=abon, - passw_text=dt['passw'] + abgrp=AbonGroup.objects.get(title=grp['gname']) + except AbonGroup.DoesNotExist: + abgrp = AbonGroup.objects.create( + title=grp['gname'] ) - - abtrfs = AbonTariff.objects.filter(abon=abon) - if abtrfs.count() > 0: - abtrf = abtrfs[0] - else: - abtrf = AbonTariff() - abtrf.abon = abon - abtrf.tariff = pshen_trf - abtrf.save() - abtrf.activate(iam) - print(abon.username, abon.fio, abon.group, ip_addr) + print(grp['gname']) + load_users(grp['users'], abgrp)