feat: добавлены модели AboutPage и FooterSettings с админ-панелью и интеграцией скриптов

This commit is contained in:
2025-11-24 09:18:22 +09:00
parent ee3a1bf846
commit 3cea013a8e
9 changed files with 558 additions and 17 deletions

View File

@@ -153,3 +153,191 @@ class Review(models.Model):
def __str__(self):
return f"Отзыв от {self.client.first_name} {self.client.last_name} for {self.service.name}"
class AboutPage(models.Model):
"""Модель для страницы 'О нас' - все данные управляются из админки"""
# Hero Section
hero_badge = models.CharField(max_length=100, default='🚀 О нас', verbose_name='Hero Badge')
hero_title = models.CharField(max_length=200, default='Мы создаем цифровое будущее', verbose_name='Заголовок Hero')
hero_description = models.TextField(default='SmartSolTech - это команда профессионалов...', verbose_name='Описание Hero')
# Statistics
stat_projects = models.IntegerField(default=50, verbose_name='Количество проектов')
stat_clients = models.IntegerField(default=30, verbose_name='Количество клиентов')
stat_years = models.IntegerField(default=3, verbose_name='Лет опыта')
stat_support = models.CharField(max_length=50, default='24/7', verbose_name='Поддержка')
# Mission Section
mission_badge = models.CharField(max_length=100, default='🎯 Наша миссия', verbose_name='Mission Badge')
mission_title = models.CharField(max_length=200, default='Делаем технологии доступными', verbose_name='Заголовок миссии')
mission_description = models.TextField(verbose_name='Описание миссии')
mission_point_1_title = models.CharField(max_length=200, default='Инновационные решения', verbose_name='Пункт миссии 1')
mission_point_1_text = models.TextField(default='Используем передовые технологии...', verbose_name='Текст пункта 1')
mission_point_2_title = models.CharField(max_length=200, default='Клиентоориентированность', verbose_name='Пункт миссии 2')
mission_point_2_text = models.TextField(default='Фокусируемся на потребностях...', verbose_name='Текст пункта 2')
mission_point_3_title = models.CharField(max_length=200, default='Непрерывное развитие', verbose_name='Пункт миссии 3')
mission_point_3_text = models.TextField(default='Постоянно совершенствуем...', verbose_name='Текст пункта 3')
# Vision Section
vision_badge = models.CharField(max_length=100, default='🔮 Наше видение', verbose_name='Vision Badge')
vision_title = models.CharField(max_length=200, default='Будущее начинается сегодня', verbose_name='Заголовок видения')
vision_description = models.TextField(verbose_name='Описание видения')
# Skills
skill_1_name = models.CharField(max_length=100, default='Веб-разработка', verbose_name='Навык 1')
skill_1_percent = models.IntegerField(default=95, verbose_name='Процент навыка 1')
skill_2_name = models.CharField(max_length=100, default='Мобильная разработка', verbose_name='Навык 2')
skill_2_percent = models.IntegerField(default=90, verbose_name='Процент навыка 2')
skill_3_name = models.CharField(max_length=100, default='UI/UX Дизайн', verbose_name='Навык 3')
skill_3_percent = models.IntegerField(default=85, verbose_name='Процент навыка 3')
skill_4_name = models.CharField(max_length=100, default='DevOps', verbose_name='Навык 4')
skill_4_percent = models.IntegerField(default=80, verbose_name='Процент навыка 4')
# Team Section
team_badge = models.CharField(max_length=100, default='👥 Команда', verbose_name='Team Badge')
team_title = models.CharField(max_length=200, default='Познакомьтесь с нашей командой', verbose_name='Заголовок команды')
team_description = models.TextField(default='Талантливые профессионалы...', verbose_name='Описание команды')
# Values Section
values_badge = models.CharField(max_length=100, default='💎 Наши ценности', verbose_name='Values Badge')
values_title = models.CharField(max_length=200, default='Что нами движет', verbose_name='Заголовок ценностей')
value_1_icon = models.CharField(max_length=50, default='fa-lightbulb', verbose_name='Иконка ценности 1')
value_1_title = models.CharField(max_length=100, default='Инновации', verbose_name='Ценность 1')
value_1_text = models.TextField(default='Мы постоянно ищем новые решения...', verbose_name='Текст ценности 1')
value_2_icon = models.CharField(max_length=50, default='fa-handshake', verbose_name='Иконка ценности 2')
value_2_title = models.CharField(max_length=100, default='Партнерство', verbose_name='Ценность 2')
value_2_text = models.TextField(default='Строим долгосрочные отношения...', verbose_name='Текст ценности 2')
value_3_icon = models.CharField(max_length=50, default='fa-chart-line', verbose_name='Иконка ценности 3')
value_3_title = models.CharField(max_length=100, default='Результат', verbose_name='Ценность 3')
value_3_text = models.TextField(default='Фокусируемся на достижении целей...', verbose_name='Текст ценности 3')
value_4_icon = models.CharField(max_length=50, default='fa-shield-alt', verbose_name='Иконка ценности 4')
value_4_title = models.CharField(max_length=100, default='Надежность', verbose_name='Ценность 4')
value_4_text = models.TextField(default='Гарантируем качество и безопасность...', verbose_name='Текст ценности 4')
# Contact Section
contact_title = models.CharField(max_length=200, default='Готовы начать проект?', verbose_name='Заголовок контактов')
contact_description = models.TextField(default='Свяжитесь с нами сегодня...', verbose_name='Описание контактов')
# Meta
is_active = models.BooleanField(default=True, verbose_name='Активна')
updated_at = models.DateTimeField(auto_now=True, verbose_name='Обновлено')
class Meta:
verbose_name = 'Страница О нас'
verbose_name_plural = 'Страницы О нас'
def __str__(self):
return f"О нас (обновлено: {self.updated_at.strftime('%d.%m.%Y')})"
def save(self, *args, **kwargs):
# Оставляем только одну активную запись
if self.is_active:
AboutPage.objects.exclude(pk=self.pk).update(is_active=False)
super().save(*args, **kwargs)
class FooterSettings(models.Model):
"""Настройки футера - все данные управляются из админки"""
# Company Info
company_name = models.CharField(max_length=100, default='SmartSolTech', verbose_name='Название компании')
company_description = models.TextField(
default='Мы создаем инновационные IT-решения, которые помогают бизнесу расти...',
verbose_name='Описание компании'
)
company_logo_icon = models.CharField(max_length=50, default='fa-code', verbose_name='Иконка компании')
# Social Links
telegram_url = models.URLField(blank=True, verbose_name='Telegram URL')
instagram_url = models.URLField(blank=True, verbose_name='Instagram URL')
linkedin_url = models.URLField(blank=True, verbose_name='LinkedIn URL')
github_url = models.URLField(blank=True, verbose_name='GitHub URL')
facebook_url = models.URLField(blank=True, verbose_name='Facebook URL')
twitter_url = models.URLField(blank=True, verbose_name='Twitter URL')
# Contact Info
email = models.EmailField(default='info@smartsoltech.kr', verbose_name='Email')
phone = models.CharField(max_length=50, default='+82-10-XXXX-XXXX', verbose_name='Телефон')
address = models.TextField(default='Seoul, South Korea', verbose_name='Адрес')
# Services Links (for footer menu)
show_services_menu = models.BooleanField(default=True, verbose_name='Показывать меню услуг')
services_title = models.CharField(max_length=100, default='Услуги', verbose_name='Заголовок меню услуг')
# Company Links (for footer menu)
show_company_menu = models.BooleanField(default=True, verbose_name='Показывать меню компании')
company_menu_title = models.CharField(max_length=100, default='Компания', verbose_name='Заголовок меню компании')
# Copyright
copyright_text = models.CharField(
max_length=200,
default='© 2025 SmartSolTech. Все права защищены.',
verbose_name='Текст Copyright'
)
# Integration Scripts
google_analytics = models.TextField(
blank=True,
verbose_name='Google Analytics',
help_text='Вставьте код Google Analytics (без тегов <script>)'
)
google_adsense = models.TextField(
blank=True,
verbose_name='Google AdSense',
help_text='Вставьте код Google AdSense (без тегов <script>)'
)
yandex_metrika = models.TextField(
blank=True,
verbose_name='Яндекс Метрика',
help_text='Вставьте код Яндекс Метрики (без тегов <script>)'
)
facebook_pixel = models.TextField(
blank=True,
verbose_name='Facebook Pixel',
help_text='Вставьте код Facebook Pixel (без тегов <script>)'
)
custom_head_scripts = models.TextField(
blank=True,
verbose_name='Скрипты в <head>',
help_text='Дополнительные скрипты для вставки в <head> (с тегами <script>)'
)
custom_body_scripts = models.TextField(
blank=True,
verbose_name='Скрипты перед </body>',
help_text='Дополнительные скрипты для вставки перед закрывающим </body> (с тегами <script>)'
)
# Meta
is_active = models.BooleanField(default=True, verbose_name='Активно')
updated_at = models.DateTimeField(auto_now=True, verbose_name='Обновлено')
class Meta:
verbose_name = 'Настройки футера'
verbose_name_plural = 'Настройки футера'
def __str__(self):
return f"Футер (обновлено: {self.updated_at.strftime('%d.%m.%Y')})"
def save(self, *args, **kwargs):
# Оставляем только одну активную запись
if self.is_active:
FooterSettings.objects.exclude(pk=self.pk).update(is_active=False)
super().save(*args, **kwargs)