Newer
Older
GestionHoteleriaApi / hotelApi / tricks.py
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