diff --git a/vacancy/constants.py b/vacancy/constants.py new file mode 100644 index 00000000..4458a8ce --- /dev/null +++ b/vacancy/constants.py @@ -0,0 +1,33 @@ +from enum import Enum + + +class ChoicesMixin: + + @classmethod + def choices(cls): + """Return a list of tuples (value, display_name) for choices.""" + return [(item.value, item.value) for item in cls] + + +class WorkExperience(ChoicesMixin, Enum): + + NO_EXPERIENCE: str = "Без опыта" + UP_TO_A_YEAR: str = "До 1 года" + FROM_ONE_TO_THREE_YEARS: str = "От 1 года до 3 лет" + FROM_THREE_YEARS: str = "От 3 лет и более" + + +class WorkSchedule(ChoicesMixin, Enum): + + FULL_TIME: str = "Полный рабочий день" + SHIFT_WORK: str = "Сменный график" + FLEXIBLE_SCHEDULE: str = "Гибкий график" + PART_TIME: str = "Частичная занятость" + INTERNSHIP: str = "Стажировка" + + +class WorkFormat(ChoicesMixin, Enum): + + REMOTE: str = "Удаленная работа" + OFFICE: str = "Работа в офисе" + HYBRID: str = "Смешанная" diff --git a/vacancy/migrations/0007_vacancy_required_experience_vacancy_work_format_and_more.py b/vacancy/migrations/0007_vacancy_required_experience_vacancy_work_format_and_more.py new file mode 100644 index 00000000..64cae3cb --- /dev/null +++ b/vacancy/migrations/0007_vacancy_required_experience_vacancy_work_format_and_more.py @@ -0,0 +1,61 @@ +# Generated by Django 4.2.11 on 2024-12-02 17:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("vacancy", "0006_vacancy_datetime_closed"), + ] + + operations = [ + migrations.AddField( + model_name="vacancy", + name="required_experience", + field=models.CharField( + blank=True, + choices=[ + ("Без опыта", "Без опыта"), + ("До 1 года", "До 1 года"), + ("От 1 года до 3 лет", "От 1 года до 3 лет"), + ("От 3 лет и более", "От 3 лет и более"), + ], + max_length=50, + null=True, + verbose_name="Требуемый опыт", + ), + ), + migrations.AddField( + model_name="vacancy", + name="work_format", + field=models.CharField( + blank=True, + choices=[ + ("Удаленная работа", "Удаленная работа"), + ("Работа в офисе", "Работа в офисе"), + ("Смешанная", "Смешанная"), + ], + max_length=50, + null=True, + verbose_name="Формат работы", + ), + ), + migrations.AddField( + model_name="vacancy", + name="work_schedule", + field=models.CharField( + blank=True, + choices=[ + ("Полный рабочий день", "Полный рабочий день"), + ("Сменный график", "Сменный график"), + ("Гибкий график", "Гибкий график"), + ("Частичная занятость", "Частичная занятость"), + ("Стажировка", "Стажировка"), + ], + max_length=50, + null=True, + verbose_name="График работы", + ), + ), + ] diff --git a/vacancy/models.py b/vacancy/models.py index b3a34486..0dbb0f99 100644 --- a/vacancy/models.py +++ b/vacancy/models.py @@ -4,6 +4,7 @@ from files.models import UserFile from projects.models import Project +from vacancy.constants import WorkExperience, WorkSchedule, WorkFormat from vacancy.managers import VacancyManager, VacancyResponseManager from django_stubs_ext.db.models import TypedModelMeta @@ -16,6 +17,9 @@ class Vacancy(models.Model): role: A CharField title of the vacancy. required_skills: A GenericRelation of required skills for the vacancy. description: A TextField description of the vacancy. + required_experience: CharField (choice). + work_schedule: CharField (choice). + work_format: CharField (choice). project: A ForeignKey referring to the Company model. is_active: A boolean indicating if Vacancy is active. datetime_created: A DateTimeField indicating date of creation. @@ -28,24 +32,49 @@ class Vacancy(models.Model): related_query_name="vacancies", ) description = models.TextField(blank=True) + required_experience = models.CharField( + max_length=50, + choices=WorkExperience.choices(), + blank=True, + null=True, + verbose_name="Требуемый опыт", + ) + work_schedule = models.CharField( + max_length=50, + choices=WorkSchedule.choices(), + blank=True, + null=True, + verbose_name="График работы", + ) + work_format = models.CharField( + max_length=50, + choices=WorkFormat.choices(), + blank=True, + null=True, + verbose_name="Формат работы", + ) project = models.ForeignKey( Project, on_delete=models.CASCADE, null=False, related_name="vacancies", ) - - is_active = models.BooleanField(blank=False, default=True) - datetime_created = models.DateTimeField( - verbose_name="Дата создания", null=False, auto_now_add=True + null=False, + auto_now_add=True, + verbose_name="Дата создания", ) datetime_updated = models.DateTimeField( - verbose_name="Дата обновления", null=False, auto_now=True + null=False, + auto_now=True, + verbose_name="Дата обновления", ) datetime_closed = models.DateTimeField( - verbose_name="Дата закрытия", null=True, blank=True + null=True, + blank=True, + verbose_name="Дата закрытия", ) + is_active = models.BooleanField(blank=False, default=True) objects = VacancyManager() diff --git a/vacancy/serializers.py b/vacancy/serializers.py index d8b3c839..ef4f5833 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -88,6 +88,9 @@ class Meta: "datetime_updated", "datetime_closed", "response_count", + "required_experience", + "work_schedule", + "work_format", ] read_only_fields = ["project"] @@ -202,6 +205,9 @@ class Meta: "is_active", "datetime_closed", "response_count", + "required_experience", + "work_schedule", + "work_format", ]