gallery.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import random
  2. from pathlib 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] = {"name": image.gallery, "images": []}
  22. galleries.append(galleries_dicts[image.gallery])
  23. galleries_dicts[image.gallery]["images"].append(image)
  24. return galleries
  25. def galleries_exist():
  26. from misago.users.models import AvatarGallery
  27. return AvatarGallery.objects.exists()
  28. def load_avatar_galleries():
  29. from misago.users.models import AvatarGallery
  30. galleries = []
  31. for directory in Path(settings.MISAGO_AVATAR_GALLERY).iterdir():
  32. if not directory.is_dir():
  33. continue
  34. name = directory.name
  35. images = glob_gallery_images(directory)
  36. for image in images:
  37. with open(image, "rb") as image_file:
  38. galleries.append(
  39. AvatarGallery.objects.create(
  40. gallery=name, image=ContentFile(image_file.read(), "image")
  41. )
  42. )
  43. return galleries
  44. def glob_gallery_images(directory):
  45. images = []
  46. images.extend(directory.glob("*.gif"))
  47. images.extend(directory.glob("*.jpg"))
  48. images.extend(directory.glob("*.jpeg"))
  49. images.extend(directory.glob("*.png"))
  50. return images
  51. def set_avatar(user, avatar):
  52. store.store_new_avatar(user, Image.open(avatar.image))
  53. def set_random_avatar(user):
  54. galleries = get_available_galleries(include_default=True)
  55. if not galleries:
  56. raise RuntimeError("no avatar galleries are set")
  57. avatars_list = []
  58. for gallery in galleries:
  59. if gallery["name"] == DEFAULT_GALLERY:
  60. avatars_list = gallery["images"]
  61. break
  62. else:
  63. avatars_list += gallery["images"]
  64. random_avatar = random.choice(avatars_list)
  65. store.store_new_avatar(user, Image.open(random_avatar.image))