123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- from django.conf import settings
- from django.core.management import CommandError
- from django.core.management.base import BaseCommand
- from django.db import connections
- from misago.models import *
- class Command(BaseCommand):
- """
- Small utility that migrates data from Misago 0.1 instalation to 0.2
- """
- help = 'Updates Popular Threads ranking'
- def handle(self, *args, **options):
- self.cursor = connections['deprecated'].cursor()
- self.stdout.write('\nBeginning migration from Misago 0.1...\n')
- self.mig_settings()
- self.mig_monitor()
- self.users = {}
- self.forums = {}
- self.threads = {}
- self.mig_users()
- self.mig_users_roles()
- self.mig_users_relations()
-
- Karma.objects.all().delete()
- Change.objects.all().delete()
- Checkpoint.objects.all().delete()
- Post.objects.all().delete()
- Thread.objects.all().delete()
- self.mig_forums()
-
- self.mig_threads()
- self.mig_posts()
- self.mig_subs()
- self.sync_threads()
- self.sync_forums()
-
- self.stdout.write('\nData was migrated.\n')
- def mig_settings(self):
- self.stdout.write('Migrating Database Settings...')
- self.cursor.execute("SELECT setting, value FROM settings_setting");
- for row in self.dictfetchall():
- Setting.objects.filter(setting=row['setting']).update(value=row['value'])
- def mig_monitor(self):
- self.stdout.write('Migrating Forum Monitor...')
- self.cursor.execute("SELECT id, value, updated FROM monitor_item");
- for row in self.dictfetchall():
- MonitorItem.objects.filter(id=row['id']).update(value=row['value'], updated=row['updated'])
- def mig_users(self):
- User.objects.all().delete()
- self.stdout.write('Migrating Users...')
- self.cursor.execute("SELECT * FROM users_user");
- for row in self.dictfetchall():
- self.users[row['id']] = User.objects.create(
- username=row['username'],
- username_slug=row['username_slug'],
- email=row['email'],
- email_hash=row['email_hash'],
- password=row['password'],
- password_date=row['password_date'],
- avatar_type=row['avatar_type'],
- avatar_image=row['avatar_image'],
- avatar_original=row['avatar_original'],
- avatar_temp=row['avatar_temp'],
- signature=row['signature'],
- signature_preparsed=row['signature_preparsed'],
- join_date=row['join_date'],
- join_ip=row['join_ip'],
- join_agent=row['join_agent'],
- last_date=row['last_date'],
- last_ip=row['last_ip'],
- last_agent=row['last_agent'],
- hide_activity=row['hide_activity'],
- subscribe_start=row['subscribe_start'],
- subscribe_reply=row['subscribe_reply'],
- receive_newsletters=row['receive_newsletters'],
- threads=row['threads'],
- posts=row['posts'],
- votes=row['votes'],
- karma_given_p=row['karma_given_p'],
- karma_given_n=row['karma_given_n'],
- karma_p=row['karma_p'],
- karma_n=row['karma_n'],
- following=row['following'],
- followers=row['followers'],
- score=row['score'],
- ranking=row['ranking'],
- last_sync=row['last_sync'],
- title=row['title'],
- last_post=row['last_post'],
- last_search=row['last_search'],
- alerts=row['alerts'],
- alerts_date=row['alerts_date'],
- activation=row['activation'],
- token=row['token'],
- avatar_ban=row['avatar_ban'],
- avatar_ban_reason_user=row['avatar_ban_reason_user'],
- avatar_ban_reason_admin=row['avatar_ban_reason_admin'],
- signature_ban=row['signature_ban'],
- signature_ban_reason_user=row['signature_ban_reason_user'],
- signature_ban_reason_admin=row['signature_ban_reason_admin'],
- timezone=row['timezone'],
- is_team=row['is_team'],
- acl_key=row['acl_key'],
- )
- def mig_users_roles(self):
- self.stdout.write('Migrating Users Roles...')
- self.cursor.execute("SELECT * FROM users_user_roles");
- for row in self.dictfetchall():
- self.users[row['user_id']].roles.add(Role.objects.get(id=row['role_id']))
- def mig_users_relations(self):
- self.stdout.write('Migrating Users Relations...')
- self.cursor.execute("SELECT * FROM users_user_follows");
- for row in self.dictfetchall():
- self.users[row['from_user_id']].follows.add(self.users[row['to_user_id']])
- self.cursor.execute("SELECT * FROM users_user_ignores");
- for row in self.dictfetchall():
- self.users[row['from_user_id']].ignores.add(self.users[row['to_user_id']])
- def mig_forums(self):
- self.stdout.write('Migrating Forums...')
- self.forums[4] = Forum.objects.get(special='root')
- for forum in self.forums[4].get_descendants():
- forum.delete()
- self.forums[4] = Forum.objects.get(special='root')
- self.cursor.execute("SELECT * FROM forums_forum WHERE level > 0 ORDER BY lft");
- for row in self.dictfetchall():
- self.forums[row['id']] = Forum(
- type=row['type'],
- special=row['token'],
- name=row['name'],
- slug=row['slug'],
- description=row['description'],
- description_preparsed=row['description_preparsed'],
- redirect=row['redirect'],
- redirects=row['redirects'],
- attrs=row['attrs'],
- show_details=row['show_details'],
- style=row['style'],
- closed=row['closed'],
- )
- self.forums[row['id']].insert_at(self.forums[row['parent_id']], position='last-child', save=True)
- Forum.objects.populate_tree(True)
- def mig_threads(self):
- self.stdout.write('Migrating Threads...')
- self.cursor.execute("SELECT * FROM threads_thread");
- for row in self.dictfetchall():
- self.threads[row['id']] = Thread.objects.create(
- forum=self.forums[row['forum_id']],
- weight=row['weight'],
- name=row['name'],
- slug=row['slug'],
- merges=row['merges'],
- score=row['score'],
- upvotes=row['upvotes'],
- downvotes=row['downvotes'],
- start=row['start'],
- start_poster_name='a',
- start_poster_slug='a',
- last=row['last'],
- deleted=row['deleted'],
- closed=row['closed'],
- )
- def mig_posts(self):
- self.stdout.write('Migrating Posts...')
- self.cursor.execute("SELECT * FROM threads_post");
- for row in self.dictfetchall():
- post = Post.objects.create(
- forum=self.forums[row['forum_id']],
- thread=self.threads[row['thread_id']],
- merge=row['merge'],
- user=(self.users[row['user_id']] if row['user_id'] else None),
- user_name=row['user_name'],
- ip=row['ip'],
- agent=row['agent'],
- post=row['post'],
- post_preparsed=row['post_preparsed'],
- upvotes=row['upvotes'],
- downvotes=row['downvotes'],
- checkpoints=row['checkpoints'],
- date=row['date'],
- edits=row['edits'],
- edit_date=row['edit_date'],
- edit_reason=row['edit_reason'],
- edit_user=(self.users[row['edit_user_id']] if row['edit_user_id'] else None),
- edit_user_name=row['edit_user_name'],
- edit_user_slug=row['edit_user_slug'],
- reported=row['reported'],
- moderated=row['moderated'],
- deleted=row['deleted'],
- protected=row['protected'],
- )
- # Migrate post checkpoints
- self.cursor.execute("SELECT * FROM threads_checkpoint WHERE post_id = %s" % row['id']);
- for related in self.dictfetchall():
- Checkpoint.objects.create(
- forum=self.forums[row['forum_id']],
- thread=self.threads[row['thread_id']],
- post=post,
- action=related['action'],
- user=(self.users[related['user_id']] if related['user_id'] else None),
- user_name=related['user_name'],
- user_slug=related['user_slug'],
- date=related['date'],
- ip=related['ip'],
- agent=related['agent'],
- )
- # Migrate post edits
- self.cursor.execute("SELECT * FROM threads_change WHERE post_id = %s" % row['id']);
- for related in self.dictfetchall():
- Change.objects.create(
- forum=self.forums[row['forum_id']],
- thread=self.threads[row['thread_id']],
- post=post,
- user=(self.users[related['user_id']] if related['user_id'] else None),
- user_name=related['user_name'],
- user_slug=related['user_slug'],
- date=related['date'],
- ip=related['ip'],
- agent=related['agent'],
- reason=related['reason'],
- thread_name_new=related['thread_name_new'],
- thread_name_old=related['thread_name_old'],
- post_content=related['post_content'],
- size=related['size'],
- change=related['change'],
- )
- # Migrate post karmas
- self.cursor.execute("SELECT * FROM threads_karma WHERE post_id = %s" % row['id']);
- for related in self.dictfetchall():
- Karma.objects.create(
- forum=self.forums[row['forum_id']],
- thread=self.threads[row['thread_id']],
- post=post,
- user=(self.users[related['user_id']] if related['user_id'] else None),
- user_name=related['user_name'],
- user_slug=related['user_slug'],
- date=related['date'],
- ip=related['ip'],
- agent=related['agent'],
- score=related['score'],
- )
- # Migrate mentions
- self.cursor.execute("SELECT * FROM threads_post_mentions WHERE post_id = %s" % row['id']);
- for related in self.dictfetchall():
- post.mentions.add(self.users[related['user_id']])
- def mig_subs(self):
- self.stdout.write('Migrating Subscribtions...')
- self.cursor.execute("SELECT * FROM watcher_threadwatch");
- for row in self.dictfetchall():
- WatchedThread.objects.create(
- user=self.users[row['user_id']],
- forum=self.forums[row['forum_id']],
- thread=self.threads[row['thread_id']],
- last_read=row['last_read'],
- email=row['email'],
- )
- def sync_threads(self):
- self.stdout.write('Synchronising Threads...')
- for thread in Thread.objects.all():
- thread.sync()
- thread.save(force_update=True)
- def sync_forums(self):
- self.stdout.write('Synchronising Forums...')
- for forum in Forum.objects.all():
- forum.sync()
- forum.save(force_update=True)
- def dictfetchall(self):
- desc = self.cursor.description
- return [dict(zip([col[0] for col in desc], row)) for row in self.cursor.fetchall()]
|