Сайт для управления образовательной организацией на Django

описание
Сайт позволяет выстроить связь между преподавателями, учениками и управляющей организацией.

Свойства система:
1) Регистрация пользователей и распределения ролей.
2) Отслеживать метрики для различных ролей
3) Просматривать списки участников
Проект на github
Перейти на репозиторий проекта (проект находится в разработке)
Описание модели данных
Проект имеет приложения:

management_project - главное приложение
core - общие модели
adminHODs - администрация университета
courses - модели для работы с курсами
students - студенты университета
subjects - преподаватели университета
models
urls
views
forms
Модели данных
core/models.py
'''Общие модели'''


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
adminHODs/models.py
'''Администрация'''


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()
courses/models.py
'''Курсы'''

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='Сессия')
students/models.py
'''Студенты'''


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='Оценка за предмет')
subjects/models.py
'''Преподаватели'''

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='Сообщение')