gallery.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import random
  2. from path import Path
  3. from PIL import Image
  4. from django.core.files.base import ContentFile
  5. from misago.conf import settings
  6. from . import store
  7. DEFAULT_GALLERY = '__default__'
  8. def get_available_galleries(include_default=False):
  9. """
  10. Returns list of dicts containing 'name' and list of images
  11. Only jpgs, gifs and pngs are supported avatar images.
  12. Galleries are
  13. """
  14. from misago.users.models import AvatarGallery
  15. galleries = []
  16. galleries_dicts = {}
  17. for image in AvatarGallery.objects.all():
  18. if image.gallery == DEFAULT_GALLERY and not include_default:
  19. continue
  20. if image.gallery not in galleries_dicts:
  21. galleries_dicts[image.gallery] = {
  22. 'name': image.gallery,
  23. 'images': []
  24. }
  25. galleries.append(galleries_dicts[image.gallery])
  26. galleries_dicts[image.gallery]['images'].append(image)
  27. return galleries
  28. def galleries_exist():
  29. from misago.users.models import AvatarGallery
  30. return AvatarGallery.objects.exists()
  31. def load_avatar_galleries():
  32. from misago.users.models import AvatarGallery
  33. galleries = []
  34. for directory in Path(settings.MISAGO_AVATAR_GALLERY).dirs():
  35. gallery_name = directory.name
  36. images = directory.files('*.gif')
  37. images += directory.files('*.jpg')
  38. images += directory.files('*.jpeg')
  39. images += directory.files('*.png')
  40. for image in images:
  41. with open(image, 'rb') as image_file:
  42. galleries.append(AvatarGallery.objects.create(
  43. gallery=gallery_name,
  44. image=ContentFile(image_file.read(), 'image')
  45. ))
  46. return galleries
  47. def set_avatar(user, image):
  48. store.store_new_avatar(user, Image.open(image.path))
  49. def set_random_avatar(user):
  50. galleries = get_available_galleries(include_default=True)
  51. if not galleries:
  52. raise RuntimeError("no avatar galleries are set")
  53. avatars_list = []
  54. for gallery in galleries:
  55. if gallery['name'] == DEFAULT_GALLERY:
  56. avatars_list = gallery['images']
  57. break
  58. else:
  59. avatars_list += gallery['images']
  60. random_image_path = random.choice(avatars_list).path
  61. store.store_new_avatar(user, Image.open(random_image_path))