🚀 MEGA UPDATE: Объединение всех изменений для продакшена
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
✨ НОВЫЕ ФУНКЦИИ: - 🎬 Поддержка видео в Hero баннерах и услугах - 💊 Водная анимация пилюль маркеров банеров - 📱 Полная главная страница с портфолио, блогом, новостями - 🎯 HeroBanner модель с видео/изображениями - 🎨 Современные hover-эффекты и анимации 📊 УЛУЧШЕНИЯ СТРУКТУРЫ: - Расширенная home_modern.html с полным контентом - Новые URL маршруты для всех секций - Обновленные views с передачей всех данных - CSS стили для всех новых секций - Миграции для видео полей 🎪 HERO БАНЕР СИСТЕМА: - Динамические банеры с видео/фото фонами - Пилюли маркеры с водной анимацией - Растягивание маркеров от центра - Адаптивный дизайн для мобильных - Glassmorphism эффекты 🎨 СОВРЕМЕННЫЙ ДИЗАЙН: - Hover анимации для карточек - Плавные переходы везде - Современная типографика - Градиенты и тени - Отзывчивая сетка Готов к продакшену! 🚀
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
# Generated by Django 5.1.1 on 2025-11-24 23:52
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('web', '0009_alter_servicerequest_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='HeroBanner',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=200, verbose_name='Заголовок')),
|
||||
('subtitle', models.TextField(blank=True, verbose_name='Подзаголовок')),
|
||||
('description', models.TextField(blank=True, verbose_name='Описание')),
|
||||
('image', models.ImageField(blank=True, null=True, upload_to='static/img/hero/', verbose_name='Фоновое изображение')),
|
||||
('video', models.FileField(blank=True, help_text='Фоновое видео для баннера (MP4, WebM)', null=True, upload_to='static/video/hero/', verbose_name='Фоновое видео')),
|
||||
('video_poster', models.ImageField(blank=True, help_text='Превью изображение для видео', null=True, upload_to='static/img/hero/posters/', verbose_name='Превью видео')),
|
||||
('button_text', models.CharField(blank=True, max_length=100, verbose_name='Текст кнопки')),
|
||||
('button_link', models.URLField(blank=True, verbose_name='Ссылка кнопки')),
|
||||
('is_active', models.BooleanField(default=True, verbose_name='Активен')),
|
||||
('order', models.PositiveIntegerField(default=0, verbose_name='Порядок отображения')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Hero Баннер',
|
||||
'verbose_name_plural': 'Hero Баннеры',
|
||||
'ordering': ['order', '-created_at'],
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='blogpost',
|
||||
name='video',
|
||||
field=models.FileField(blank=True, help_text='Видео файл для блог поста', null=True, upload_to='static/video/blog/'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='blogpost',
|
||||
name='video_poster',
|
||||
field=models.ImageField(blank=True, help_text='Превью изображение для видео', null=True, upload_to='static/img/blog/posters/'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='project',
|
||||
name='video',
|
||||
field=models.FileField(blank=True, help_text='Видео презентация проекта', null=True, upload_to='static/video/project/'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='project',
|
||||
name='video_poster',
|
||||
field=models.ImageField(blank=True, help_text='Превью изображение для видео проекта', null=True, upload_to='static/img/project/posters/'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='review',
|
||||
name='video',
|
||||
field=models.FileField(blank=True, help_text='Видео отзыв о работе', null=True, upload_to='static/video/review/'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='review',
|
||||
name='video_poster',
|
||||
field=models.ImageField(blank=True, help_text='Превью для видео отзыва', null=True, upload_to='static/img/review/posters/'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='service',
|
||||
name='video',
|
||||
field=models.FileField(blank=True, help_text='Видео файл для услуги (MP4, WebM, AVI)', null=True, upload_to='static/video/services/'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='service',
|
||||
name='video_poster',
|
||||
field=models.ImageField(blank=True, help_text='Превью изображение для видео', null=True, upload_to='static/img/services/posters/'),
|
||||
),
|
||||
]
|
||||
13
smartsoltech/web/migrations/0011_add_video_fields.py
Normal file
13
smartsoltech/web/migrations/0011_add_video_fields.py
Normal file
@@ -0,0 +1,13 @@
|
||||
# Generated by Django 5.1.1 on 2025-11-25 01:03
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('web', '0010_herobanner_blogpost_video_blogpost_video_poster_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
]
|
||||
Reference in New Issue
Block a user