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)