Browse Source

migration accounts

devel
Dmitry Novikov 7 years ago
parent
commit
13caccf79f
  1. 64
      migrate2v2_dump.py

64
migrate2v2_dump.py

@ -1,37 +1,60 @@
#!/usr/bin/env python #!/usr/bin/env python
import os import os
from json import dump from json import dump
from bitfield import BitHandler, BitField
from django import setup from django import setup
from django.core.serializers.json import DjangoJSONEncoder
from django.db.models import ImageField
class BatchSaveStreamList(list): class BatchSaveStreamList(list):
def __init__(self, model_class, model_name, *args, **kwargs):
def __init__(self, model_class, model_name, except_fields=None, list_map=None, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self._model_class = model_class self._model_class = model_class
self._model_name = model_name self._model_name = model_name
self._except_fields = (except_fields or []) + ['id']
self._list_map = list_map or {}
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 _fields(self, obj):
return {ob.name: self._list_map_fn(obj, ob) for ob in obj._meta.concrete_fields if
ob.name not in self._except_fields}
def __iter__(self):
for d in self._model_class.objects.all().iterator(): for d in self._model_class.objects.all().iterator():
yield { yield {
"model": self._model_name, "model": self._model_name,
"pk": d.pk, "pk": d.pk,
"fields": fields(d)
"fields": self._fields(d)
} }
def _list_map_fn(self, obj, field):
if field.is_relation:
# fl = getattr(obj, field.name)
val = getattr(obj, field.attname)
return val
elif field.name in self._list_map.keys():
val = getattr(obj, field.name)
return self._list_map.get(val)
elif isinstance(field, BitField):
val = getattr(obj, field.name)
# val is instance of BitHandler
return int(val)
elif isinstance(field, ImageField):
val = getattr(obj, field.name)
if val._file:
return val.url
else:
return getattr(obj, field.name) or None
def __len__(self): def __len__(self):
return 1 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)
with open(fname, 'w') as f: with open(fname, 'w') as f:
dump(sa, f, ensure_ascii=False, indent=2)
dump(sa, f, ensure_ascii=False, indent=2, cls=DjangoJSONEncoder)
# --------------------- # ---------------------
@ -43,12 +66,27 @@ def dump_groups():
def dump_accounts(): def dump_accounts():
from accounts_app.models import UserProfile, BaseAccount
from accounts_app.models import UserProfile, BaseAccount, UserProfileLog
batch_save('accounts_baseaccount.json', BaseAccount, 'profiles.baseaccount') batch_save('accounts_baseaccount.json', BaseAccount, 'profiles.baseaccount')
batch_save('accounts_userprofile.json', UserProfile, 'profiles.userprofile') batch_save('accounts_userprofile.json', UserProfile, 'profiles.userprofile')
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, 'profiles.userprofilelog',
except_fields=['meta_info'],
list_map={
'do_type': do_type_map
})
if __name__ == '__main__': if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djing.settings') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djing.settings')
setup() setup()
dump_groups()
dump_accounts()
Loading…
Cancel
Save