✨ Новые функции: - 🧑💻 Team модель для управления сотрудниками • Полная информация о персонале (имя, должность, отдел) • Фотографии и контактные данные • Социальные сети (LinkedIn, GitHub, Telegram) • Навыки и опыт работы • Гибкие настройки отображения - 💼 Career модель для вакансий • Детальное описание позиций • Требования и обязанности • Зарплатные вилки • Типы занятости и уровни опыта • Статусы вакансий и дедлайны 🔧 Админ-панель: - Удобные интерфейсы для HR-менеджмента - Группировка полей и фильтрация - Быстрые действия для массовых операций - Сортировка по приоритету 📊 База данных: - Миграция 0013_career_team.py - Оптимизированные индексы и связи
76 lines
6.1 KiB
Python
76 lines
6.1 KiB
Python
# 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'],
|
||
},
|
||
),
|
||
]
|