diff --git a/djing/utils/load_from_nodeny.py b/djing/utils/load_from_nodeny.py index 30cadb2..ee154b6 100755 --- a/djing/utils/load_from_nodeny.py +++ b/djing/utils/load_from_nodeny.py @@ -2,30 +2,59 @@ # coding=utf-8 import MySQLdb -from json import dumps +from json import dumps, loads +def param_to_python(st): + st = st.replace('$VAR1 = ', '') + st = st.replace("'", '"') + st = st.replace(" =>", ':') + st = st.replace(";", '') + return loads(st) + + +def load_service(cursor, uid): + sql = "SELECT services.title, services.service_id, services.price, services.description, services.param " \ + "FROM services LEFT JOIN users_services ON " \ + "(users_services.service_id=services.service_id) WHERE users_services.uid=%d" % uid + cursor.execute(sql) + service_line = cursor.fetchone() + if service_line is not None: + service = { + 'title': service_line[0], + 'service_id': service_line[1], + 'price': service_line[2], + 'description': service_line[3], + 'param': param_to_python(service_line[4]) + } + else: + service = None + return service + def load_users(cursor, grp_id): # выбираем абонентов - 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 + 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, users.id " \ + "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) users = [{ - 'name': str(res[0]), - 'fio': str(res[1]), - 'tel': str(res[2]), + 'name': res[0], + 'fio': res[1], + 'tel': 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 '' + 'passw': res[9].decode("utf-8") if res[9] is not None else '', + 'service': load_service(cursor, int(res[10])) } for res in cursor.fetchall()] return users - def load_groups(cursor): # выбираем группы sql = r'SELECT grp_id, grp_name FROM user_grp' @@ -43,12 +72,12 @@ def load_groups(cursor): if __name__ == "__main__": - db = MySQLdb.connect(host="127.0.0.1", user="", passwd="", db="db", charset='utf8') + db = MySQLdb.connect(host="10.12.1.6", user="bashmak", passwd="HUhTubP4zT", db="nodeny", charset='utf8') cursor = db.cursor() result = dict() - result['groups'] = load_groups(cursor=cursor) + result = load_groups(cursor=cursor) db.close() f = open('dump.json', 'w') f.write(dumps(result, ensure_ascii=False)) diff --git a/djing/utils/save_from_nodeny.py b/djing/utils/save_from_nodeny.py index a1f1acd..060a43e 100755 --- a/djing/utils/save_from_nodeny.py +++ b/djing/utils/save_from_nodeny.py @@ -4,13 +4,53 @@ import os from json import load import django +from django.utils import timezone os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") django.setup() -from abonapp.models import Abon, AbonGroup, AbonRawPassword, AbonStreet +from abonapp.models import Abon, AbonGroup, AbonRawPassword, AbonStreet, AbonTariff from ip_pool.models import IpPoolItem +from tariff_app.models import Tariff +class DumpService(object): + price = 0.0 + speedIn = 0.0 + speedOut = 0.0 + + def __init__(self, obj=None): + if obj is None: return + self.title = obj['title'] + self.price = obj['price'] + self.description = obj['description'] + self.speedIn = int(obj['param']['speed_in1']) / 1000000 + self.speedOut = int(obj['param']['speed_out1']) / 1000000 + + @staticmethod + def build_from_db(obj): + self = DumpService() + self.title = obj.title + self.price = obj.amount + self.description = obj.descr + self.speedIn = obj.speedIn + self.speedOut = obj.speedOut + return self + + def __eq__(self, other): + assert isinstance(other, DumpService) + print('DBG:', type(other.price), other.price, type(self.price), self.price) + r = self.price == other.price + r = r and self.speedIn == other.speedIn + r = r and self.speedOut == other.speedOut + return r + + def __ne__(self, other): + return not self.__eq__(other) + + def __str__(self): + return "%s; '%.2f', %f %f" % (self.title, self.price, self.speedIn, self.speedOut) + + class DumpAbon(object): def __init__(self, obj=None): @@ -22,9 +62,13 @@ class DumpAbon(object): self.house = obj['house'] self.birth = obj['birth'] self.grp = obj['grp'] - self.ip = obj['ip'] + self.ip = obj['ip'] if obj['ip'] != '' else None self.balance = obj['balance'] self.passw = obj['passw'] + if obj['service'] is not None: + self.service = DumpService(obj['service']) + else: + self.service = None @staticmethod def build_from_django(obj): @@ -36,14 +80,25 @@ class DumpAbon(object): self.street = obj.street self.house = obj.house self.birth = obj.birth_day - self.grp = obj.group.pk - self.ip = obj.ip_address + if obj.group is None: + self.grp = None + else: + self.grp = obj.group.pk + if obj.ip_address is None: + self.ip = None + else: + self.ip = obj.ip_address self.balance = obj.ballance try: raw_passw = AbonRawPassword.objects.get(account=obj) except AbonRawPassword.DoesNotExist: raw_passw = '' self.passw = raw_passw + srv = obj.active_tariff() + if srv is not None: + self.service = DumpService.build_from_db(srv) + else: + self.service = None return self def __eq__(self, other): @@ -64,7 +119,25 @@ class DumpAbon(object): return not self.__eq__(other) +def add_service_if_not_exist(service): + assert isinstance(service, DumpService) + try: + obj = Tariff.objects.get(speedIn=service.speedIn, speedOut=service.speedOut, amount=service.price) + except Tariff.DoesNotExist: + obj = Tariff.objects.create( + title=service.title, + descr=service.description, + speedIn=service.speedIn, + speedOut=service.speedOut, + amount=service.price, + calc_type='Dp' + ) + return obj + + def load_users(obj, group): + if len(obj) < 1: + return for usr in obj: # абонент из дампа dump_abon = DumpAbon(usr) @@ -77,7 +150,22 @@ def load_users(obj, group): update_user(abon, dump_abon, group) except Abon.DoesNotExist: # добавляем абонента - add_user(dump_abon, group) + abon = add_user(dump_abon, group) + + abon_service_from_dump = dump_abon.service + if abon_service_from_dump is None: + continue + abon_service = add_service_if_not_exist(abon_service_from_dump) + try: + AbonTariff.objects.get(abon=abon, tariff=abon_service) + except AbonTariff.DoesNotExist: + calc_obj = abon_service.get_calc_type()(abon_service) + AbonTariff.objects.create( + abon=abon, + tariff=abon_service, + time_start=timezone.now(), + deadline=calc_obj.calc_deadline() + ) def add_user(obj, user_group): @@ -85,14 +173,16 @@ def add_user(obj, user_group): street = None ip = None try: - ip = IpPoolItem.objects.get(ip=obj.ip) - street = AbonStreet.objects.get(name=obj.street) + if obj.ip is not None: + ip = IpPoolItem.objects.get(ip=obj.ip) + street = AbonStreet.objects.get(name=obj.street, group=user_group) except IpPoolItem.DoesNotExist: - ip = IpPoolItem.objects.create(ip=obj.ip) + if obj.ip is not None: + ip = IpPoolItem.objects.create(ip=obj.ip) except AbonStreet.DoesNotExist: street = AbonStreet.objects.create(name=obj.street, group=user_group) - Abon.objects.create( + return Abon.objects.create( username=obj.name, fio=obj.fio, telephone=obj.tel, @@ -111,10 +201,11 @@ def update_user(db_abon, obj, user_group): street = None ip = None try: - ip = IpPoolItem.objects.get(ip=obj.ip) + if obj.ip is not None: + ip = IpPoolItem.objects.get(ip=obj.ip) street = AbonStreet.objects.get(name=obj.street, group=user_group) except IpPoolItem.DoesNotExist: - if obj.ip: + if obj.ip is not None: ip = IpPoolItem.objects.create(ip=obj.ip) except AbonStreet.DoesNotExist: street = AbonStreet.objects.create(name=obj.street, group=user_group) @@ -129,13 +220,12 @@ def update_user(db_abon, obj, user_group): db_abon.save() - if __name__ == "__main__": with open('dump.json', 'r') as f: dat = load(f) - for grp in dat['groups']: + for grp in dat: try: abgrp=AbonGroup.objects.get(title=grp['gname']) except AbonGroup.DoesNotExist: