You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

302 lines
10 KiB

#!/usr/bin/env python
import os
from json import dump
from bitfield import BitField
from django import setup
from django.core.serializers.json import DjangoJSONEncoder
from django.db.models import ImageField, ManyToManyField, ManyToOneRel
from djing.fields import MACAddressField
class BatchSaveStreamList(list):
def __init__(self, model_queryset, model_name, except_fields=None, choice_list_map=None, field_name_map=None, *args,
**kwargs):
super().__init__(*args, **kwargs)
self._qs = model_queryset
self._model_name = model_name
self._except_fields = (except_fields or []) + ['id']
self._choice_list_map = choice_list_map or {}
self._field_name_map = field_name_map or {}
print(model_name, end='\t' * 3)
def _map_field_name(self, name):
if name in self._field_name_map:
return self._field_name_map.get(name)
return name
def _fields(self, obj):
fls = obj._meta.get_fields()
return {self._map_field_name(ob.name): self._field_val(obj, ob) for ob in fls if
ob.name not in self._except_fields and ob.concrete}
def __iter__(self):
for d in self._qs.iterator():
yield {
"model": self._model_name,
"pk": d.pk,
"fields": self._fields(d)
}
def _field_val(self, obj, field):
# choice fields
if field.name in self._choice_list_map.keys():
val = getattr(obj, field.name)
return self._choice_list_map[field.name].get(val)
# bit fields
elif isinstance(field, BitField):
val = getattr(obj, field.name)
# val is instance of BitHandler
return int(val)
# image fields
elif isinstance(field, ImageField):
val = getattr(obj, field.name)
return getattr(val, 'url') if val else None
# mac address validated by netaddr.EUI
elif isinstance(field, MACAddressField):
val = getattr(obj, field.name)
return str(val)
# related fields
if field.is_relation:
if isinstance(field, ManyToOneRel):
return getattr(obj, field.field_name)
val = getattr(obj, field.attname)
if isinstance(field, ManyToManyField):
s = val.only('pk').values_list('pk', flat=True)
return tuple(s)
return val
# all other simple fields
else:
v = getattr(obj, field.name)
if isinstance(v, bool):
return v
if field.null:
return v or None
return v
def __len__(self):
return 1
def batch_save(app_label: str, fname: str, *args, **kwargs):
sa = BatchSaveStreamList(*args, **kwargs)
fixt_dir = os.path.join('fixtures', app_label, 'fixtures')
if not os.path.isdir(fixt_dir):
os.makedirs(fixt_dir, mode=0o750)
full_path = os.path.join(fixt_dir, fname)
print(full_path)
with open(full_path, 'w') as f:
dump(sa, f, ensure_ascii=False, indent=2, cls=DjangoJSONEncoder)
# ---------------------
def dump_groups():
from group_app.models import Group
batch_save('groupapp', "groups.json", Group.objects.all(), 'groupapp.group')
def dump_accounts():
from accounts_app.models import UserProfile, BaseAccount, UserProfileLog
app_label = 'profiles'
batch_save(app_label, 'accounts_app', 'accounts_baseaccount.json', BaseAccount.objects.exclude(username='AnonymousUser'), 'profiles.baseaccount',
except_fields=['groups', 'user_permissions'])
batch_save(app_label, 'accounts_userprofile.json', UserProfile.objects.exclude(username='AnonymousUser'), 'profiles.userprofile',
except_fields=['groups', 'user_permissions'])
do_type_map = {
'cusr': 1, 'dusr': 2,
'cdev': 3, 'ddev': 4,
'cnas': 5, 'dnas': 6,
'csrv': 7, 'dsrv': 8
}
batch_save(app_label, 'accounts_userprofilelog.json', UserProfileLog.objects.all(), 'profiles.userprofilelog',
except_fields=['meta_info'],
choice_list_map={
'do_type': do_type_map
})
def dump_messenger():
from messenger.models import Messenger, ViberMessenger, ViberMessage, ViberSubscriber
app_label = 'messenger'
batch_save(app_label, "messenger.json", Messenger.objects.all(), 'messenger.messenger')
batch_save(app_label, "vibermessenger.json", ViberMessenger.objects.all(), 'messenger.vibermessenger')
batch_save(app_label, "vibermessage.json", ViberMessage.objects.all(), 'messenger.vibermessage')
batch_save(app_label, "vibersubscriber.json", ViberSubscriber.objects.all(), 'messenger.vibersubscriber')
def dump_services():
from tariff_app.models import Tariff, PeriodicPay
app_label = 'services'
batch_save(app_label, "services.json", Tariff.objects.all(), 'services.service', field_name_map={
'speedIn': 'speed_in',
'speedOut': 'speed_out',
'amount': 'cost'
}, choice_list_map={
'calc_type': {
'Df': 0,
'Dp': 1,
'Cp': 2,
'Dl': 3
}
})
batch_save(app_label, "services_periodicpay.json", PeriodicPay.objects.all(), 'services.periodicpay', choice_list_map={
'calc_type': {
'df': 0,
'cs': 1
}
})
def dump_gateways():
from gw_app.models import NASModel
app_label = 'gateways'
batch_save(app_label, "gateways.json", NASModel.objects.all(), 'gateways.gateway', field_name_map={
'nas_type': 'gw_type',
'default': 'is_default'
}, choice_list_map={
'nas_type': {
'mktk': 0
}
})
def dump_devices():
from devapp.models import Device, Port
app_label = 'devices'
batch_save(app_label, "devices.json", Device.objects.all(), 'devices.device', field_name_map={
'devtype': 'dev_type'
}, choice_list_map={
'devtype': {
'Dl': 1, 'Pn': 2,
'On': 3, 'Ex': 4,
'Zt': 5, 'Zo': 6,
'Z6': 7, 'Hw': 8
},
'status': {
'und': 0,
'up': 1,
'unr': 2,
'dwn': 3
}
})
batch_save(app_label, 'devices_port.json', Port.objects.all(), 'devices.port')
def dump_customers():
from abonapp.models import (
Abon, AbonLog, AbonTariff, AbonStreet,
PassportInfo, InvoiceForPayment, AbonRawPassword,
AdditionalTelephone, PeriodicPayForId
)
app_label = 'customers'
batch_save(app_label, 'customer.json', Abon.objects.exclude(username='AnonymousUser'), 'customers.customer', field_name_map={
'current_tariff': 'current_service',
'ballance': 'balance',
'nas': 'gateway',
'autoconnect_service': 'auto_renewal_service',
'last_connected_tariff': 'last_connected_service'
}, except_fields=['groups', 'user_permissions'])
batch_save(app_label, 'customers_log.json', AbonLog.objects.all(), 'customers.customerlog', field_name_map={
'abon': 'customer',
'amount': 'cost'
})
batch_save(app_label, 'customers_service.json', AbonTariff.objects.all(), 'customers.customerservice', field_name_map={
'tariff': 'service',
'time_start': 'start_time'
})
batch_save(app_label, 'customers_street.json', AbonStreet.objects.all(), 'customers.customerstreet')
batch_save(app_label, 'customers_passport.json', PassportInfo.objects.all(), 'customers.passportinfo', field_name_map={
'abon': 'customer'
})
batch_save(app_label, 'customers_inv.json', InvoiceForPayment.objects.all(), 'customers.invoiceforpayment', field_name_map={
'abon': 'customer',
'amount': 'cost'
})
batch_save(app_label, 'customers_passw.json', AbonRawPassword.objects.all(), 'customers.customerrawpassword', field_name_map={
'account': 'customer'
})
batch_save(app_label, 'customers_tels.json', AdditionalTelephone.objects.all(), 'customers.additionaltelephone', field_name_map={
'abon': 'customer'
})
batch_save(app_label, 'customers_tels.json', PeriodicPayForId.objects.all(), 'customers.periodicpayforid')
def dump_networks():
from ip_pool.models import NetworkModel
app_label = 'networks'
batch_save(app_label, 'nets.json', NetworkModel.objects.all(), 'networks.networkmodel', choice_list_map={
'kind': {
'inet': 1,
'guest': 2,
'trust': 3,
'device': 4,
'admin': 5
}
})
def dump_tasks():
from taskapp.models import Task, ExtraComment, ChangeLog
app_label = 'tasks'
batch_save(app_label, 'task.json', Task.objects.all(), 'tasks.task', field_name_map={
'abon': 'customer'
}, except_fields=['attachment'], choice_list_map={
'priority': {
'E': 0,
'C': 1,
'A': 2
},
'state': {
'S': 0,
'C': 1,
'F': 2
},
'mode': {
'na': 0, 'ic': 1,
'yt': 2, 'rc': 3,
'ls': 4, 'cf': 5,
'cn': 6, 'pf': 7,
'cr': 8, 'co': 9,
'fc': 10, 'ni': 11,
'ot': 12
}
})
batch_save(app_label, 'task_comments.json', ExtraComment.objects.all(), 'tasks.extracomment')
batch_save(app_label, 'task_log.json', ChangeLog.objects.all(), 'tasks.changelog', choice_list_map={
'act_type': {
'e': 1, 'c': 2,
'd': 3, 'f': 4, 'b': 5
}
})
def dump_fin():
from finapp.models import PayAllTimeGateway, AllTimePayLog
app_label = 'tasks'
batch_save(app_label, 'fin_gws.json', PayAllTimeGateway.objects.all(), 'fin_app.payalltimegateway')
batch_save(app_label, 'fin_logs.json', AllTimePayLog.objects.all(), 'fin_app.alltimepaylog', field_name_map={
'abon': 'customer'
})
all_migrs = (
dump_groups, dump_accounts, dump_messenger,
dump_services, dump_gateways, dump_devices,
dump_customers, dump_networks, dump_tasks,
dump_fin
)
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djing.settings')
setup()
# dump_accounts()
for migr in all_migrs:
migr()