import os from io import BytesIO from random import random from PIL import Image from django.core.mail import EmailMultiAlternatives from django.dispatch import receiver from django.template.loader import render_to_string from django.utils.deconstruct import deconstructible from django_rest_passwordreset.signals import reset_password_token_created from rest_framework import serializers from django.core.files.base import ContentFile from django.core.files import File import base64 import six import uuid import imghdr import numpy as np from hotelApi import settings from django.urls import reverse class Base64ImageField(serializers.ImageField): def to_internal_value(self, data): if isinstance(data, six.string_types): if 'data:' in data and ';base64,' in data: header, data = data.split(';base64,') try: decoded_file = base64.b64decode(data) except TypeError: self.fail('invalid_image') file_name = str(uuid.uuid4())[:12] file_extension = self.get_file_extension(file_name, decoded_file) complete_file_name = "%s.%s" % (file_name, file_extension,) data = ContentFile(decoded_file, name=complete_file_name) return super(Base64ImageField, self).to_internal_value(data) def get_file_extension(self, file_name, decoded_file): extension = imghdr.what(file_name, decoded_file) extension = "jpg" if extension == "jpeg" else extension return extension def vector_image(n): path2 = 0 M = np.zeros((300, 300), dtype=np.uint8) for i in range(1, 11): aux2 = path2 path2 = i * 30 path = 0 for j in range(1, 11): r = random.randint(0, n) aux = ubica ubica = j * 30 M[aux2:path2, aux:path] = r return M def image_user(username): M = np.zeros((300, 300, 3), dtype=np.uint8) M[:, :, 0] = vectorImage(128) M[:, :, 1] = vectorImage(128) M[:, :, 2] = vectorImage(128) path = settings.MEDIA_ROOT name = 'profile/' + str(username) + '.png' pil_img = Image.fromarray(M) pil_img.save(path + '/' + name) return name @receiver(reset_password_token_created) def password_reset_token_created(sender, instance, reset_password_token, *args, **kwargs): context = { 'username': reset_password_token.user.username, 'name': reset_password_token.user.first_name, 'reset_password_url': "{}?token={}".format(reverse('password_reset:reset-password-request'), reset_password_token.key), 'token': reset_password_token.key } # render email text email_html_message = render_to_string('user_reset_password.html', context) email_plaintext_message = render_to_string('user_reset_password.txt', context) msg = EmailMultiAlternatives("Soporte Hotel, Parece que perdiste tu contraseƱa", # message: email_plaintext_message, # from: "wTreData Team no-reply@kotti.com.co", # to: [reset_password_token.user.email] ) msg.attach_alternative(email_html_message, "text/html") msg.send() @deconstructible class UploadToPathAndRename(object): def __init__(self, path): self.sub_path = path def __call__(self, instance, filename): ext = filename.split('.')[-1] if instance.pk: filename = '{}.{}'.format(instance.pk, ext) else: filename = '{}.{}'.format(uuid.uuid4().hex, ext) return os.path.join(self.sub_path, filename) def compress(image): im = Image.open(image) im_io = BytesIO() ext = str(image).split('.')[-1].upper() if ext == 'JPG' or ext == 'JPEG': im.save(im_io, 'JPEG', optimize=True, quality=55) else: im.save(im_io, ext, optimize=True, quality=55) new_image = File(im_io, name=image.name) return new_image