👥 Добавлено управление персоналом и карьерой

 Новые функции:
- 🧑‍💻 Team модель для управления сотрудниками
  • Полная информация о персонале (имя, должность, отдел)
  • Фотографии и контактные данные
  • Социальные сети (LinkedIn, GitHub, Telegram)
  • Навыки и опыт работы
  • Гибкие настройки отображения

- 💼 Career модель для вакансий
  • Детальное описание позиций
  • Требования и обязанности
  • Зарплатные вилки
  • Типы занятости и уровни опыта
  • Статусы вакансий и дедлайны

🔧 Админ-панель:
- Удобные интерфейсы для HR-менеджмента
- Группировка полей и фильтрация
- Быстрые действия для массовых операций
- Сортировка по приоритету

📊 База данных:
- Миграция 0013_career_team.py
- Оптимизированные индексы и связи
This commit is contained in:
2025-11-25 15:44:57 +09:00
parent c1616ac542
commit ec01a2ae10
3 changed files with 340 additions and 2 deletions

View File

@@ -0,0 +1,75 @@
# Generated by Django 5.1.1 on 2025-11-25 06:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0012_contactinfo'),
]
operations = [
migrations.CreateModel(
name='Career',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=200, verbose_name='Название вакансии')),
('department', models.CharField(max_length=100, verbose_name='Отдел')),
('location', models.CharField(default='Кванджу, Южная Корея', max_length=200, verbose_name='Местоположение')),
('employment_type', models.CharField(choices=[('full_time', 'Полная занятость'), ('part_time', 'Частичная занятость'), ('contract', 'Контракт'), ('internship', 'Стажировка'), ('remote', 'Удаленная работа'), ('freelance', 'Фриланс')], default='full_time', max_length=20, verbose_name='Тип занятости')),
('experience_level', models.CharField(choices=[('junior', 'Junior (0-1 год)'), ('middle', 'Middle (2-4 года)'), ('senior', 'Senior (5+ лет)'), ('lead', 'Team Lead'), ('intern', 'Стажер')], default='middle', max_length=20, verbose_name='Уровень опыта')),
('description', models.TextField(verbose_name='Описание вакансии')),
('responsibilities', models.TextField(verbose_name='Обязанности')),
('requirements', models.TextField(verbose_name='Требования')),
('benefits', models.TextField(blank=True, verbose_name='Преимущества и условия')),
('salary_min', models.PositiveIntegerField(blank=True, null=True, verbose_name='Зарплата от (₩)')),
('salary_max', models.PositiveIntegerField(blank=True, null=True, verbose_name='Зарплата до (₩)')),
('salary_currency', models.CharField(default='KRW', max_length=10, verbose_name='Валюта')),
('required_skills', models.TextField(help_text='Разделите навыки запятыми', verbose_name='Обязательные навыки')),
('preferred_skills', models.TextField(blank=True, help_text='Разделите навыки запятыми', verbose_name='Желательные навыки')),
('status', models.CharField(choices=[('active', 'Активная'), ('paused', 'Приостановлена'), ('closed', 'Закрыта'), ('draft', 'Черновик')], default='active', max_length=20, verbose_name='Статус')),
('is_featured', models.BooleanField(default=False, verbose_name='Рекомендуемая вакансия')),
('application_deadline', models.DateField(blank=True, null=True, verbose_name='Дедлайн подачи заявок')),
('contact_email', models.EmailField(default='hr@smartsoltech.kr', max_length=254, verbose_name='Email для связи')),
('contact_person', models.CharField(blank=True, max_length=200, verbose_name='Контактное лицо')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('published_at', models.DateTimeField(blank=True, null=True, verbose_name='Дата публикации')),
],
options={
'verbose_name': 'Вакансия',
'verbose_name_plural': 'Карьера',
'ordering': ['-is_featured', '-published_at', '-created_at'],
},
),
migrations.CreateModel(
name='Team',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=100, verbose_name='Имя')),
('last_name', models.CharField(max_length=100, verbose_name='Фамилия')),
('position', models.CharField(max_length=200, verbose_name='Должность')),
('department', models.CharField(blank=True, max_length=100, verbose_name='Отдел')),
('bio', models.TextField(blank=True, verbose_name='Биография/Описание')),
('photo', models.ImageField(blank=True, null=True, upload_to='static/img/team/', verbose_name='Фотография')),
('email', models.EmailField(blank=True, max_length=254, verbose_name='Email')),
('phone', models.CharField(blank=True, max_length=20, verbose_name='Телефон')),
('linkedin', models.URLField(blank=True, verbose_name='LinkedIn')),
('github', models.URLField(blank=True, verbose_name='GitHub')),
('telegram', models.CharField(blank=True, max_length=100, verbose_name='Telegram')),
('skills', models.TextField(blank=True, help_text='Разделите навыки запятыми', verbose_name='Навыки')),
('experience_years', models.PositiveIntegerField(default=0, verbose_name='Лет опыта')),
('is_active', models.BooleanField(default=True, verbose_name='Активен')),
('display_order', models.PositiveIntegerField(default=0, verbose_name='Порядок отображения')),
('show_on_about', models.BooleanField(default=True, verbose_name='Показывать на странице О нас')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
options={
'verbose_name': 'Сотрудник',
'verbose_name_plural': 'Команда',
'ordering': ['display_order', 'last_name', 'first_name'],
},
),
]