backend/exhauster_analytics/utils/files.py

76 lines
2.5 KiB
Python

import os
from io import BytesIO
from PIL import Image
from exhauster_analytics.users.models import User
def crop_image(image_path: str, length: int = 500):
"""Makes image's thumbnail bt given parameters. By default, crops to 500x500"""
image = Image.open(image_path)
blob = BytesIO()
try:
if image.size[0] < image.size[1]:
# The image is in portrait mode. Height is bigger than width.
# This makes the width fit the LENGTH in pixels while conserving the ration.
resized_image = image.resize(
(length, int(image.size[1] * (length / image.size[0])))
)
# Amount of pixel to lose in total on the height of the image.
required_loss = resized_image.size[1] - length
# Crop the height of the image so as to keep the center part.
resized_image = resized_image.crop(
box=(
0,
int(required_loss / 2),
length,
int(resized_image.size[1] - required_loss / 2),
)
)
else:
# This image is in landscape mode or already squared. The width is bigger than the heihgt.
# This makes the height fit the LENGTH in pixels while conserving the ration.
resized_image = image.resize(
(int(image.size[0] * (length / image.size[1])), length)
)
# Amount of pixel to lose in total on the width of the image.
required_loss = resized_image.size[0] - length
# Crop the width of the image so as to keep 1080 pixels of the center part.
resized_image = resized_image.crop(
box=(
int(required_loss / 2),
0,
int(resized_image.size[0] - required_loss / 2),
length,
)
)
resized_image.save(blob, "PNG")
except OSError:
print("Can't crop")
return blob
def user_file_upload_mixin(instance, filename):
"""stores user uploaded files at their folder in media dir"""
username = ""
if isinstance(instance, User):
username = instance.username
elif hasattr(instance, "user"):
username = instance.user.username
elif hasattr(instance, "creator"):
username = instance.creator.username
return os.path.join(f"uploads/{username}/", filename)
def get_filename(filename, request):
return filename.upper()