2025-05-18 21:29:04 +03:00
|
|
|
from django.db import models
|
|
|
|
|
from education.models import AcademicYear, Specialty, Student # Предполагается, что модели находятся в приложении education
|
|
|
|
|
from employees.models import Employee # Предполагается, что модель Employee находится в приложении employees
|
|
|
|
|
|
|
|
|
|
## Учет мероприятий (название приложения: events)
|
|
|
|
|
|
|
|
|
|
class EventStatus(models.Model):
|
|
|
|
|
name = models.CharField(max_length=100, verbose_name="Название статуса")
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
verbose_name = "Статус проведения"
|
|
|
|
|
verbose_name_plural = "Статусы проведения"
|
2025-05-18 22:48:39 +03:00
|
|
|
ordering = ["name"]
|
2025-05-18 21:29:04 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class ActivityType(models.Model):
|
|
|
|
|
name = models.CharField(max_length=100, verbose_name="Название вида деятельности")
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
verbose_name = "Деятельность мероприятия"
|
|
|
|
|
verbose_name_plural = "Деятельности мероприятий"
|
2025-05-18 22:48:39 +03:00
|
|
|
ordering = ["name"]
|
2025-05-18 21:29:04 +03:00
|
|
|
|
|
|
|
|
class Event(models.Model):
|
|
|
|
|
academic_year = models.ForeignKey(
|
|
|
|
|
AcademicYear, on_delete=models.CASCADE, verbose_name="Учебный год"
|
|
|
|
|
)
|
|
|
|
|
status = models.ForeignKey(
|
|
|
|
|
EventStatus, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Статус мероприятия"
|
|
|
|
|
)
|
|
|
|
|
name = models.CharField(max_length=200, verbose_name="Название")
|
|
|
|
|
location = models.CharField(max_length=255, blank=True, null=True, verbose_name="Место проведения")
|
|
|
|
|
date = models.DateField(verbose_name="Дата проведения")
|
|
|
|
|
description = models.TextField(blank=True, null=True, verbose_name="Описание")
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return f"{self.name} ({self.date})"
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
verbose_name = "Мероприятие"
|
|
|
|
|
verbose_name_plural = "Мероприятия"
|
2025-05-18 22:48:39 +03:00
|
|
|
ordering = ["date", "name"]
|
2025-05-18 21:29:04 +03:00
|
|
|
|
|
|
|
|
class EventOrganizer(models.Model):
|
|
|
|
|
employee = models.ForeignKey(
|
|
|
|
|
Employee, on_delete=models.CASCADE, verbose_name="Сотрудник-организатор"
|
|
|
|
|
)
|
|
|
|
|
event = models.ForeignKey(
|
|
|
|
|
Event, on_delete=models.CASCADE, verbose_name="Мероприятие"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return f"{self.employee} - {self.event}"
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
verbose_name = "Организатор мероприятия"
|
|
|
|
|
verbose_name_plural = "Организаторы мероприятий"
|
|
|
|
|
unique_together = ("employee", "event")
|
2025-05-18 22:48:39 +03:00
|
|
|
ordering = ["employee", "event"]
|
2025-05-18 21:29:04 +03:00
|
|
|
|
|
|
|
|
class EventDetail(models.Model):
|
|
|
|
|
activity_type = models.ForeignKey(
|
|
|
|
|
ActivityType, on_delete=models.CASCADE, verbose_name="Вид деятельности"
|
|
|
|
|
)
|
|
|
|
|
event = models.ForeignKey(
|
|
|
|
|
Event, on_delete=models.CASCADE, verbose_name="Мероприятие"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return f"{self.activity_type} - {self.event}"
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
verbose_name = "Деталь мероприятия"
|
|
|
|
|
verbose_name_plural = "Детали мероприятий"
|
|
|
|
|
unique_together = ("activity_type", "event")
|
2025-05-18 22:48:39 +03:00
|
|
|
ordering = ["activity_type", "event"]
|
2025-05-18 21:29:04 +03:00
|
|
|
|
|
|
|
|
class EventParticipant(models.Model):
|
|
|
|
|
student = models.ForeignKey(
|
|
|
|
|
Student, on_delete=models.CASCADE, verbose_name="Студент"
|
|
|
|
|
)
|
|
|
|
|
event = models.ForeignKey(
|
|
|
|
|
Event, on_delete=models.CASCADE, verbose_name="Мероприятие"
|
|
|
|
|
)
|
|
|
|
|
points = models.PositiveIntegerField(blank=True, default=0, verbose_name="Баллы за участие")
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return f"{self.student} - {self.event}"
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
verbose_name = "Участник мероприятия"
|
|
|
|
|
verbose_name_plural = "Участники мероприятий"
|
2025-05-18 22:48:39 +03:00
|
|
|
ordering = ["event", "student"]
|
2025-05-18 21:29:04 +03:00
|
|
|
|
|
|
|
|
class MethodicalFile(models.Model):
|
|
|
|
|
specialty = models.ForeignKey(
|
|
|
|
|
Specialty, on_delete=models.CASCADE, verbose_name="Специальность"
|
|
|
|
|
)
|
|
|
|
|
name = models.CharField(max_length=200, verbose_name="Название")
|
|
|
|
|
file_path = models.FileField(max_length=500, verbose_name="Файл")
|
|
|
|
|
upload_date = models.DateField(auto_now_add=True, verbose_name="Дата добавления")
|
|
|
|
|
employee = models.ForeignKey(
|
|
|
|
|
Employee, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Сотрудник"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return f"{self.name} ({self.specialty})"
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
verbose_name = "Методический файл"
|
|
|
|
|
verbose_name_plural = "Методические файлы"
|
2025-05-18 22:48:39 +03:00
|
|
|
ordering = ["specialty", "name", "upload_date", "employee"]
|
2025-05-18 21:29:04 +03:00
|
|
|
|
|
|
|
|
class RelevantMethodicalFile(models.Model):
|
|
|
|
|
methodical_file = models.ForeignKey(
|
|
|
|
|
MethodicalFile, on_delete=models.CASCADE, verbose_name="Методический файл"
|
|
|
|
|
)
|
|
|
|
|
activity_type = models.ForeignKey(
|
|
|
|
|
ActivityType, on_delete=models.CASCADE, verbose_name="Вид деятельности"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return f"{self.methodical_file} - {self.activity_type}"
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
verbose_name = "Релевантный методический файл"
|
|
|
|
|
verbose_name_plural = "Релевантные методические файлы"
|
|
|
|
|
|
2025-05-18 22:48:39 +03:00
|
|
|
ordering = ["methodical_file", "activity_type"]
|