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')