class EducationDirection(models.Model): specialization = models.ForeignKey( "Specialization", verbose_name=_("Специальность"), on_delete=models.CASCADE, related_name="directions", db_index=True, ) class EducationForms(models.TextChoices): full_time = "full_time", "Очная" part_time = "part_time", "Очно-заочная" distance = "distance", "Заочная" education_form = models.CharField( _("Форма обучения"), max_length=count_max_length(EducationForms), choices=EducationForms.choices, db_index=True, ) duration = models.PositiveSmallIntegerField(_("Продолжительность"), help_text="В месяцах") objects = EducationDirectionQuerySet.as_manager() class Meta: verbose_name = "Направление обучения" verbose_name_plural = "Направления обучения" unique_together = ("specialization", "education_form")
class EnrolleeSpecialization(models.Model): priority = models.SmallIntegerField(_("Приоритет"), db_index=True) specialization = models.ForeignKey( "specs.EducationDirection", verbose_name=_("Специализация"), on_delete=models.CASCADE, db_index=True, ) class EducationForms(models.TextChoices): budget = "budget", "Бюджетная" contract = "contract", "Платная основа" education_form = models.CharField( _("Форма обучения"), choices=EducationForms.choices, max_length=count_max_length(EducationForms), ) enrollee = models.ForeignKey( "Enrollee", verbose_name=_("Абитуриент"), on_delete=models.CASCADE, related_name="directions", ) class Meta: verbose_name = "Специализация абитуриента" verbose_name_plural = "Специализации абитуриентов" ordering = ("priority", ) unique_together = ("priority", "enrollee")
class GosOlympiadStatus(models.Model): status = models.CharField( _("Статус"), max_length=count_max_length(OlympiadStatuses), choices=OlympiadStatuses.choices, ) class Levels(models.TextChoices): country = "country", "Всероссийской" region = "region", "Областной" level = models.CharField(_("Уровень"), max_length=count_max_length(Levels), choices=Levels.choices) subject = models.CharField(_("Наименование предмета"), max_length=50) class Meta: verbose_name = "Участие в государственных олимпиадах" verbose_name_plural = "Участие в государственных олимпиадах"
class AbylimpixStatus(models.Model): status = models.CharField( _("Статус"), max_length=count_max_length(OlympiadStatuses), choices=OlympiadStatuses.choices, ) competition = models.CharField(_("Компетенция"), max_length=128) class Meta: verbose_name = 'Участие в чемпионате "Абилимпикс"' verbose_name_plural = 'Участие в чемпионате "Абилимпикс"'
class WsrOlympiadStatus(models.Model): status = models.CharField( _("Статус"), max_length=count_max_length(OlympiadStatuses), choices=OlympiadStatuses.choices, ) competition = models.CharField(_("Компетенция"), max_length=128) class Meta: verbose_name = 'Участие в чемпионате "Молодые профессионалы (WSR)"' verbose_name_plural = 'Участие в чемпионате "Молодые профессионалы (WSR)"'
class EducationDoc(models.Model): class Types(models.TextChoices): credential = "credential", "Аттестат" type = models.CharField(_("Тип"), max_length=count_max_length(Types), choices=Types.choices) num = models.CharField(_("Номер"), max_length=50) grade = models.PositiveSmallIntegerField(_("Оценка"), db_index=True) class Meta: verbose_name = "Документ об образовании" verbose_name_plural = "Документы об образовании"
class Enrollee(models.Model): first_name = models.CharField(_("Имя"), max_length=128) last_name = models.CharField(_("Фамилия"), max_length=128) middle_name = models.CharField(_("Отчество"), max_length=128) birth_date = models.DateField(_("Дата рождения"), auto_now=False, auto_now_add=False, db_index=True) birth_place = models.CharField(_("Место рождения"), max_length=128) # fixme: более точные гражданства, возможно из списка citizenship = models.CharField(_("Гражданство"), max_length=128) passport = models.OneToOneField("EnrolleePassport", verbose_name=_("Паспорт"), on_delete=models.CASCADE) residence_place = models.CharField(_("Место проживания"), max_length=256) personal_phone = models.CharField(_("Личный телефон"), max_length=50) home_phone = models.CharField(_("Домашний телефон"), max_length=50, blank=True, null=True) graduated_institution = models.OneToOneField( "GraduatedInstitution", on_delete=models.CASCADE, verbose_name="Окончил", blank=True, null=True, ) education_org = models.ForeignKey( "organizations.EducationOrg", verbose_name=_("Образовательная организация"), on_delete=models.CASCADE, db_index=True, ) class Grades(models.IntegerChoices): five_classes = 0, "5 классов" nine_classes = 1, "9 классов" eleven_classes = 2, "11 классов" special = 3, "Среднее специальное образование" incomplete_higher = 4, "Неоконченное высшее" higher = 5, "Высшее" grade = models.PositiveSmallIntegerField(_("Уровень образование"), choices=Grades.choices, db_index=True) education_doc = models.OneToOneField( "EducationDoc", verbose_name=_("Документ об образовании"), on_delete=models.CASCADE, blank=True, null=True, db_index=True, ) english = models.BooleanField(_("Английский язык"), db_index=True) has_goal_contract = models.BooleanField( _("Наличие договора о целевом обучении"), db_index=True) gos_olympiad_status = models.OneToOneField( "GosOlympiadStatus", verbose_name=_("Участие в государственных олимпиадах"), on_delete=models.CASCADE, blank=True, null=True, db_index=True, ) wsr_olympiad_status = models.OneToOneField( "WsrOlympiadStatus", verbose_name=_('Участие в чемпионате "Молодые профессионалы (WSR)"'), on_delete=models.CASCADE, blank=True, null=True, db_index=True, ) abylimpix_status = models.OneToOneField( "AbylimpixStatus", verbose_name=_('Участие в чемпионате "Абилимпикс"'), on_delete=models.CASCADE, blank=True, null=True, db_index=True, ) need_residence = models.BooleanField(_("Общежитие"), db_index=True) is_orphan = models.BooleanField( _("Дети-сироты, дети, оставшиеся без попечения родителей, лица из их числа" ), db_index=True, ) is_handicapped = models.BooleanField(_("Инвалиды"), db_index=True) is_ovz = models.BooleanField(_("Лица с ОВЗ (имеется ПМПК)"), db_index=True) choreography_doc = models.CharField( _("Хореография (подтверждающий документ)"), max_length=128, blank=True, null=True, ) vocal_doc = models.CharField( _("Вокальные данные (подтверждающий документ)"), max_length=128, blank=True, null=True, ) kvn_doc = models.CharField( _("Участие в КВН (подтверждающий документ)"), max_length=128, blank=True, null=True, ) art_doc = models.CharField( _("Художественные навыки (подтверждающий документ)"), max_length=128, blank=True, null=True, ) theatre_doc = models.CharField( _("Участие в театральных постановках (подтверждающий документ)"), max_length=128, blank=True, null=True, ) mother = models.OneToOneField( "ParentData", verbose_name=_("Сведения о матери"), on_delete=models.CASCADE, blank=True, null=True, related_name="+", ) father = models.OneToOneField( "ParentData", verbose_name=_("Сведения об отце"), on_delete=models.CASCADE, blank=True, null=True, related_name="+", ) parents_email = models.EmailField(_("Адрес электронной почты родителей"), max_length=254) is_first_time = models.BooleanField( _("Среднее профессиональное образование получаю впервые")) application_dt = models.DateTimeField(_("Дата подачи заявления"), default=timezone.now, editable=False) class Sexes(models.IntegerChoices): male = 0, "Мужской" female = 1, "Женский" sex = models.PositiveSmallIntegerField("Пол", choices=Sexes.choices, db_index=True) class Statuses(models.TextChoices): enrollee = "enrollee", "Абитуриент" student = "student", "Студент" rejected = "rejected", "Не поступил" status = models.CharField( "Статус", default=Statuses.enrollee, choices=Statuses.choices, max_length=count_max_length(Statuses), ) objects = EnrolleeQuerySet.as_manager() class Meta: verbose_name = "Абитуриент" verbose_name_plural = "Абитуриенты" ordering = ("-application_dt", ) def __str__(self): return f"{self.last_name} {self.first_name} {self.middle_name}"
class Graduate(models.Model): first_name = models.CharField(_("Имя"), max_length=128) last_name = models.CharField(_("Фамилия"), max_length=128) middle_name = models.CharField(_("Отчество"), max_length=128) birth_date = models.DateField(_("Дата рождения"), auto_now=False, auto_now_add=False) specialization = models.ForeignKey( "specs.EducationDirection", verbose_name=_("Специализация"), on_delete=models.CASCADE, ) education_org = models.ForeignKey( "organizations.EducationOrg", verbose_name=_("Образовательное учреждение"), on_delete=models.CASCADE, ) due_at = models.DateField(_("Дата окончания"), auto_now=False, auto_now_add=False, blank=True, null=True) class EducationForms(models.TextChoices): budget = "budget", "Бюджетная" contract = "contract", "Платная основа" education_form = models.CharField( _("Форма обучения"), choices=EducationForms.choices, max_length=count_max_length(EducationForms), ) class Sexes(models.IntegerChoices): male = 0, "Мужской" female = 1, "Женский" sex = models.PositiveSmallIntegerField("Пол", choices=Sexes.choices, db_index=True) class Statuses(models.TextChoices): employed = "employed", "Трудоустроены" employed_by_contract = ( "employed_by_contract", "Трудустроены согласно целевым договорам", ) continue_education = "continue_education", "Продолжили обучение" not_employed = "not_employed", "Не трудоустроены" status = models.CharField("Статус", max_length=count_max_length(Statuses), choices=Statuses.choices) objects = GraduateQuerySet.as_manager() class Meta: verbose_name = "Выпускник" verbose_name_plural = "Выпускники" def __str__(self): return f"{self.last_name} {self.first_name} {self.middle_name}"