🚀 MEGA UPDATE: Объединение всех изменений для продакшена
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:
2025-11-25 11:24:19 +09:00
parent 6a576136af
commit 6f43fa4c3b
14 changed files with 1832 additions and 94 deletions

View File

@@ -1,18 +1,40 @@
from django.contrib import admin
from .models import Service, Project, Client, Order, Review, BlogPost, Category, ServiceRequest
from .models import Service, Project, Client, Order, Review, BlogPost, Category, ServiceRequest, HeroBanner
from .forms import ProjectForm
@admin.register(HeroBanner)
class HeroBannerAdmin(admin.ModelAdmin):
list_display = ('title', 'is_active', 'order', 'created_at')
list_filter = ('is_active', 'created_at')
search_fields = ('title', 'subtitle')
fields = ('title', 'subtitle', 'description', 'image', 'video', 'video_poster',
'button_text', 'button_link', 'is_active', 'order')
list_editable = ('is_active', 'order')
@admin.register(Service)
class ServiceAdmin(admin.ModelAdmin):
list_display = ('name', 'category', 'price')
list_display = ('name', 'category', 'price', 'has_video')
search_fields = ('name', 'category')
fields = ('name', 'description', 'price', 'category', 'image', 'video', 'video_poster')
def has_video(self, obj):
return bool(obj.video)
has_video.boolean = True
has_video.short_description = 'Есть видео'
@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
form = ProjectForm
list_display = ('name', 'client','service', 'status', 'order', 'description')
list_display = ('name', 'client','service', 'status', 'order', 'has_video')
list_filter = ('name', 'client','service', 'status', 'order')
search_fields = ('name', 'client','service', 'status', 'order', 'client__first_name', 'client__last_name')
fields = ('name', 'description', 'completion_date', 'client', 'service', 'order',
'category', 'image', 'video', 'video_poster', 'status')
def has_video(self, obj):
return bool(obj.video)
has_video.boolean = True
has_video.short_description = 'Есть видео'
@admin.register(Client)
class ClientAdmin(admin.ModelAdmin):
@@ -27,14 +49,26 @@ class OrderAdmin(admin.ModelAdmin):
@admin.register(Review)
class ReviewAdmin(admin.ModelAdmin):
list_display = ('client', 'service', 'rating', 'review_date')
list_display = ('client', 'service', 'rating', 'review_date', 'has_video')
list_filter = ('rating',)
search_fields = ('client__first_name', 'service__name')
fields = ('client', 'service', 'project', 'rating', 'comment', 'image', 'video', 'video_poster')
def has_video(self, obj):
return bool(obj.video)
has_video.boolean = True
has_video.short_description = 'Есть видео'
@admin.register(BlogPost)
class BlogPostAdmin(admin.ModelAdmin):
list_display = ('title', 'published_date')
list_display = ('title', 'published_date', 'has_video')
search_fields = ('title',)
fields = ('title', 'content', 'image', 'video', 'video_poster')
def has_video(self, obj):
return bool(obj.video)
has_video.boolean = True
has_video.short_description = 'Есть видео'
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):