users.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. from django.contrib.auth import get_user_model
  2. from django.core.exceptions import ValidationError
  3. from django.utils.crypto import get_random_string
  4. from misago.users.models import UsernameChange
  5. from misago.users.signatures import make_signature_checksum
  6. from . import defstdout, fetch_assoc, movedids, localise_datetime
  7. UserModel = get_user_model()
  8. PRIVATE_THREAD_INVITES = {
  9. 0: 0,
  10. 1: 0,
  11. 2: 1,
  12. 3: 2
  13. }
  14. def move_users(stdout=None, style=None):
  15. stdout = stdout or defstdout
  16. from .models import MovedId
  17. MovedId.objects.all().delete()
  18. [u.delete() for u in UserModel.objects.filter(pk__gt=1).iterator()]
  19. existing_users = get_existing_users()
  20. for user in fetch_assoc('SELECT * FROM misago_user ORDER BY id'):
  21. if user['email'].lower() in existing_users:
  22. user_new_pk = existing_users[user['email'].lower()]
  23. new_user = UserModel.objects.get(pk=user_new_pk)
  24. else:
  25. try:
  26. new_user = UserModel.objects.create_user(
  27. user['username'], user['email'], 'Pass.123')
  28. except ValidationError:
  29. new_name = ''.join([user['username'], get_random_string(4)])
  30. new_user = UserModel.objects.create_user(
  31. new_name, user['email'], 'Pass.123')
  32. if style:
  33. formats = (user['username'], new_name)
  34. stdout.write(style.ERROR(
  35. '"%s" has been registered as "%s"' % formats))
  36. else:
  37. stdout.write(
  38. '"%s" has been registered as "%s"' % formats)
  39. new_user.password = user['password']
  40. new_user.joined_on = localise_datetime(user['join_date'])
  41. new_user.joined_from_ip = user['join_ip']
  42. new_user.last_login = localise_datetime(user['last_date'])
  43. new_user.last_ip = user['last_ip']
  44. new_user.is_hiding_presence = bool(user['hide_activity'])
  45. new_user.title = user['title'] or None
  46. new_user.requires_activation = user['activation']
  47. if new_user.requires_activation > 2:
  48. new_user.requires_activation = 1
  49. new_user.is_avatar_locked = user['avatar_ban']
  50. new_user.avatar_lock_user_message = user['avatar_ban_reason_user'] or None
  51. new_user.avatar_lock_staff_message = user['avatar_ban_reason_admin'] or None
  52. if user['signature'] and user['signature_preparsed']:
  53. new_user.signature = user['signature']
  54. new_user.signature_parsed = user['signature_preparsed']
  55. new_user.signature_checksum = make_signature_checksum(
  56. user['signature_preparsed'], new_user)
  57. new_user.is_signature_locked = user['signature_ban']
  58. new_user.signature_lock_user_message = user['signature_ban_reason_user'] or None
  59. new_user.signature_lock_staff_message = user['signature_ban_reason_admin'] or None
  60. new_user.limits_private_thread_invites_to = PRIVATE_THREAD_INVITES[user['allow_pds']]
  61. new_user.subscribe_to_started_threads = int(user['subscribe_start'])
  62. new_user.subscribe_to_replied_threads = int(user['subscribe_reply'])
  63. new_user.save()
  64. movedids.set('user', user['id'], new_user.pk)
  65. def get_existing_users():
  66. existing_users = {}
  67. queryset = UserModel.objects.values_list('id', 'email')
  68. for pk, email in queryset.iterator():
  69. existing_users[email.lower()] = pk
  70. return existing_users
  71. def move_followers(stdout=None):
  72. for follow in fetch_assoc('SELECT * FROM misago_user_follows ORDER BY id'):
  73. from_user_id = movedids.get('user', follow['from_user_id'])
  74. to_user_id = movedids.get('user', follow['to_user_id'])
  75. from_user = UserModel.objects.get(pk=from_user_id)
  76. to_user = UserModel.objects.get(pk=to_user_id)
  77. from_user.follows.add(to_user)
  78. def move_blocks(stdout=None):
  79. for follow in fetch_assoc('SELECT * FROM misago_user_ignores ORDER BY id'):
  80. from_user_id = movedids.get('user', follow['from_user_id'])
  81. to_user_id = movedids.get('user', follow['to_user_id'])
  82. from_user = UserModel.objects.get(pk=from_user_id)
  83. to_user = UserModel.objects.get(pk=to_user_id)
  84. from_user.blocks.add(to_user)
  85. def move_namehistory(stdout):
  86. for user in fetch_assoc(
  87. 'SELECT DISTINCT user_id FROM misago_usernamechange ORDER BY user_id'):
  88. new_id = movedids.get('user', user['user_id'])
  89. new_user = UserModel.objects.get(pk=new_id)
  90. move_users_namehistory(new_user, user['user_id'])
  91. def move_users_namehistory(user, old_id):
  92. username_history = []
  93. for namechange in fetch_assoc(
  94. 'SELECT * FROM misago_usernamechange WHERE user_id = %s ORDER BY id', [old_id]):
  95. if username_history:
  96. username_history[-1].new_username = namechange['old_username']
  97. username_history.append(UsernameChange(
  98. user=user,
  99. changed_by=user,
  100. changed_by_username=user.username,
  101. changed_on=localise_datetime(namechange['date']),
  102. new_username=user.username,
  103. old_username=namechange['old_username']
  104. ))
  105. UsernameChange.objects.bulk_create(username_history)