feat: добавлены модели AboutPage и FooterSettings с админ-панелью и интеграцией скриптов
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user