Add comprehensive group customization features
- Add group overlay color and opacity settings - Add font customization (body and heading fonts) - Add group description text color control - Add option to hide 'Groups' title - Update frontend DesignSettings interface - Update CustomizationPanel with new UI controls - Update Django model with new fields - Create migration for new customization options - Update DRF serializer with validation
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
# Generated by Django 5.2.8 on 2025-11-09 01:26
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('customization', '0006_designsettings_cover_overlay_color_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='designsettings',
|
||||
name='body_font_family',
|
||||
field=models.CharField(blank=True, default='', help_text='Шрифт для основного текста', max_length=100),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='designsettings',
|
||||
name='group_description_text_color',
|
||||
field=models.CharField(default='#666666', help_text='Цвет текста описаний групп (hex)', max_length=7),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='designsettings',
|
||||
name='group_overlay_color',
|
||||
field=models.CharField(default='#000000', help_text='Цвет перекрытия групп (hex)', max_length=7),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='designsettings',
|
||||
name='group_overlay_enabled',
|
||||
field=models.BooleanField(default=False, help_text='Включить цветовое перекрытие групп'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='designsettings',
|
||||
name='group_overlay_opacity',
|
||||
field=models.FloatField(default=0.3, help_text='Прозрачность перекрытия групп (0.0 - 1.0)'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='designsettings',
|
||||
name='heading_font_family',
|
||||
field=models.CharField(blank=True, default='', help_text='Шрифт для заголовков', max_length=100),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='designsettings',
|
||||
name='show_groups_title',
|
||||
field=models.BooleanField(default=True, help_text='Показывать заголовок "Группы ссылок"'),
|
||||
),
|
||||
]
|
||||
@@ -102,6 +102,44 @@ class DesignSettings(models.Model):
|
||||
help_text='Прозрачность перекрытия (0.0 - 1.0)'
|
||||
)
|
||||
|
||||
# Новые поля для кастомизации групп
|
||||
group_overlay_enabled = models.BooleanField(
|
||||
default=False,
|
||||
help_text='Включить цветовое перекрытие групп'
|
||||
)
|
||||
group_overlay_color = models.CharField(
|
||||
max_length=7,
|
||||
default='#000000',
|
||||
help_text='Цвет перекрытия групп (hex)'
|
||||
)
|
||||
group_overlay_opacity = models.FloatField(
|
||||
default=0.3,
|
||||
help_text='Прозрачность перекрытия групп (0.0 - 1.0)'
|
||||
)
|
||||
show_groups_title = models.BooleanField(
|
||||
default=True,
|
||||
help_text='Показывать заголовок "Группы ссылок"'
|
||||
)
|
||||
group_description_text_color = models.CharField(
|
||||
max_length=7,
|
||||
default='#666666',
|
||||
help_text='Цвет текста описаний групп (hex)'
|
||||
)
|
||||
|
||||
# Новые поля для шрифтов
|
||||
body_font_family = models.CharField(
|
||||
max_length=100,
|
||||
default='',
|
||||
blank=True,
|
||||
help_text='Шрифт для основного текста'
|
||||
)
|
||||
heading_font_family = models.CharField(
|
||||
max_length=100,
|
||||
default='',
|
||||
blank=True,
|
||||
help_text='Шрифт для заголовков'
|
||||
)
|
||||
|
||||
updated_at = models.DateTimeField(
|
||||
auto_now=True,
|
||||
help_text='Дата и время последнего изменения'
|
||||
|
||||
@@ -28,6 +28,13 @@ class DesignSettingsSerializer(serializers.ModelSerializer):
|
||||
'cover_overlay_enabled',
|
||||
'cover_overlay_color',
|
||||
'cover_overlay_opacity',
|
||||
'group_overlay_enabled',
|
||||
'group_overlay_color',
|
||||
'group_overlay_opacity',
|
||||
'show_groups_title',
|
||||
'group_description_text_color',
|
||||
'body_font_family',
|
||||
'heading_font_family',
|
||||
'updated_at'
|
||||
]
|
||||
read_only_fields = ['id', 'updated_at', 'background_image_url']
|
||||
@@ -197,6 +204,54 @@ class DesignSettingsSerializer(serializers.ModelSerializer):
|
||||
raise serializers.ValidationError('Прозрачность должна быть между 0.0 и 1.0')
|
||||
return value
|
||||
|
||||
def validate_group_overlay_color(self, value):
|
||||
"""
|
||||
Валидация цвета перекрытия групп
|
||||
"""
|
||||
if not value.startswith('#') or len(value) != 7:
|
||||
raise serializers.ValidationError('Цвет должен быть в формате #RRGGBB')
|
||||
try:
|
||||
int(value[1:], 16)
|
||||
except ValueError:
|
||||
raise serializers.ValidationError('Некорректный hex цвет')
|
||||
return value
|
||||
|
||||
def validate_group_overlay_opacity(self, value):
|
||||
"""
|
||||
Валидация прозрачности перекрытия групп
|
||||
"""
|
||||
if not 0.0 <= value <= 1.0:
|
||||
raise serializers.ValidationError('Прозрачность должна быть между 0.0 и 1.0')
|
||||
return value
|
||||
|
||||
def validate_group_description_text_color(self, value):
|
||||
"""
|
||||
Валидация цвета описаний групп
|
||||
"""
|
||||
if not value.startswith('#') or len(value) != 7:
|
||||
raise serializers.ValidationError('Цвет должен быть в формате #RRGGBB')
|
||||
try:
|
||||
int(value[1:], 16)
|
||||
except ValueError:
|
||||
raise serializers.ValidationError('Некорректный hex цвет')
|
||||
return value
|
||||
|
||||
def validate_body_font_family(self, value):
|
||||
"""
|
||||
Валидация шрифта основного текста
|
||||
"""
|
||||
if value and len(value) > 100:
|
||||
raise serializers.ValidationError('Название шрифта слишком длинное')
|
||||
return value
|
||||
|
||||
def validate_heading_font_family(self, value):
|
||||
"""
|
||||
Валидация шрифта заголовков
|
||||
"""
|
||||
if value and len(value) > 100:
|
||||
raise serializers.ValidationError('Название шрифта слишком длинное')
|
||||
return value
|
||||
|
||||
|
||||
class PublicDesignSettingsSerializer(serializers.ModelSerializer):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user