# customization/models.py from django.db import models from django.conf import settings from django.utils import timezone class DesignSettings(models.Model): """ Настройки дизайна для публичной страницы пользователя. """ user = models.OneToOneField( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='design', help_text='Пользователь, которому принадлежат настройки' ) theme_color = models.CharField( max_length=7, default='#ffffff', help_text='Основной цвет темы (hex)' ) background_image = models.ImageField( upload_to='customization/', null=True, blank=True, help_text='Фоновое изображение' ) # Новые поля для дашборда dashboard_layout = models.CharField( max_length=20, choices=[ ('sidebar', 'Боковая панель'), ('grid', 'Сетка'), ('list', 'Список'), ('cards', 'Карточки'), ('compact', 'Компактный'), ('masonry', 'Кладка'), ('timeline', 'Временная линия'), ('magazine', 'Журнальный'), ], default='list', help_text='Стиль отображения дашборда' ) groups_default_expanded = models.BooleanField( default=True, help_text='Развернуты ли группы по умолчанию' ) show_group_icons = models.BooleanField( default=True, help_text='Показывать иконки групп' ) show_link_icons = models.BooleanField( default=True, help_text='Показывать иконки ссылок' ) dashboard_background_color = models.CharField( max_length=7, default='#f8f9fa', help_text='Цвет фона дашборда (hex)' ) font_family = models.CharField( max_length=100, default='sans-serif', help_text='Название шрифта' ) custom_css = models.TextField( blank=True, help_text='Дополнительный CSS' ) # Новые поля для цветов текста header_text_color = models.CharField( max_length=7, default='#000000', help_text='Цвет заголовков (hex)' ) group_text_color = models.CharField( max_length=7, default='#333333', help_text='Цвет названий групп (hex)' ) link_text_color = models.CharField( max_length=7, default='#666666', help_text='Цвет названий ссылок (hex)' ) # Поля для настройки обложки cover_overlay_enabled = models.BooleanField( default=False, help_text='Включить цветовое перекрытие обложки' ) cover_overlay_color = models.CharField( max_length=7, default='#000000', help_text='Цвет перекрытия обложки (hex)' ) cover_overlay_opacity = models.FloatField( default=0.5, help_text='Прозрачность перекрытия (0.0 - 1.0)' ) updated_at = models.DateTimeField( auto_now=True, help_text='Дата и время последнего изменения' ) class Meta: verbose_name = 'Настройки дизайна' verbose_name_plural = 'Настройки дизайна' ordering = ['user'] unique_together = ('user',) def __str__(self): return f"Design for {self.user.username}" def get_background_image_url(self): """ Возвращает URL фонового изображения. """ return self.background_image.url if self.background_image else None def get_custom_css(self): """ Возвращает пользовательский CSS. """ return self.custom_css or "" def get_design_settings(self): """ Возвращает словарь с настройками дизайна. """ return { 'theme_color': self.theme_color, 'background_image': self.get_background_image_url(), 'font_family': self.font_family, 'custom_css': self.get_custom_css() } def save(self, *args, **kwargs): """ Переопределяем метод save, чтобы автоматически обновлять дату изменения. """ self.updated_at = timezone.now() super().save(*args, **kwargs) def delete(self, *args, **kwargs): """ Переопределяем метод delete, чтобы удалять связанные изображения. """ if self.background_image: self.background_image.delete(save=False) return super().delete(*args, **kwargs) # Вспомогательные методы для доступа к данным пользователя def get_user(self): return self.user def get_user_id(self): return self.user.id def get_user_username(self): return self.user.username def get_user_email(self): return self.user.email or "Нет email" def get_user_full_name(self): return self.user.get_full_name() or "Нет полного имени" def get_user_bio(self): return self.user.bio or "Нет биографии" def get_user_avatar(self): return self.user.avatar.url if self.user.avatar else None