from io import BytesIO from django.core.files.base import ContentFile from django.db import models from django.utils.text import gettext_lazy as _ from PIL import Image from config.models import SingletonModel class WebSettings(SingletonModel): web_title = models.CharField( max_length=32, blank=False, verbose_name=_("título de la web") ) web_description = models.CharField( max_length=128, blank=True, default="", verbose_name=_("descripción de la web") ) logo = models.ImageField( blank=True, null=True, upload_to="assets", verbose_name=_("logo de la web") ) business_name = models.CharField( max_length=128, blank=True, null=True, verbose_name=_("nombre de negocio"), help_text=_("nombre fiscal del comercio"), ) business_vat_id = models.CharField( max_length=16, blank=True, null=True, verbose_name=_("CIF del negocio") ) business_brand = models.CharField( max_length=64, blank=True, null=True, verbose_name=_("marca de negocio"), help_text=_("marca o nombre comercial que se va a mostrar en la web"), ) business_address = models.CharField( max_length=64, blank=True, null=True, verbose_name=_("dirección de negocio") ) business_state = models.CharField( max_length=32, blank=True, null=True, verbose_name=_("unidad territorial del negocio"), ) business_zip = models.CharField( max_length=16, blank=True, null=True, verbose_name=_("código postal del negocio"), ) business_phone = models.CharField( max_length=16, blank=True, null=True, verbose_name=_("número de teléfono de contacto"), ) business_email = models.EmailField( max_length=80, blank=True, null=True, verbose_name=_("e-mail de contacto") ) business_email_2 = models.EmailField( max_length=80, blank=True, null=True, verbose_name=_("e-mail secundario de contacto"), ) bg_color = models.CharField( max_length=9, default="", blank=True, null=True, verbose_name=_("color de fondo"), ) theme_color = models.CharField( max_length=9, default="", blank=True, null=True, verbose_name=_("color de tema") ) logo_256 = models.ImageField( upload_to="assets", blank=True, null=True, verbose_name=_("logo 256x256") ) logo_128 = models.ImageField( upload_to="assets", blank=True, null=True, verbose_name=_("logo 128x128") ) logo_64 = models.ImageField( upload_to="assets", blank=True, null=True, verbose_name=_("logo 64x64") ) logo_32 = models.ImageField( upload_to="assets", blank=True, null=True, verbose_name=_("logo 32x32") ) theme_colors = models.JSONField( default=dict, verbose_name=_("colores del tema"), blank=True ) def get_resized_logo(self, size): width, height = size image = Image.open(self.logo) image = image.resize(size, Image.Resampling.LANCZOS) buffer = BytesIO() image.save(fp=buffer, format="PNG") return ContentFile(buffer.getvalue(), name=f"logo_{width}.png") def save(self, *args, **kwargs): if self.logo: self.logo_32 = self.get_resized_logo((32, 32)) self.logo_64 = self.get_resized_logo((64, 64)) self.logo_128 = self.get_resized_logo((128, 128)) self.logo_256 = self.get_resized_logo((256, 256)) super().save(*args, **kwargs) class Meta: verbose_name = _("ajustes de la web") verbose_name_plural = _("ajustes de la web")