avatars.py 2.2 KB

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