avatars.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import os
  2. from django.contrib.auth import get_user_model
  3. from django.core.exceptions import ValidationError
  4. from misago.conf import settings
  5. from misago.users.avatars import store, gravatar, dynamic, gallery, uploaded
  6. from . import OLD_FORUM, fetch_assoc, movedids
  7. UserModel = get_user_model()
  8. def move_avatars(stdout, style):
  9. for old_user in fetch_assoc('SELECT * FROM misago_user ORDER BY id'):
  10. user = UserModel.objects.get(pk=movedids.get('user', old_user['id']))
  11. if old_user['avatar_ban'] or old_user['avatar_type'] == 'gallery':
  12. dynamic.set_avatar(user)
  13. else:
  14. if old_user['avatar_type'] == 'gravatar':
  15. try:
  16. gravatar.set_avatar(user)
  17. except gravatar.GravatarError:
  18. dynamic.set_avatar(user)
  19. print_warning(
  20. '%s: failed to download Gravatar' % user, stdout, style)
  21. else:
  22. try:
  23. if not old_user['avatar_original'] or not old_user['avatar_crop']:
  24. raise ValidationError("Invalid avatar upload data.")
  25. image_path = os.path.join(
  26. OLD_FORUM['MEDIA'], 'avatars', old_user['avatar_original'])
  27. image = uploaded.validate_dimensions(image_path)
  28. cleaned_crop = convert_crop(image, old_user)
  29. uploaded.clean_crop(image, cleaned_crop)
  30. store.store_temporary_avatar(user, image)
  31. uploaded.crop_source_image(user, 'tmp', cleaned_crop)
  32. except ValidationError as e:
  33. dynamic.set_avatar(user)
  34. print_warning('%s: %s' % (user, e.args[0]), stdout, style)
  35. user.save()
  36. def print_warning(warning, stdout, style):
  37. stdout.write(style.ERROR(warning))
  38. def convert_crop(image, user):
  39. min_size = max(settings.MISAGO_AVATARS_SIZES)
  40. x, y, s = [float(v) for v in user['avatar_crop'].split(',')]
  41. zoom = min_size / s
  42. return {
  43. 'offset': {
  44. 'x': x * zoom * -1,
  45. 'y': y * zoom * -1,
  46. },
  47. 'zoom': zoom
  48. }