Merge branch 'feature/crop-params' of ssh://gl.id-east.ru:222/gm/gm-backend into feature/crop-params

This commit is contained in:
Dmitriy Kuzmenko 2019-11-22 19:21:28 +03:00
commit 4fdc32ea04
4 changed files with 37 additions and 16 deletions

View File

@ -39,9 +39,9 @@ class ImageSerializer(serializers.ModelSerializer):
class CropImageSerializer(ImageSerializer): class CropImageSerializer(ImageSerializer):
"""Serializers for image crops.""" """Serializers for image crops."""
width = serializers.IntegerField(write_only=True) width = serializers.IntegerField(write_only=True, required=False)
height = serializers.IntegerField(write_only=True) height = serializers.IntegerField(write_only=True, required=False)
margin = serializers.CharField(write_only=True, allow_null=True, crop = serializers.CharField(write_only=True, allow_null=True,
required=False, required=False,
default='center') default='center')
quality = serializers.IntegerField(write_only=True, allow_null=True, required=False, quality = serializers.IntegerField(write_only=True, allow_null=True, required=False,
@ -59,7 +59,7 @@ class CropImageSerializer(ImageSerializer):
'orientation_display', 'orientation_display',
'width', 'width',
'height', 'height',
'margin', 'crop',
'quality', 'quality',
'cropped_image', 'cropped_image',
] ]
@ -69,16 +69,16 @@ class CropImageSerializer(ImageSerializer):
file = self._image.image file = self._image.image
crop_width = attrs.get('width') crop_width = attrs.get('width')
crop_height = attrs.get('height') crop_height = attrs.get('height')
margin = attrs.get('margin') crop = attrs.get('crop')
if crop_height and crop_width and margin: if crop_height and crop_width and crop:
xy_image = (file.width, file.width) xy_image = (file.width, file.width)
xy_window = (crop_width, crop_height) xy_window = (crop_width, crop_height)
try: try:
parse_crop(margin, xy_image, xy_window) parse_crop(crop, xy_image, xy_window)
attrs['image'] = file attrs['image'] = file
except ThumbnailParseError: except ThumbnailParseError:
raise serializers.ValidationError({'margin': _('Unrecognized crop option: %s') % margin}) raise serializers.ValidationError({'margin': _('Unrecognized crop option: %s') % crop})
return attrs return attrs
def create(self, validated_data): def create(self, validated_data):
@ -86,7 +86,7 @@ class CropImageSerializer(ImageSerializer):
width = validated_data.pop('width', None) width = validated_data.pop('width', None)
height = validated_data.pop('height', None) height = validated_data.pop('height', None)
quality = validated_data.pop('quality') quality = validated_data.pop('quality')
margin = validated_data.pop('margin') crop = validated_data.pop('crop')
image = self._image image = self._image
@ -96,7 +96,7 @@ class CropImageSerializer(ImageSerializer):
image.get_cropped_image( image.get_cropped_image(
geometry=f'{width}x{height}', geometry=f'{width}x{height}',
quality=quality, quality=quality,
margin=margin)) crop=crop))
return image return image
@property @property

View File

@ -11,11 +11,11 @@ from django.contrib.postgres.fields.jsonb import KeyTextTransform
from django.utils import timezone from django.utils import timezone
from django.utils.html import mark_safe from django.utils.html import mark_safe
from django.utils.translation import ugettext_lazy as _, get_language from django.utils.translation import ugettext_lazy as _, get_language
from configuration.models import TranslationSettings
from easy_thumbnails.fields import ThumbnailerImageField from easy_thumbnails.fields import ThumbnailerImageField
from sorl.thumbnail import get_thumbnail from sorl.thumbnail import get_thumbnail
from sorl.thumbnail.fields import ImageField as SORLImageField from sorl.thumbnail.fields import ImageField as SORLImageField
from configuration.models import TranslationSettings
from utils.methods import image_path, svg_image_path from utils.methods import image_path, svg_image_path
from utils.validators import svg_image_validator from utils.validators import svg_image_validator
@ -227,16 +227,16 @@ class SORLImageMixin(models.Model):
else: else:
return None return None
def get_cropped_image(self, geometry: str, quality: int, margin: str) -> dict: def get_cropped_image(self, geometry: str, quality: int, crop: str) -> dict:
cropped_image = get_thumbnail(self.image, cropped_image = get_thumbnail(self.image,
geometry_string=geometry, geometry_string=geometry,
crop=margin, crop=crop,
quality=quality) quality=quality)
return { return {
'geometry_string': geometry, 'geometry_string': geometry,
'crop_url': cropped_image.url, 'crop_url': cropped_image.url,
'quality': quality, 'quality': quality,
'margin': margin 'crop': crop
} }
image_tag.short_description = _('Image') image_tag.short_description = _('Image')
@ -455,4 +455,5 @@ class FavoritesMixin:
def favorites_for_users(self): def favorites_for_users(self):
return self.favorites.aggregate(arr=ArrayAgg('user_id')).get('arr') return self.favorites.aggregate(arr=ArrayAgg('user_id')).get('arr')
timezone.datetime.now().date().isoformat() timezone.datetime.now().date().isoformat()

View File

@ -0,0 +1,19 @@
"""Overridden thumbnail engine."""
from sorl.thumbnail.engines.pil_engine import Engine as PILEngine
class GMEngine(PILEngine):
def create(self, image, geometry, options):
"""
Processing conductor, returns the thumbnail as an image engine instance
"""
image = self.cropbox(image, geometry, options)
image = self.orientation(image, geometry, options)
image = self.colorspace(image, geometry, options)
image = self.remove_border(image, options)
image = self.crop(image, geometry, options)
image = self.rounded(image, geometry, options)
image = self.blur(image, geometry, options)
image = self.padding(image, geometry, options)
return image

View File

@ -520,3 +520,4 @@ ESTABLISHMENT_CHOSEN_TAGS = ['gastronomic', 'en_vogue', 'terrace', 'streetfood',
NEWS_CHOSEN_TAGS = ['eat', 'drink', 'cook', 'style', 'international', 'event', 'partnership'] NEWS_CHOSEN_TAGS = ['eat', 'drink', 'cook', 'style', 'international', 'event', 'partnership']
INTERNATIONAL_COUNTRY_CODES = ['www', 'main', 'next'] INTERNATIONAL_COUNTRY_CODES = ['www', 'main', 'next']
THUMBNAIL_ENGINE = 'utils.thumbnail_engine.GMEngine'