gallery.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import random
  2. from path import Path
  3. from PIL import Image
  4. from django.conf import settings
  5. from django.core.files.base import ContentFile
  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 ..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 ..models import AvatarGallery
  30. return AvatarGallery.objects.exists()
  31. def load_avatar_galleries():
  32. from ..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))