users.py 4.9 KB

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