This commit is contained in:
Mikan
2025-05-18 21:29:04 +03:00
parent 63228923a7
commit d70c5f73f5
50 changed files with 1344 additions and 52 deletions

0
education/__init__.py Normal file
View File

3
education/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
education/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class EducationConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'education'

View File

@@ -0,0 +1,84 @@
# Generated by Django 4.2.21 on 2025-05-18 18:14
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='AcademicYear',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('year', models.CharField(max_length=9, verbose_name='Год')),
],
options={
'verbose_name': 'Учебный год',
'verbose_name_plural': 'Учебные годы',
},
),
migrations.CreateModel(
name='Department',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100, verbose_name='Название отделения')),
],
options={
'verbose_name': 'Учебное отделение',
'verbose_name_plural': 'Учебные отделения',
},
),
migrations.CreateModel(
name='DepartmentHead',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
],
options={
'verbose_name': 'Руководитель отделения',
'verbose_name_plural': 'Руководители отделений',
},
),
migrations.CreateModel(
name='Group',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=20, verbose_name='Название группы')),
],
options={
'verbose_name': 'Группа',
'verbose_name_plural': 'Группы',
},
),
migrations.CreateModel(
name='Specialty',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200, verbose_name='Название специальности')),
('code', models.CharField(max_length=20, verbose_name='Код специальности')),
],
options={
'verbose_name': 'Специальность',
'verbose_name_plural': 'Специальности',
},
),
migrations.CreateModel(
name='Student',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=100, verbose_name='Имя')),
('last_name', models.CharField(blank=True, max_length=100, null=True, verbose_name='Фамилия')),
('middle_name', models.CharField(blank=True, max_length=100, null=True, verbose_name='Отчество')),
('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='Телефон')),
('email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='Почта')),
],
options={
'verbose_name': 'Студент',
'verbose_name_plural': 'Студенты',
},
),
]

View File

@@ -0,0 +1,58 @@
# Generated by Django 4.2.21 on 2025-05-18 18:14
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('employees', '0001_initial'),
('education', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='student',
name='account',
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Аккаунт'),
),
migrations.AddField(
model_name='student',
name='group',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='education.group', verbose_name='Группа'),
),
migrations.AddField(
model_name='specialty',
name='department',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='education.department', verbose_name='Учебное отделение'),
),
migrations.AddField(
model_name='group',
name='curator',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='employees.employee', verbose_name='Куратор'),
),
migrations.AddField(
model_name='group',
name='specialty',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='education.specialty', verbose_name='Специальность'),
),
migrations.AddField(
model_name='departmenthead',
name='department',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='education.department', verbose_name='Учебное отделение'),
),
migrations.AddField(
model_name='departmenthead',
name='head',
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='employees.employee', verbose_name='Руководитель'),
),
migrations.AlterUniqueTogether(
name='departmenthead',
unique_together={('department', 'head')},
),
]

View File

93
education/models.py Normal file
View File

@@ -0,0 +1,93 @@
from django.db import models
from core.models import ContactMixin # Предполагается, что ContactMixin находится в приложении core
from employees.models import Employee # Предполагается, что модель Employee находится в приложении employees
from users.models import Account # Предполагается, что модель Account находится в приложении users
## Учебный процесс (название приложения: education)
class AcademicYear(models.Model):
year = models.CharField(max_length=9, verbose_name="Год") # Например, "2023-2024"
def __str__(self):
return self.year
class Meta:
verbose_name = "Учебный год"
verbose_name_plural = "Учебные годы"
class Department(models.Model):
name = models.CharField(max_length=100, verbose_name="Название отделения")
def __str__(self):
return self.name
class Meta:
verbose_name = "Учебное отделение"
verbose_name_plural = "Учебные отделения"
class DepartmentHead(models.Model):
department = models.ForeignKey(
Department, on_delete=models.CASCADE, verbose_name="Учебное отделение"
)
head = models.OneToOneField(
Employee, on_delete=models.CASCADE, verbose_name="Руководитель"
)
def __str__(self):
return f"{self.head} - {self.department}"
class Meta:
verbose_name = "Руководитель отделения"
verbose_name_plural = "Руководители отделений"
unique_together = ("department", "head")
class Specialty(models.Model):
name = models.CharField(max_length=200, verbose_name="Название специальности")
code = models.CharField(max_length=20, verbose_name="Код специальности")
department = models.ForeignKey(
Department, on_delete=models.CASCADE, verbose_name="Учебное отделение"
)
def __str__(self):
return f"{self.code} - {self.name}"
class Meta:
verbose_name = "Специальность"
verbose_name_plural = "Специальности"
class Group(models.Model):
name = models.CharField(max_length=20, verbose_name="Название группы")
curator = models.ForeignKey(
Employee, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Куратор"
)
specialty = models.ForeignKey(
Specialty, on_delete=models.CASCADE, verbose_name="Специальность"
)
def __str__(self):
return self.name
class Meta:
verbose_name = "Группа"
verbose_name_plural = "Группы"
class Student(ContactMixin):
group = models.ForeignKey(
Group, on_delete=models.CASCADE, verbose_name="Группа"
)
account = models.OneToOneField(
Account, on_delete=models.CASCADE, unique=True, verbose_name="Аккаунт"
)
def __str__(self):
return f"{self.last_name} {self.first_name} - {self.group}"
class Meta:
verbose_name = "Студент"
verbose_name_plural = "Студенты"

3
education/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

3
education/views.py Normal file
View File

@@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.