Skip to content

Commit 4b2c87d

Browse files
committed
pro-84: finished with specializations migration
1 parent 400bf2d commit 4b2c87d

4 files changed

Lines changed: 218 additions & 1 deletion

File tree

core/admin.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django.contrib import admin
2-
from core.models import Like, View, Link
2+
from core.models import Like, View, Link, Specialization, SpecializationCategory
33

44

55
@admin.register(Like)
@@ -18,3 +18,28 @@ class ViewAdmin(admin.ModelAdmin):
1818
class LinkAdmin(admin.ModelAdmin):
1919
list_display = ("id", "link", "content_type", "object_id", "content_object")
2020
list_display_links = ("id", "link", "content_type", "object_id", "content_object")
21+
22+
23+
@admin.register(Specialization)
24+
class SpecializationAdmin(admin.ModelAdmin):
25+
list_display = (
26+
"id",
27+
"name",
28+
"category",
29+
)
30+
list_display_links = (
31+
"id",
32+
"name",
33+
)
34+
35+
36+
@admin.register(SpecializationCategory)
37+
class SpecializationCategoryAdmin(admin.ModelAdmin):
38+
list_display = (
39+
"id",
40+
"name",
41+
)
42+
list_display_links = (
43+
"id",
44+
"name",
45+
)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Generated by Django 4.2.3 on 2023-12-23 10:31
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
("core", "0006_auto_20231216_1518"),
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name="SpecializationCategory",
16+
fields=[
17+
(
18+
"id",
19+
models.BigAutoField(
20+
auto_created=True,
21+
primary_key=True,
22+
serialize=False,
23+
verbose_name="ID",
24+
),
25+
),
26+
("name", models.TextField()),
27+
],
28+
),
29+
migrations.CreateModel(
30+
name="Specialization",
31+
fields=[
32+
(
33+
"id",
34+
models.BigAutoField(
35+
auto_created=True,
36+
primary_key=True,
37+
serialize=False,
38+
verbose_name="ID",
39+
),
40+
),
41+
("name", models.TextField()),
42+
(
43+
"category",
44+
models.ForeignKey(
45+
on_delete=django.db.models.deletion.CASCADE,
46+
related_name="specializations",
47+
to="core.specializationcategory",
48+
),
49+
),
50+
],
51+
),
52+
]
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# Generated by Django 4.2.3 on 2023-12-23 10:31
2+
3+
from django.db import migrations
4+
5+
from core.models import SpecializationCategory, Specialization
6+
7+
SPECIALIZATIONS = [['Back-end', 'IT'], ['Front-end', 'IT'], ['DevOps', 'IT'], ['Fullstack', 'IT'],
8+
['SEO-специалист', 'IT'], ['Таргетолог', 'IT'], ['Контекстолог', 'IT'], ['Линкбилдер', 'IT'],
9+
['Копирайтер', 'IT'], ['Мобильный разработчик', 'IT'], ['iOS-разработчик', 'IT'],
10+
['QA-engineer', 'IT'], ['Разработчик баз данных', 'IT'], ['Администратор баз данных', 'IT'],
11+
['Системный аналитик', 'IT'], ['Embedded-программист', 'IT'], ['Game Developer', 'IT'],
12+
['Программист 1С', 'IT'], ['Программист PHP', 'IT'], ['Программист Java', 'IT'],
13+
['Программист Kotlin', 'IT'], ['Программист Ruby', 'IT'], ['Программист JavaScript', 'IT'],
14+
['Программист Python', 'IT'], ['Программист C++', 'IT'], ['Программист C#', 'IT'],
15+
['Верстальщик', 'IT'], ['Инженер VR', 'IT'], ['ERP-программист', 'IT'], ['Системный инженер', 'IT'],
16+
['Системный администратор', 'IT'], ['Data Scientist', 'IT'],
17+
['Специалист по кибербезопасности', 'IT'], ['Биоинформатик', 'IT'], ['Data Mining', 'IT'],
18+
['BI-разработчик', 'IT'], ['Блокчейн-разработчик', 'IT'], ['ML-инженер', 'IT'],
19+
['Link-менеджер', 'Менеджмент'], ['Тимлид', 'Менеджмент'], ['Риск-менеджер', 'Менеджмент'],
20+
['Бизнес аналитик', 'Менеджмент'], ['Project Manager', 'Менеджмент'],
21+
['Product Manager', 'Менеджмент'], ['Менеджер IT проектов', 'Менеджмент'],
22+
['HR Generalist', 'Менеджмент'], ['Менеджер проектов ', 'Менеджмент'],
23+
['Менеджер по продажам', 'Менеджмент'], ['Менеджер проекта', 'Менеджмент'],
24+
['Бренд-менеджер', 'Менеджмент'], ['Менеджер по маркетингу', 'Менеджмент'],
25+
['Менеджер по персоналу', 'Менеджмент'], ['Менеджер по закупкам', 'Менеджмент'],
26+
['Менеджер по логистике', 'Менеджмент'], ['Операционный менеджер', 'Менеджмент'],
27+
['Финансовый менеджер', 'Менеджмент'], ['Менеджер по клиентскому сервису', 'Менеджмент'],
28+
['PR-менеджер', 'Менеджмент'], ['Менеджер по работе с партнерами', 'Менеджмент'],
29+
['Менеджер образовательных программ', 'Менеджмент'], ['Менеджер культурных проектов', 'Менеджмент'],
30+
['Спортивный менеджер', 'Менеджмент'], ['Медицинский менеджер', 'Менеджмент'],
31+
['Экологический менеджер', 'Менеджмент'], ['Менеджер по талантам', 'Менеджмент'],
32+
['Менеджер благотворительных программ', 'Менеджмент'],
33+
['Менеджер гостиницы и ресторанов', 'Менеджмент'], ['Менеджер авиационной отрасли', 'Менеджмент'],
34+
['Менеджер судоходной отрасли', 'Менеджмент'], ['Менеджер в сфере недвижимости', 'Менеджмент'],
35+
['Менеджер кино и телевидения', 'Менеджмент'], ['Менеджер социальных сетей', 'Менеджмент'],
36+
['Цифровой менеджер', 'Менеджмент'], ['Менеджер по электронной коммерции', 'Менеджмент'],
37+
['Менеджер стартапа', 'Менеджмент'], ['Менеджер инноваций', 'Менеджмент'],
38+
['Менеджер продукта', 'Менеджмент'], ['Менеджер логистического центра', 'Менеджмент'],
39+
['Менеджер склада', 'Менеджмент'], ['Менеджер цепочки поставок', 'Менеджмент'],
40+
['Менеджер качества', 'Менеджмент'], ['Менеджер контроля производства', 'Менеджмент'],
41+
['Менеджер производственных линий', 'Менеджмент'],
42+
['Менеджер закупок сырья и материалов', 'Менеджмент'], ['Менеджер отдела снабжения', 'Менеджмент'],
43+
['Менеджер логистики и транспорта', 'Менеджмент'],
44+
['Менеджер по международным операциям', 'Менеджмент'],
45+
['Международный менеджер проекта', 'Менеджмент'], ['Менеджер экспортных операций', 'Менеджмент'],
46+
['Менеджер импорта', 'Менеджмент'], ['Региональный менеджер', 'Менеджмент'],
47+
['Территориальный менеджер', 'Менеджмент'], ['Менеджер франшизы', 'Менеджмент'],
48+
['Менеджер образовательного учреждения', 'Менеджмент'], ['Менеджер ресторана', 'Менеджмент'],
49+
['Менеджер отеля', 'Менеджмент'], ['Фитнес-менеджер', 'Менеджмент'],
50+
['Медицинский менеджер клиники или больницы', 'Менеджмент'],
51+
['Менеджер культурного учреждения', 'Менеджмент'], ['Музейный менеджер', 'Менеджмент'],
52+
['Музыкальный менеджер', 'Менеджмент'], ['Литературный менеджер', 'Менеджмент'],
53+
['Театральный менеджер', 'Менеджмент'], ['Спортивный менеджер', 'Менеджмент'],
54+
['Менеджер спортивной школы или секции', 'Менеджмент'], ['Военный менеджер', 'Менеджмент'],
55+
['Политический менеджер', 'Менеджмент'], ['Корпоративный менеджер', 'Менеджмент'],
56+
['HR-менеджер (менеджер по персоналу)', 'Менеджмент'],
57+
['Финансовый аналитик/менеджер', 'Менеджмент'], ['Финансовый контролер/менеджер', 'Менеджмент'],
58+
['CEO', 'Менеджмент'], ['Founder', 'Менеджмент'], ['Co-Founder', 'Менеджмент'],
59+
['Маркетолог', 'Реклама'], ['Бренд-менеджер', 'Реклама'], ['PR-менеджер', 'Реклама'],
60+
['Копирайтер', 'Реклама'], ['Контент-менеджер', 'Реклама'], ['Журналист', 'Реклама'],
61+
['Дизайнер', 'Реклама'], ['Иллюстратор', 'Реклама'], ['Арт-директор', 'Реклама'],
62+
['Фотограф', 'Реклама'], ['Видеооператор', 'Реклама'], ['Веб-разработчик', 'Реклама'],
63+
['SMM-специалист', 'Реклама'], ['Таргетолог', 'Реклама'], ['Аналитик', 'Реклама'],
64+
['Мерчандайзер', 'Реклама'], ['Промоутер', 'Реклама'], ['Event-менеджер', 'Реклама'],
65+
['Визажист', 'Реклама'], ['Стилист', 'Реклама'], ['Промоушен-менеджер.', 'Реклама'],
66+
['Художник-мультипликатор', 'Реклама'], ['Инженер-конструктор', 'Инженерия'],
67+
['Инженер-технолог', 'Инженерия'], ['Инженер-программист', 'Инженерия'],
68+
['Инженер по качеству', 'Инженерия'], ['Инженер-электрик', 'Инженерия'],
69+
['Инженер-строитель', 'Инженерия'], ['Инженер-механик', 'Инженерия'],
70+
['Инженер-эколог', 'Инженерия'], ['Инженер-геодезист', 'Инженерия'],
71+
['Инженер по автоматизации и роботизации', 'Инженерия'], ['Инженер по сварке', 'Инженерия'],
72+
['Инженер по эксплуатации и ремонту', 'Инженерия'], ['Гидроинженер', 'Инженерия'],
73+
['Биоинженер', 'Инженерия'], ['Астроинженер', 'Инженерия'],
74+
['Инженер по аппаратному обеспечению', 'Инженерия'], ['Инженер по надежности', 'Инженерия'],
75+
['Инженер по управлению производством', 'Инженерия'], ['Инженер-экономист', 'Инженерия'],
76+
['3D моделлер', 'Инженерия'], ['Юрист', 'Юриспруденция'], ['Адвокат', 'Юриспруденция'],
77+
['Нотариат', 'Юриспруденция'], ['Прокурор', 'Юриспруденция'], ['Судья', 'Юриспруденция'],
78+
['Медиатор', 'Юриспруденция'], ['Корпоративный юрист', 'Юриспруденция'],
79+
['Налоговый юрист', 'Юриспруденция'], ['Криминальный юрист', 'Юриспруденция'],
80+
['Семейный юрист', 'Юриспруденция'], ['Международный юрист', 'Юриспруденция'],
81+
['Специалист по правам человека', 'Юриспруденция'], ['Юридический консультант', 'Юриспруденция'],
82+
['Эксперт по законодательству', 'Юриспруденция'], ['Страховой юрист', 'Юриспруденция'],
83+
['Патентный поверенный', 'Юриспруденция'], ['Таможенный брокер', 'Юриспруденция'],
84+
['Юрисконсульт', 'Юриспруденция'], ['Судебный пристав', 'Юриспруденция'],
85+
['Законодатель', 'Юриспруденция'], ['Финансовый аналитик', 'Финансы'], ['Бухгалтер', 'Финансы'],
86+
['Экономист', 'Финансы'], ['Аудитор', 'Финансы'], ['Менеджер по инвестициям', 'Финансы'],
87+
['Кредитный специалист', 'Финансы'], ['Риелтор', 'Финансы'], ['Трейдер', 'Финансы'],
88+
['Инвестиционный банкир', 'Финансы'], ['Страховой агент', 'Финансы'], ['Брокер', 'Финансы'],
89+
['Налоговый консультант', 'Финансы'], ['Кассир', 'Финансы'], ['Финансовый контролер', 'Финансы'],
90+
['Специалист по финансовому планированию', 'Финансы'],
91+
['Специалист по обработке кредитных заявок', 'Финансы'],
92+
['Специалист по страхованию имущества', 'Финансы'], ['Валютный трейдер', 'Финансы'],
93+
['Биржевой маклер', 'Финансы']]
94+
95+
96+
def fill_specializations(apps, schema_editor):
97+
specs_set = set()
98+
categories_set = set()
99+
for spec, category in SPECIALIZATIONS:
100+
spec = spec.strip()
101+
category = category.strip()
102+
if category not in categories_set:
103+
category_obj = SpecializationCategory.objects.create(name=category)
104+
category_obj.save()
105+
categories_set.add(category)
106+
107+
if spec not in specs_set:
108+
try:
109+
category_obj = SpecializationCategory.objects.get(name=category)
110+
specs_set.add(spec)
111+
spec_obj = Specialization.objects.create(name=spec, category=category_obj)
112+
spec_obj.save()
113+
except Exception as error:
114+
print('An error during migration:', error)
115+
116+
117+
def reverse(apps, schema_editor):
118+
SpecializationCategory.objects.all().delete()
119+
Specialization.objects.all().delete()
120+
121+
122+
class Migration(migrations.Migration):
123+
dependencies = [
124+
("core", "0007_specializationcategory_specialization"),
125+
]
126+
127+
operations = [
128+
migrations.RunPython(fill_specializations, reverse_code=reverse),
129+
]

core/models.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,14 @@ class SkillToObject(models.Model):
150150
)
151151
object_id = models.PositiveIntegerField()
152152
content_object = GenericForeignKey("content_type", "object_id")
153+
154+
155+
class SpecializationCategory(models.Model):
156+
name = models.TextField()
157+
158+
159+
class Specialization(models.Model):
160+
name = models.TextField()
161+
category = models.ForeignKey(
162+
SpecializationCategory, related_name="specializations", on_delete=models.CASCADE
163+
)

0 commit comments

Comments
 (0)