'''Общие модели'''
from django.contrib.auth.models import AbstractUser
from django.db import models
class CreatedModel(models.Model):
'''Шаблон для классов с повторяющимися полями'''
id = models.AutoField(primary_key=True)
created_at = models.DateTimeField(auto_now_add=True,
verbose_name='дата создания',
help_text='дата создания')
updated_at = models.DateTimeField(auto_now=True,
verbose_name='дата последней сессии',
help_text='дата последней сессии')
class Meta:
abstract = True
class SessionYearModel(models.Model):
'''Модель описывает сессию'''
id = models.AutoField(primary_key=True)
session_start_year = models.DateField(verbose_name='год начала сессии',
help_text='год начала сессии')
session_end_year = models.DateField(verbose_name='год последней сессии',
help_text='год последней сессии')
class CustomUser(AbstractUser):
'''Переопределение базового класса пользователя, добавления поля группы '''
HOD = '1'
STAFF = '2'
STUDENT = '3'
EMAIL_TO_USER_TYPE_MAP = {'hod': HOD,
'staff': STAFF,
'student': STUDENT}
user_type_data = ((HOD, "HOD"), (STAFF, "Staff"), (STUDENT, "Student"))
user_type = models.CharField(default=1,
choices=user_type_data,
max_length=10)
class LeaveReport(CreatedModel):
'''Шаблон для классов отчета'''
leave_date = models.CharField(max_length=255,
verbose_name='Дата отчета',
help_text='Дата отчета')
leave_message = models.TextField(verbose_name='Сообщение',
help_text='Сообщение')
leave_status = models.IntegerField(default=0,
verbose_name='Статус',
help_text='Статус')
class Meta:
abstract = True
class FeedBack(CreatedModel):
'''Шаблон для классов отзыв'''
feedback = models.TextField(verbose_name='Обратная связь',
help_text='Обратная связь')
feedback_reply = models.TextField(verbose_name='Ответ',
help_text='Ответ')
class Meta:
abstract = True
'''Администрация'''
from core.models import CreatedModel, CustomUser, SessionYearModel
from courses.models import Courses
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from students.models import Students
from subjects.models import Staffs
class AdminHOD(CreatedModel):
'''Модель описывает пользователя администрации'''
admin = models.OneToOneField(CustomUser,
on_delete=models.CASCADE,
verbose_name='Пользователь',
help_text='Пользователь')
class Meta:
verbose_name = 'Пользователь администрации'
verbose_name_plural = 'Параметры пользователя администрации'
ordering = ('-id',)
def __str__(self):
return self.admin
@receiver(post_save, sender=CustomUser)
def create_user_profile(sender, instance, created, **kwargs):
'''Функция автоматически вставляет данные в базу'''
if created:
if instance.user_type == 1:
AdminHOD.objects.create(admin=instance)
if instance.user_type == 2:
Staffs.objects.create(admin=instance)
if instance.user_type == 3:
Students.objects.create(
admin=instance,
course_id=Courses.objects.get(id=1),
session_year_id=SessionYearModel.objects.get(id=1),
address="", profile_pic="", gender="")
@receiver(post_save, sender=CustomUser)
def save_user_profile(sender, instance, **kwargs):
'''Функция обрабатывает профиль'''
if instance.user_type == 1:
instance.adminhod.save()
if instance.user_type == 2:
instance.staffs.save()
if instance.user_type == 3:
instance.students.save()
'''Курсы'''
from core.models import CreatedModel, CustomUser, SessionYearModel
from django.db import models
class Courses(CreatedModel):
'''Модель описывает курс'''
course_name = models.CharField(max_length=255,
verbose_name='Название курса',
help_text='Название курса')
class Subjects(CreatedModel):
'''Модель описывает предмет (часть курса)'''
subject_name = models.CharField(max_length=255,
verbose_name='Название предмета',
help_text='Название предмета')
course_id = models.ForeignKey(Courses,
on_delete=models.CASCADE,
default=1,
verbose_name='Название курса',
help_text='Название курса')
staff_id = models.ForeignKey(CustomUser,
on_delete=models.CASCADE,
verbose_name='Преподаватель предмета',
help_text='Преподаватель предмета')
class Attendance(CreatedModel):
'''Посещаемость предмета'''
subject_id = models.ForeignKey(Subjects,
on_delete=models.DO_NOTHING,
verbose_name='Предмет',
help_text='Предмет')
attendance_date = models.DateField(verbose_name='дата лекции',
help_text='дата лекции')
session_year_id = models.ForeignKey(SessionYearModel,
on_delete=models.CASCADE,
verbose_name='Сессия',
help_text='Сессия')
'''Студенты'''
from core.models import (CreatedModel, CustomUser, FeedBack, LeaveReport,
SessionYearModel)
from courses.models import Attendance, Courses, Subjects
from django.db import models
class Students(CreatedModel):
'''Модель описывает студента'''
gender_mw = (('men', 'муж'), ('women', 'жен'))
admin = models.OneToOneField(CustomUser,
on_delete=models.CASCADE,
verbose_name='ФИО Студента',
help_text='ФИО Студента')
gender = models.CharField(max_length=10,
choices=gender_mw,
verbose_name='Пол',
help_text='Пол')
profile_pic = models.FileField(verbose_name='Фото студента',
help_text='Фото студента')
address = models.TextField(verbose_name='Адрес',
help_text='Адрес')
course_id = models.ForeignKey(Courses,
on_delete=models.DO_NOTHING,
default=1,
verbose_name='Название курса',
help_text='Название курса')
session_year_id = models.ForeignKey(SessionYearModel,
null=True,
on_delete=models.CASCADE,
verbose_name='Сессия',
help_text='Сессия')
class AttendanceReport(CreatedModel):
'''Посещаемость студента'''
student_id = models.ForeignKey(Students,
on_delete=models.DO_NOTHING,
verbose_name='Студент',
help_text='Студент')
attendance_id = models.ForeignKey(Attendance,
on_delete=models.CASCADE,
verbose_name='Предмет',
help_text='Предмет')
status = models.BooleanField(default=False,
verbose_name='Статус',
help_text='Статус')
class LeaveReportStudent(LeaveReport):
'''Модель отчета студента'''
student_id = models.ForeignKey(Students,
on_delete=models.CASCADE,
verbose_name='Студент',
help_text='Студент')
class FeedBackStudent(FeedBack):
'''Обратная связь студента'''
student_id = models.ForeignKey(Students,
on_delete=models.CASCADE,
verbose_name='Студент',
help_text='Студент')
class NotificationStudent(CreatedModel):
'''Модель уведомление студента'''
student_id = models.ForeignKey(Students,
on_delete=models.CASCADE,
verbose_name='Студент',
help_text='Студент')
message = models.TextField(verbose_name='Сообщение',
help_text='Сообщение')
class StudentResult(CreatedModel):
'''Модель экзамена студента'''
student_id = models.ForeignKey(Students,
on_delete=models.CASCADE,
verbose_name='Студент',
help_text='Студент')
subject_id = models.ForeignKey(Subjects,
on_delete=models.CASCADE,
default=1,
verbose_name='Предмет',
help_text='Предмет')
subject_exam_marks = models.FloatField(
default=0,
verbose_name='Оценка за экзамен',
help_text='Оценка за экзамен')
subject_assignment_marks = models.FloatField(
default=0,
verbose_name='Оценка за предмет',
help_text='Оценка за предмет')
'''Преподаватели'''
from core.models import CreatedModel, CustomUser, FeedBack, LeaveReport
from django.db import models
class Staffs(CreatedModel):
'''Модель описывает преподавателей'''
admin = models.OneToOneField(CustomUser,
on_delete=models.CASCADE,
verbose_name='Преподаватель',
help_text='Преподаватель')
address = models.TextField(verbose_name='Адрес',
help_text='Адрес')
class LeaveReportStaff(LeaveReport):
'''модель отчета преподавателей'''
staff_id = models.ForeignKey(Staffs, on_delete=models.CASCADE)
class FeedBackStaffs(FeedBack):
'''Обратная связь преподавателя'''
staff_id = models.ForeignKey(Staffs,
on_delete=models.CASCADE,
verbose_name='преподаватель',
help_text='Преподаватель')
class NotificationStaffs(CreatedModel):
'''Модель уведомление преподавателя'''
stafff_id = models.ForeignKey(Staffs,
on_delete=models.CASCADE,
verbose_name='преподаватель',
help_text='Преподаватель')
message = models.TextField(verbose_name='Сообщение',
help_text='Сообщение')