Browse Source

Merge branch 'devel' of github.com:nerosketch/djing into devel

devel
Dmitry Novikov 7 years ago
parent
commit
2fc2063851
  1. 262
      migrate2v2_dump.py
  2. 4
      tariff_app/models.py

262
migrate2v2_dump.py

@ -1,37 +1,94 @@
#!/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_class, model_name, *args, **kwargs):
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._model_class = model_class
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 __iter__(self):
def fields(obj):
return {ob.name: getattr(obj, ob.name) or None for ob in obj._meta.concrete_fields if ob.name != 'id'}
def _map_field_name(self, name):
if name in self._field_name_map:
return self._field_name_map.get(name)
return name
for d in self._model_class.objects.all().iterator():
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": fields(d)
"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(fname, model_class, model_name):
sa = BatchSaveStreamList(
model_class=model_class,
model_name=model_name
)
def batch_save(fname, *args, **kwargs):
sa = BatchSaveStreamList(*args, **kwargs)
print(fname)
with open(fname, 'w') as f:
dump(sa, f, ensure_ascii=False, indent=2)
dump(sa, f, ensure_ascii=False, indent=2, cls=DjangoJSONEncoder)
# ---------------------
@ -39,16 +96,185 @@ def batch_save(fname, model_class, model_name):
def dump_groups():
from group_app.models import Group
batch_save("groups.json", Group, 'groupapp.group')
batch_save("groups.json", Group.objects.all(), 'groupapp.group')
def dump_accounts():
from accounts_app.models import UserProfile, BaseAccount
batch_save('accounts_baseaccount.json', BaseAccount, 'profiles.baseaccount')
batch_save('accounts_userprofile.json', UserProfile, 'profiles.userprofile')
from accounts_app.models import UserProfile, BaseAccount, UserProfileLog
batch_save('accounts_baseaccount.json', BaseAccount.objects.exclude(username='AnonymousUser'), 'profiles.baseaccount',
except_fields=['groups', 'user_permissions'])
batch_save('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('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
batch_save("messenger.json", Messenger.objects.all(), 'messenger.messenger')
batch_save("vibermessenger.json", ViberMessenger.objects.all(), 'messenger.vibermessenger')
batch_save("vibermessage.json", ViberMessage.objects.all(), 'messenger.vibermessage')
batch_save("vibersubscriber.json", ViberSubscriber.objects.all(), 'messenger.vibersubscriber')
def dump_services():
from tariff_app.models import Tariff, PeriodicPay
batch_save("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("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
batch_save("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
batch_save("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('devices_port.json', Port.objects.all(), 'devices.port')
def dump_customers():
from abonapp.models import (
Abon, AbonLog, AbonTariff, AbonStreet,
PassportInfo, InvoiceForPayment, AbonRawPassword,
AdditionalTelephone, PeriodicPayForId
)
batch_save('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('customers_log.json', AbonLog.objects.all(), 'customers.customerlog', field_name_map={
'abon': 'customer',
'amount': 'cost'
})
batch_save('customers_service.json', AbonTariff.objects.all(), 'customers.customerservice', field_name_map={
'tariff': 'service',
'time_start': 'start_time'
})
batch_save('customers_street.json', AbonStreet.objects.all(), 'customers.customerstreet')
batch_save('customers_passport.json', PassportInfo.objects.all(), 'customers.passportinfo', field_name_map={
'abon': 'customer'
})
batch_save('customers_inv.json', InvoiceForPayment.objects.all(), 'customers.invoiceforpayment', field_name_map={
'abon': 'customer',
'amount': 'cost'
})
batch_save('customers_passw.json', AbonRawPassword.objects.all(), 'customers.customerrawpassword', field_name_map={
'account': 'customer'
})
batch_save('customers_tels.json', AdditionalTelephone.objects.all(), 'customers.additionaltelephone', field_name_map={
'abon': 'customer'
})
batch_save('customers_tels.json', PeriodicPayForId.objects.all(), 'customers.periodicpayforid')
def dump_networks():
from ip_pool.models import NetworkModel
batch_save('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
batch_save('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('task_comments.json', ExtraComment.objects.all(), 'tasks.extracomment')
batch_save('task_log.json', ChangeLog.objects.all(), 'tasks.changelog', choice_list_map={
'act_type': {
'e': 1, 'c': 2,
'd': 3, 'f': 4, 'b': 5
}
})
all_migrs = (
dump_groups, dump_accounts, dump_messenger,
dump_services, dump_gateways, dump_devices,
dump_customers, dump_networks, dump_tasks
)
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djing.settings')
setup()
dump_groups()
# dump_accounts()
for migr in all_migrs:
migr()

4
tariff_app/models.py

@ -88,14 +88,14 @@ class PeriodicPay(models.Model):
#
calc_obj = self._get_calc_object()
res = calc_obj.get_next_time_to_pay(self, last_time_payment)
if type(res) is not datetime:
if not isinstance(res, datetime):
raise TypeError
return res
def calc_amount(self):
calc_obj = self._get_calc_object()
res = calc_obj.calc_amount(self)
if type(res) is not float:
if not isinstance(res, float):
raise TypeError
return res

Loading…
Cancel
Save