mirror of
https://github.com/EDeev/deev.space.git
synced 2026-10-07 20:49:59 +03:00
populate_demo падала на импорте несуществующей ArticleCategory, строковых статусах проектов и удалённом поле is_featured; теперь создаёт статусы проектов и работает, это проверяет тест. load_initial_data была загрузчиком старой версии резюме под прежние модели и тоже не запускалась — актуальный контент живёт в админке.
167 lines
7.1 KiB
Python
167 lines
7.1 KiB
Python
"""
|
||
Команда для заполнения базы данных демо-данными.
|
||
Использование: python manage.py populate_demo
|
||
"""
|
||
|
||
from datetime import date
|
||
|
||
from django.contrib.auth import get_user_model
|
||
from django.core.management.base import BaseCommand
|
||
|
||
from main.models import (
|
||
Article,
|
||
Category,
|
||
Education,
|
||
Experience,
|
||
Project,
|
||
ProjectStatus,
|
||
SiteSettings,
|
||
Skill,
|
||
)
|
||
|
||
User = get_user_model()
|
||
|
||
|
||
class Command(BaseCommand):
|
||
help = 'Заполняет базу данных демо-данными'
|
||
|
||
def handle(self, *args, **options):
|
||
self.stdout.write('Создание демо-данных...')
|
||
|
||
# Создание настроек сайта
|
||
settings, created = SiteSettings.objects.get_or_create(
|
||
pk=1,
|
||
defaults={
|
||
'site_name': 'deev.space',
|
||
'site_description': 'Персональный сайт backend-разработчика',
|
||
'owner_name': 'Деев Егор Викторович',
|
||
'owner_title': 'Backend Developer',
|
||
'owner_city': 'Москва',
|
||
'owner_email': 'deev@example.com',
|
||
'owner_phone': '+7 (999) 123-45-67',
|
||
'owner_bio': 'Опытный backend-разработчик с более чем 3-летним стажем...',
|
||
'telegram_url': 'https://t.me/Egor_Deev',
|
||
'github_url': 'https://github.com/Egor-Deev',
|
||
}
|
||
)
|
||
|
||
# Создание навыков
|
||
skills_data = [
|
||
{'name': 'Python', 'category': 'backend', 'icon': 'devicon-python-plain'},
|
||
{'name': 'Django', 'category': 'backend', 'icon': 'devicon-django-plain'},
|
||
{'name': 'FastAPI', 'category': 'backend', 'icon': 'fas fa-bolt'},
|
||
{'name': 'PostgreSQL', 'category': 'database', 'icon': 'devicon-postgresql-plain'},
|
||
{'name': 'Redis', 'category': 'database', 'icon': 'devicon-redis-plain'},
|
||
{'name': 'Docker', 'category': 'devops', 'icon': 'devicon-docker-plain'},
|
||
{'name': 'Git', 'category': 'devops', 'icon': 'devicon-git-plain'},
|
||
{'name': 'Linux', 'category': 'devops', 'icon': 'devicon-linux-plain'},
|
||
{'name': 'HTML/CSS', 'category': 'frontend', 'icon': 'devicon-html5-plain'},
|
||
{'name': 'JavaScript', 'category': 'frontend', 'icon': 'devicon-javascript-plain'},
|
||
]
|
||
|
||
for data in skills_data:
|
||
Skill.objects.get_or_create(**data)
|
||
|
||
# Статусы проектов
|
||
statuses = {}
|
||
for order, (slug, name, color, is_release) in enumerate([
|
||
('completed', 'Релиз', 'success', True),
|
||
('in_development', 'В разработке', 'warning', False),
|
||
]):
|
||
statuses[slug], _ = ProjectStatus.objects.get_or_create(
|
||
slug=slug, defaults={'name': name, 'color': color, 'is_release': is_release, 'order': order}
|
||
)
|
||
|
||
# Создание проектов
|
||
projects_data = [
|
||
{
|
||
'title': 'TaskMaster Pro',
|
||
'slug': 'taskmaster-pro',
|
||
'short_description': 'Система управления задачами с AI-рекомендациями',
|
||
'technologies': 'Python, Django, PostgreSQL, Redis, Celery',
|
||
'status': statuses['completed'],
|
||
'card_size': 'featured',
|
||
'icon': 'fas fa-tasks',
|
||
'show_on_homepage': True,
|
||
},
|
||
{
|
||
'title': 'DataParser',
|
||
'slug': 'dataparser',
|
||
'short_description': 'Высоконагруженный парсер данных с автоматизацией',
|
||
'technologies': 'Python, Scrapy, PostgreSQL, Docker',
|
||
'status': statuses['completed'],
|
||
'card_size': 'regular',
|
||
'icon': 'fas fa-database',
|
||
},
|
||
{
|
||
'title': 'API Gateway',
|
||
'slug': 'api-gateway',
|
||
'short_description': 'Микросервисный API Gateway с авторизацией',
|
||
'technologies': 'Python, FastAPI, Redis, JWT',
|
||
'status': statuses['in_development'],
|
||
'card_size': 'regular',
|
||
'icon': 'fas fa-server',
|
||
},
|
||
]
|
||
|
||
for data in projects_data:
|
||
Project.objects.get_or_create(slug=data['slug'], defaults=data)
|
||
|
||
# Создание категорий статей
|
||
categories_data = [
|
||
{'name': 'Python', 'slug': 'python', 'icon': 'devicon-python-plain'},
|
||
{'name': 'Django', 'slug': 'django', 'icon': 'devicon-django-plain'},
|
||
{'name': 'DevOps', 'slug': 'devops', 'icon': 'fas fa-server'},
|
||
]
|
||
|
||
for data in categories_data:
|
||
Category.objects.get_or_create(slug=data['slug'], defaults=data)
|
||
|
||
# Создание статей
|
||
python_cat = Category.objects.get(slug='python')
|
||
articles_data = [
|
||
{
|
||
'title': 'Асинхронное программирование в Python',
|
||
'slug': 'async-python',
|
||
'excerpt': 'Разбираем asyncio и современные подходы...',
|
||
'post': '<p>Полный текст статьи об асинхронном программировании...</p>',
|
||
'category': python_cat,
|
||
'is_published': True,
|
||
},
|
||
{
|
||
'title': 'Оптимизация Django ORM',
|
||
'slug': 'django-orm-optimization',
|
||
'excerpt': 'Как ускорить запросы к базе данных...',
|
||
'post': '<p>Полный текст статьи об оптимизации Django ORM...</p>',
|
||
'category': Category.objects.get(slug='django'),
|
||
'is_published': True,
|
||
},
|
||
]
|
||
|
||
for data in articles_data:
|
||
Article.objects.get_or_create(slug=data['slug'], defaults=data)
|
||
|
||
# Создание опыта работы
|
||
Experience.objects.get_or_create(
|
||
company='Tech Company',
|
||
defaults={
|
||
'title': 'Backend Developer',
|
||
'start_date': date(2022, 1, 1),
|
||
'is_current': True,
|
||
'description': 'Разработка backend-систем на Python/Django',
|
||
}
|
||
)
|
||
|
||
# Создание образования
|
||
Education.objects.get_or_create(
|
||
institution='Московский Политехнический Университет',
|
||
defaults={
|
||
'institution_short': 'МосПолитех',
|
||
'degree': 'Информационные системы и технологии',
|
||
'education_type': 'university',
|
||
'start_year': 2021,
|
||
'is_current': True,
|
||
}
|
||
)
|
||
|
||
self.stdout.write(self.style.SUCCESS('Демо-данные успешно созданы!'))
|