* Upload base64 images & generate preview

This commit is contained in:
Phil Zhitnikov 2023-07-07 06:05:14 +04:00
parent dd52427ef5
commit 4269bfde8e
2 changed files with 52 additions and 19 deletions

View File

@ -362,6 +362,7 @@ class Checklist(models.Model):
def preview_image(self):
# Prefer annotated field
if hasattr(self, '_images'):
# Get first is_preview image from all images
return next(filter(lambda x: x.is_preview, self._images), None)
return self.images.filter(is_preview=True).first()
@ -371,7 +372,7 @@ class Checklist(models.Model):
return getattr(self.preview_image, 'image', None)
@property
def main_images(self):
def main_images(self) -> list:
# Prefer prefetched field
if hasattr(self, '_images'):
return [img for img in self._images if not img.is_preview]
@ -385,6 +386,24 @@ class Checklist(models.Model):
def __str__(self):
return f'{self.id}'
def generate_preview(self, source_img: Image = None):
source_img = source_img or next(iter(self.main_images), None)
if not source_img:
return
# Render preview image
preview = create_preview(source_img.image.path, size=self.size, price_rub=self.price_rub, title=self.title)
# Prepare bytes
image_io = BytesIO()
preview.save(image_io, format='JPEG')
# Create Image model and save it
image_obj = Image(is_preview=True, checklist_id=self.id)
image_obj.image.save(name=f'{self.id}_preview.jpg',
content=ContentFile(image_io.getvalue()),
save=True)
def save(self, *args, **kwargs):
if self.id:
old_obj = Checklist.objects.filter(id=self.id).first()
@ -400,20 +419,8 @@ class Checklist(models.Model):
self.cdek_barcode_pdf.save(f'{self.id}_barcode.pdf', pdf_file)
# Create preview image
if self.images.exists() and not self.preview_image:
# Render preview image
original = self.images.first().image
preview = create_preview(original.path, size=self.size, price_rub=self.price_rub, title=self.title)
# Prepare bytes
image_io = BytesIO()
preview.save(image_io, format='JPEG')
# Create Image model and save it
image_obj = Image(is_preview=True, checklist_id=self.id)
image_obj.image.save(name=f'{self.id}_preview.jpg',
content=ContentFile(image_io.getvalue()),
save=True)
if not self.preview_image:
self.generate_preview()
super().save(*args, **kwargs)

View File

@ -54,9 +54,13 @@ class ImageSerializer(serializers.ModelSerializer):
fields = ('image',)
class ChecklistImageListSerializer(serializers.ListSerializer):
class ImageListSerializer(serializers.ListSerializer):
child = ImageSerializer()
def to_internal_value(self, data):
data = [{"image": x} for x in data]
return super().to_internal_value(data)
def to_representation(self, data):
images = super().to_representation(data)
return [image['image'] for image in images]
@ -64,11 +68,11 @@ class ChecklistImageListSerializer(serializers.ListSerializer):
class ChecklistSerializer(serializers.ModelSerializer):
id = serializers.CharField(read_only=True)
managerid = serializers.PrimaryKeyRelatedField(source='manager.id', read_only=True, allow_null=True)
managerid = serializers.PrimaryKeyRelatedField(source='manager_id', read_only=True, allow_null=True)
link = serializers.URLField(source='product_link', required=False)
category = serializers.SlugRelatedField(slug_field='slug', queryset=Category.objects.all())
# image = Base64ImageField(source='images', many=True, queryset=Image.objects.all())
image = ImageListSerializer(source='main_images')
previewimage = serializers.ImageField(source='preview_image_url', read_only=True)
promo = serializers.SlugRelatedField(source='promocode', slug_field='name',
@ -105,6 +109,28 @@ class ChecklistSerializer(serializers.ModelSerializer):
startDate = serializers.DateTimeField(source='created_at', read_only=True)
currentDate = serializers.DateTimeField(source='status_updated_at', read_only=True)
def _create_images(self, instance, images):
img_objs = [Image(image=img['image'], checklist_id=instance.id) for img in images]
img_objs = Image.objects.bulk_create(img_objs)
instance.generate_preview(next(iter(img_objs), None))
def create(self, validated_data):
images = validated_data.pop('main_images', [])
instance = super().create(validated_data)
self._create_images(instance, images)
return instance
def update(self, instance, validated_data):
images = validated_data.pop('main_images', [])
instance: Checklist = super().update(instance, validated_data)
# Replace images basically
instance.images.all().delete()
self._create_images(instance, images)
instance.refresh_from_db(fields=('images',))
return instance
@staticmethod
def get_yuan_rate(obj: Checklist):
return GlobalSettings.load().yuan_rate
@ -126,7 +152,7 @@ class ChecklistSerializer(serializers.ModelSerializer):
fields = ('id', 'status', 'managerid', 'link',
'category', 'subcategory',
'brand', 'model', 'size',
# 'image',
'image',
'previewimage',
'currency', 'curencycurency2', 'currency3', 'chinadelivery', 'chinadelivery2', 'comission',
'promo',