github.com/ismailbayram/bigpicture@v0.0.0-20231225173155-e4b21f5efcff/internal/browser/pyproject/base/utils.py (about) 1 from io import BytesIO 2 from uuid import uuid4 3 4 from PIL import Image 5 6 from django.core.files.base import ContentFile 7 from django.conf import settings 8 from django.views.decorators.cache import cache_page as dj_cache 9 10 11 def ordereddict_to_dict(value): 12 for k, v in value.items(): 13 if isinstance(v, dict): 14 value[k] = ordereddict_to_dict(v) 15 return dict(value) 16 17 def thumbnail_file_name_by_orginal_name(orginal_name, thumb_name): 18 """ 19 :param orginal_name: String 20 :param thumb_name: String 21 :return: String 22 ex: 23 ("kadir.jpg", "20x30") # kadir_20x30.jpg 24 """ 25 pure_name = "".join(orginal_name.split(".")[0:-1]) 26 ext_name = orginal_name.split(".")[-1] 27 return "{0}_{1}.{2}".format(pure_name, thumb_name, ext_name) 28 29 30 def generate_file_name(instance, *args, **kwargs): 31 ext = instance.image.name.split(".")[-1] 32 return "{0}.{1}".format(uuid4().hex, ext) 33 34 35 def compress_image(image, do_square=False): 36 """ 37 :param image: ContentFile 38 :param do_square: boolean 39 :return: ContentFile 40 41 This function compress the image to jpeg and return new image 42 if do_square==True then image will resize the square version 43 """ 44 not_saved_pure_name = "".join(image.name.split('.')[0:-1]) 45 pil_image = Image.open(image) 46 pil_image.convert('RGB') 47 48 if do_square: 49 edge_size = min(pil_image.size) 50 pil_image = pil_image.crop((0, 0, edge_size, edge_size)) 51 52 f = BytesIO() 53 54 fill_color = '#ffffff' 55 if pil_image.mode in ('RGBA', 'LA'): 56 background = Image.new(pil_image.mode[:-1], pil_image.size, fill_color) 57 background.paste(pil_image, pil_image.split()[-1]) 58 pil_image = background 59 60 pil_image.save(f, "JPEG", quality=90) 61 image = ContentFile(f.getvalue()) 62 image.name = "{0}.{1}".format(not_saved_pure_name, "jpeg") 63 64 65 return image 66 67 68 def cache_page(timeout=settings.CACHE_TTL): 69 return dj_cache(timeout)