models
This commit is contained in:
0
education/__init__.py
Normal file
0
education/__init__.py
Normal file
3
education/admin.py
Normal file
3
education/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
education/apps.py
Normal file
6
education/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class EducationConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'education'
|
||||
84
education/migrations/0001_initial.py
Normal file
84
education/migrations/0001_initial.py
Normal 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': 'Студенты',
|
||||
},
|
||||
),
|
||||
]
|
||||
58
education/migrations/0002_initial.py
Normal file
58
education/migrations/0002_initial.py
Normal 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')},
|
||||
),
|
||||
]
|
||||
0
education/migrations/__init__.py
Normal file
0
education/migrations/__init__.py
Normal file
93
education/models.py
Normal file
93
education/models.py
Normal 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
3
education/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
3
education/views.py
Normal file
3
education/views.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
Reference in New Issue
Block a user