Files
2026-03-20 10:26:24 +01:00

83 lines
3.8 KiB
Python

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'))
favicon_32 = models.ImageField(upload_to='assets', blank=True, null=True, verbose_name=_('favicon 32x32'))
favicon_16 = models.ImageField(upload_to='assets', blank=True, null=True, verbose_name=_('favicon 16x16'))
theme_colors = models.JSONField(default=dict, verbose_name=_('colores del tema'), blank=True)
def get_resized_logo(self, size, extension: str = 'png'):
width, height = size
image = Image.open(self.logo)
image = image.resize(size, Image.Resampling.LANCZOS)
buffer = BytesIO()
image.save(fp=buffer, format=extension.upper())
return ContentFile(buffer.getvalue(), name=f'logo_{width}.{extension}')
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))
self.favicon_16 = self.get_resized_logo((16, 16), extension='ico')
self.favicon_32 = self.get_resized_logo((32, 32), extension='ico')
super().save(*args, **kwargs)
class Meta:
verbose_name = _('ajustes de la web')
verbose_name_plural = _('ajustes de la web')