import random from pathlib import Path from PIL import Image from django.core.files.base import ContentFile from misago.conf import settings from . import store DEFAULT_GALLERY = '__default__' def get_available_galleries(include_default=False): """ Returns list of dicts containing 'name' and list of images Only jpgs, gifs and pngs are supported avatar images. Galleries are """ from misago.users.models import AvatarGallery galleries = [] galleries_dicts = {} for image in AvatarGallery.objects.all(): if image.gallery == DEFAULT_GALLERY and not include_default: continue if image.gallery not in galleries_dicts: galleries_dicts[image.gallery] = {'name': image.gallery, 'images': []} galleries.append(galleries_dicts[image.gallery]) galleries_dicts[image.gallery]['images'].append(image) return galleries def galleries_exist(): from misago.users.models import AvatarGallery return AvatarGallery.objects.exists() def load_avatar_galleries(): from misago.users.models import AvatarGallery galleries = [] for directory in Path(settings.MISAGO_AVATAR_GALLERY).iterdir(): if not directory.is_dir(): continue name = directory.name images = glob_gallery_images(directory) for image in images: with open(image, 'rb') as image_file: galleries.append( AvatarGallery.objects. create(gallery=name, image=ContentFile(image_file.read(), 'image')) ) return galleries def glob_gallery_images(directory): images = [] images.extend(directory.glob('*.gif')) images.extend(directory.glob('*.jpg')) images.extend(directory.glob('*.jpeg')) images.extend(directory.glob('*.png')) return images def set_avatar(user, avatar): store.store_new_avatar(user, Image.open(avatar.image)) def set_random_avatar(user): galleries = get_available_galleries(include_default=True) if not galleries: raise RuntimeError("no avatar galleries are set") avatars_list = [] for gallery in galleries: if gallery['name'] == DEFAULT_GALLERY: avatars_list = gallery['images'] break else: avatars_list += gallery['images'] random_avatar = random.choice(avatars_list) store.store_new_avatar(user, Image.open(random_avatar.image))