Add script to export objects to portail v2 (fixes #5510)

This commit is contained in:
Benjamin Dauvergne 2014-09-30 16:37:54 +02:00 committed by Serghei MIHAI
parent 78983bb3f1
commit 6ee88e9fb9
1 changed files with 99 additions and 0 deletions

View File

@ -0,0 +1,99 @@
import sys
import locale
import logging
from optparse import make_option
from django.contrib.auth.models import User
from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand
from django.db import transaction
from django.db.models import FieldDoesNotExist
from django.core import serializers
from allauth.socialaccount.models import SocialApp, SocialAccount
from portail_citoyen.apps.feed_plugin.models import Feed
class Command(BaseCommand):
args = ''
help = '''Migrate portail citoyen to authentic'''
option_list = BaseCommand.option_list + (
make_option('--group', action="append"),
)
def get_objects(self, group=None, **options):
# butt ugly work around the fact that the classical user model is not
# initialized, so we need to simulate many2many fields and also to
# simulate "through" models of those sames fields in order to make the
# JSON serializer happy
class X(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
class MockManager(object):
def __init__(self, seq):
self.seq = seq
def iterator(self):
return self.seq
SocialApp._meta.many_to_many[0].rel.through = X(_meta=X(auto_created=True))
class MockManagerDescriptorEmpty(object):
def __get__(self, instance, instance_type=None):
return MockManager([])
SocialApp.sites = MockManagerDescriptorEmpty()
social_app = SocialApp(
id=1,
provider='authentic2',
name='Compte citoyen',
client_id='1',
secret='1234')
social_app.__dict__['sites'] = MockManager([])
yield social_app
for m2m_field in User._meta.many_to_many:
m2m_field.rel.through = X(_meta=X(auto_created=True))
class MockManagerDescriptorGroups(object):
def __get__(self, instance, instance_type=None):
return instance.__dict__['groups']
User.groups = MockManagerDescriptorGroups()
User.user_permissions = MockManagerDescriptorEmpty()
# fix user fk on SocialAccount
BASE_FIELDS = ('username', 'email', 'first_name', 'last_name',
'last_login', 'password', 'date_joined', 'is_active', 'is_admin', 'is_staff')
user_model = get_user_model()
for feed in Feed.objects.all():
yield feed
for user in user_model.objects.prefetch_related('feedpreference_set'):
new_user = User()
new_user.__dict__['groups'] = user.groups.filter(name__in=group)
for field in BASE_FIELDS:
try:
user_model._meta.get_field(field)
except FieldDoesNotExist:
continue
setattr(new_user, field, getattr(user, field))
yield new_user
social_account = SocialAccount(user=user, provider='authentic2')
if hasattr(user_model, 'USERNAME_FIELD'):
social_account.uid = getattr(user, user_model.USERNAME_FIELD)
else:
social_account.uid = user.username
if hasattr(user, 'last_login'):
social_account.last_login = user.last_login
if hasattr(user,'date_joined'):
social_account.date_joined = user.date_joined
yield social_account
for feed_preference in user.feedpreference_set.all():
yield feed_preference
@transaction.commit_on_success
def handle(self, *args, **options):
self.logger = logging.getLogger()
locale.setlocale(locale.LC_ALL, '')
handler = logging.StreamHandler(stream=sys.stderr)
self.logger.addHandler(handler)
if options['verbosity'] > 2:
handler.setLevel(level=logging.DEBUG)
json_serializer = serializers.get_serializer('json')()
json_serializer.serialize(self.get_objects(**options), indent=4,
stream=sys.stdout, use_natural_keys=True)