Accept photo crop data over member details API
This commit is contained in:
parent
6be0778b39
commit
33e9ddd30f
|
@ -107,6 +107,7 @@ class OtherMemberSerializer(serializers.ModelSerializer):
|
||||||
class MemberSerializer(serializers.ModelSerializer):
|
class MemberSerializer(serializers.ModelSerializer):
|
||||||
status = serializers.SerializerMethodField()
|
status = serializers.SerializerMethodField()
|
||||||
photo = serializers.ImageField(write_only=True, required=False)
|
photo = serializers.ImageField(write_only=True, required=False)
|
||||||
|
crop = serializers.CharField(write_only=True, required=False)
|
||||||
email = fields.UserEmailField(serializers.EmailField)
|
email = fields.UserEmailField(serializers.EmailField)
|
||||||
phone = serializers.CharField()
|
phone = serializers.CharField()
|
||||||
street_address = serializers.CharField()
|
street_address = serializers.CharField()
|
||||||
|
@ -154,8 +155,9 @@ class MemberSerializer(serializers.ModelSerializer):
|
||||||
instance.old_email = validated_data.get('email', instance.old_email)
|
instance.old_email = validated_data.get('email', instance.old_email)
|
||||||
|
|
||||||
photo = validated_data.get('photo', None)
|
photo = validated_data.get('photo', None)
|
||||||
|
crop = validated_data.get('crop', None)
|
||||||
if photo:
|
if photo:
|
||||||
small, medium, large = utils.process_image_upload(photo)
|
small, medium, large = utils.process_image_upload(photo, crop)
|
||||||
instance.photo_small = small
|
instance.photo_small = small
|
||||||
instance.photo_medium = medium
|
instance.photo_medium = medium
|
||||||
instance.photo_large = large
|
instance.photo_large = large
|
||||||
|
|
|
@ -2,6 +2,7 @@ import logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
import io
|
import io
|
||||||
|
import json
|
||||||
import requests
|
import requests
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from rest_framework.exceptions import ValidationError
|
from rest_framework.exceptions import ValidationError
|
||||||
|
@ -168,7 +169,7 @@ LARGE_SIZE = 1080
|
||||||
MEDIUM_SIZE = 220
|
MEDIUM_SIZE = 220
|
||||||
SMALL_SIZE = 110
|
SMALL_SIZE = 110
|
||||||
|
|
||||||
def process_image_upload(upload):
|
def process_image_upload(upload, crop):
|
||||||
'''
|
'''
|
||||||
Save an image upload in small, medium, large sizes and return filenames
|
Save an image upload in small, medium, large sizes and return filenames
|
||||||
'''
|
'''
|
||||||
|
@ -184,6 +185,15 @@ def process_image_upload(upload):
|
||||||
else:
|
else:
|
||||||
raise serializers.ValidationError('Image must be a jpg or png.')
|
raise serializers.ValidationError('Image must be a jpg or png.')
|
||||||
|
|
||||||
|
if crop:
|
||||||
|
crop = json.loads(crop)
|
||||||
|
pic_x, pic_y = pic.size
|
||||||
|
left = pic_x * crop['x']/100.0
|
||||||
|
top = pic_y * crop['y']/100.0
|
||||||
|
right = left + pic_x * crop['width']/100.0
|
||||||
|
bottom = top + pic_y * crop['height']/100.0
|
||||||
|
pic = pic.crop((left, top, right, bottom))
|
||||||
|
|
||||||
large = str(uuid4()) + ext
|
large = str(uuid4()) + ext
|
||||||
pic.thumbnail([LARGE_SIZE, LARGE_SIZE], Image.ANTIALIAS)
|
pic.thumbnail([LARGE_SIZE, LARGE_SIZE], Image.ANTIALIAS)
|
||||||
pic.save(STATIC_FOLDER + large)
|
pic.save(STATIC_FOLDER + large)
|
||||||
|
@ -201,7 +211,7 @@ def process_image_upload(upload):
|
||||||
|
|
||||||
CARD_TEMPLATE_FILE = 'misc/member_card_template.jpg'
|
CARD_TEMPLATE_FILE = 'misc/member_card_template.jpg'
|
||||||
CARD_PHOTO_SIZE = 425
|
CARD_PHOTO_SIZE = 425
|
||||||
CARD_PHOTO_MARGIN_TOP = 100
|
CARD_PHOTO_MARGIN_TOP = 75
|
||||||
CARD_PHOTO_MARGIN_SIDE = 30
|
CARD_PHOTO_MARGIN_SIDE = 30
|
||||||
CARD_TEXT_SIZE_LIMIT = 550
|
CARD_TEXT_SIZE_LIMIT = 550
|
||||||
|
|
||||||
|
@ -236,7 +246,7 @@ def gen_card_photo(member):
|
||||||
draw.text((x, y), member.last_name, (0,0,0), font=font)
|
draw.text((x, y), member.last_name, (0,0,0), font=font)
|
||||||
|
|
||||||
font = ImageFont.truetype('DejaVuSans.ttf', 36)
|
font = ImageFont.truetype('DejaVuSans.ttf', 36)
|
||||||
draw.text((x, 800), 'Joined: ' + member.application_date, (0,0,0), font=font)
|
draw.text((x, 800), 'Joined: ' + str(member.application_date), (0,0,0), font=font)
|
||||||
y = CARD_PHOTO_MARGIN_SIDE
|
y = CARD_PHOTO_MARGIN_SIDE
|
||||||
draw.text((475, y), str(member.id), (0,0,0), font=font)
|
draw.text((475, y), str(member.id), (0,0,0), font=font)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user