education + employees
This commit is contained in:
@@ -8,7 +8,7 @@ class ContactMixin(models.Model):
|
|||||||
email = models.EmailField(blank=True, null=True, verbose_name="Почта")
|
email = models.EmailField(blank=True, null=True, verbose_name="Почта")
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.last_name} {self.first_name}"
|
return " ".join(filter(bool, [self.last_name, self.first_name]))
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
abstract = True
|
abstract = True
|
||||||
|
|||||||
@@ -1,3 +1,58 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
from .models import AcademicYear, Department, DepartmentHead, Specialty, Group, Student
|
||||||
|
|
||||||
# Register your models here.
|
|
||||||
|
@admin.register(AcademicYear)
|
||||||
|
class AcademicYearAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('year',)
|
||||||
|
search_fields = ('year',)
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Department)
|
||||||
|
class DepartmentAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('name',)
|
||||||
|
search_fields = ('name',)
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(DepartmentHead)
|
||||||
|
class DepartmentHeadAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('department', 'head')
|
||||||
|
list_filter = ('department',)
|
||||||
|
autocomplete_fields = ('department', 'head')
|
||||||
|
search_fields = ('department__name', 'head__first_name', 'head__last_name')
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Specialty)
|
||||||
|
class SpecialtyAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('code', 'name', 'department')
|
||||||
|
list_filter = ('department',)
|
||||||
|
search_fields = ('code', 'name', 'department__name')
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Group)
|
||||||
|
class GroupAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('name', 'specialty', 'curator')
|
||||||
|
list_filter = ('specialty__department', 'specialty')
|
||||||
|
search_fields = ('name', 'specialty__name', 'curator__first_name', 'curator__last_name')
|
||||||
|
autocomplete_fields = ('specialty', 'curator')
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Student)
|
||||||
|
class StudentAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('full_name', 'group', 'account')
|
||||||
|
list_filter = ('group__specialty__department', 'group__specialty', 'group')
|
||||||
|
search_fields = (
|
||||||
|
'first_name', 'last_name', 'middle_name',
|
||||||
|
'group__name', 'account__login'
|
||||||
|
)
|
||||||
|
autocomplete_fields = ('group', 'account')
|
||||||
|
|
||||||
|
@admin.display(description='ФИО')
|
||||||
|
def full_name(self, obj):
|
||||||
|
return str(obj)
|
||||||
|
|
||||||
|
fieldsets = (
|
||||||
|
('Основная информация', {
|
||||||
|
'fields': ('account', 'group')
|
||||||
|
}),
|
||||||
|
)
|
||||||
@@ -4,3 +4,4 @@ from django.apps import AppConfig
|
|||||||
class EducationConfig(AppConfig):
|
class EducationConfig(AppConfig):
|
||||||
default_auto_field = 'django.db.models.BigAutoField'
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
name = 'education'
|
name = 'education'
|
||||||
|
verbose_name = "Учебный процесс"
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# Generated by Django 4.2.21 on 2025-05-18 18:56
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('education', '0002_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='student',
|
||||||
|
name='email',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='student',
|
||||||
|
name='first_name',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='student',
|
||||||
|
name='last_name',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='student',
|
||||||
|
name='middle_name',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='student',
|
||||||
|
name='phone',
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -76,7 +76,7 @@ class Group(models.Model):
|
|||||||
verbose_name_plural = "Группы"
|
verbose_name_plural = "Группы"
|
||||||
|
|
||||||
|
|
||||||
class Student(ContactMixin):
|
class Student(models.Model):
|
||||||
group = models.ForeignKey(
|
group = models.ForeignKey(
|
||||||
Group, on_delete=models.CASCADE, verbose_name="Группа"
|
Group, on_delete=models.CASCADE, verbose_name="Группа"
|
||||||
)
|
)
|
||||||
@@ -84,6 +84,42 @@ class Student(ContactMixin):
|
|||||||
Account, on_delete=models.CASCADE, unique=True, verbose_name="Аккаунт"
|
Account, on_delete=models.CASCADE, unique=True, verbose_name="Аккаунт"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def first_name(self):
|
||||||
|
return self.account.first_name
|
||||||
|
@first_name.setter
|
||||||
|
def first_name(self, value):
|
||||||
|
self.account.first_name = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def last_name(self):
|
||||||
|
return self.account.last_name
|
||||||
|
@last_name.setter
|
||||||
|
def last_name(self, value):
|
||||||
|
self.account.last_name = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def middle_name(self):
|
||||||
|
return self.account.middle_name
|
||||||
|
@middle_name.setter
|
||||||
|
def middle_name(self, value):
|
||||||
|
self.account.middle_name = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def phone(self):
|
||||||
|
return self.account.phone
|
||||||
|
@phone.setter
|
||||||
|
def phone(self, value):
|
||||||
|
self.account.phone = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def email(self):
|
||||||
|
return self.account.email
|
||||||
|
@email.setter
|
||||||
|
def email(self, value):
|
||||||
|
self.account.email = value
|
||||||
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.last_name} {self.first_name} - {self.group}"
|
return f"{self.last_name} {self.first_name} - {self.group}"
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,35 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
from .models import Position, Department, Employee
|
||||||
|
|
||||||
# Register your models here.
|
|
||||||
|
@admin.register(Position)
|
||||||
|
class PositionAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('name',)
|
||||||
|
search_fields = ('name',)
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Department)
|
||||||
|
class DepartmentAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('name',)
|
||||||
|
search_fields = ('name',)
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Employee)
|
||||||
|
class EmployeeAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('full_name', 'position', 'department', 'account')
|
||||||
|
list_filter = ('department', 'position')
|
||||||
|
search_fields = (
|
||||||
|
'first_name', 'last_name', 'middle_name',
|
||||||
|
'phone', 'email', 'position__name', 'department__name'
|
||||||
|
)
|
||||||
|
autocomplete_fields = ('department', 'position', 'account')
|
||||||
|
|
||||||
|
fieldsets = (
|
||||||
|
('Основная информация', {
|
||||||
|
'fields': ('account', 'department', 'position')
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
@admin.display(description='ФИО')
|
||||||
|
def full_name(self, obj):
|
||||||
|
return str(obj)
|
||||||
@@ -4,3 +4,5 @@ from django.apps import AppConfig
|
|||||||
class EmployeesConfig(AppConfig):
|
class EmployeesConfig(AppConfig):
|
||||||
default_auto_field = 'django.db.models.BigAutoField'
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
name = 'employees'
|
name = 'employees'
|
||||||
|
verbose_name = "Структура колледжа"
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# Generated by Django 4.2.21 on 2025-05-18 18:56
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('employees', '0002_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='employee',
|
||||||
|
name='email',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='employee',
|
||||||
|
name='first_name',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='employee',
|
||||||
|
name='last_name',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='employee',
|
||||||
|
name='middle_name',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='employee',
|
||||||
|
name='phone',
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -25,7 +25,7 @@ class Department(models.Model):
|
|||||||
verbose_name_plural = "Подразделения"
|
verbose_name_plural = "Подразделения"
|
||||||
|
|
||||||
|
|
||||||
class Employee(ContactMixin):
|
class Employee(models.Model):
|
||||||
department = models.ForeignKey(
|
department = models.ForeignKey(
|
||||||
Department, on_delete=models.CASCADE, verbose_name="Подразделение"
|
Department, on_delete=models.CASCADE, verbose_name="Подразделение"
|
||||||
)
|
)
|
||||||
@@ -36,8 +36,51 @@ class Employee(ContactMixin):
|
|||||||
"users.Account", on_delete=models.CASCADE, unique=True, verbose_name="Аккаунт"
|
"users.Account", on_delete=models.CASCADE, unique=True, verbose_name="Аккаунт"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def first_name(self):
|
||||||
|
return self.account.first_name
|
||||||
|
|
||||||
|
@first_name.setter
|
||||||
|
def first_name(self, value):
|
||||||
|
self.account.first_name = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def last_name(self):
|
||||||
|
return self.account.last_name
|
||||||
|
|
||||||
|
@last_name.setter
|
||||||
|
def last_name(self, value):
|
||||||
|
self.account.last_name = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def middle_name(self):
|
||||||
|
return self.account.middle_name
|
||||||
|
|
||||||
|
@middle_name.setter
|
||||||
|
def middle_name(self, value):
|
||||||
|
self.account.middle_name = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def phone(self):
|
||||||
|
return self.account.phone
|
||||||
|
|
||||||
|
@phone.setter
|
||||||
|
def phone(self, value):
|
||||||
|
self.account.phone = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def email(self):
|
||||||
|
return self.account.email
|
||||||
|
|
||||||
|
@email.setter
|
||||||
|
def email(self, value):
|
||||||
|
self.account.email = value
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.last_name} {self.first_name} - {self.position}"
|
|
||||||
|
full_name = " ".join(filter(bool, [self.last_name, self.first_name]))
|
||||||
|
|
||||||
|
return f"{full_name} - {self.position}"
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Сотрудник"
|
verbose_name = "Сотрудник"
|
||||||
|
|||||||
Reference in New Issue
Block a user