diff --git a/migrate2v2_dump.py b/migrate2v2_dump.py index dae6bfe..525a69d 100755 --- a/migrate2v2_dump.py +++ b/migrate2v2_dump.py @@ -1,37 +1,60 @@ #!/usr/bin/env python import os from json import dump + +from bitfield import BitHandler, BitField from django import setup +from django.core.serializers.json import DjangoJSONEncoder +from django.db.models import ImageField 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) self._model_class = model_class 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(): yield { "model": self._model_name, "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): 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: - 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(): - 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_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__': os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djing.settings') setup() - dump_groups() + dump_accounts()