users.py 4.9 KB

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