From c0865fdf517028fd8747dc5ba8064d89af5c9497 Mon Sep 17 00:00:00 2001 From: Mikan <72257910+Mikan-DS@users.noreply.github.com> Date: Sun, 18 May 2025 22:16:31 +0300 Subject: [PATCH] education + employees --- core/models.py | 2 +- education/admin.py | 57 ++++++++++++++++++- education/apps.py | 1 + ...mail_remove_student_first_name_and_more.py | 33 +++++++++++ education/models.py | 38 ++++++++++++- employees/admin.py | 34 ++++++++++- employees/apps.py | 2 + ...ail_remove_employee_first_name_and_more.py | 33 +++++++++++ employees/models.py | 47 ++++++++++++++- 9 files changed, 241 insertions(+), 6 deletions(-) create mode 100644 education/migrations/0003_remove_student_email_remove_student_first_name_and_more.py create mode 100644 employees/migrations/0003_remove_employee_email_remove_employee_first_name_and_more.py diff --git a/core/models.py b/core/models.py index bf5641e..987b060 100644 --- a/core/models.py +++ b/core/models.py @@ -8,7 +8,7 @@ class ContactMixin(models.Model): email = models.EmailField(blank=True, null=True, verbose_name="Почта") def __str__(self): - return f"{self.last_name} {self.first_name}" + return " ".join(filter(bool, [self.last_name, self.first_name])) class Meta: abstract = True diff --git a/education/admin.py b/education/admin.py index 8c38f3f..57d62e8 100644 --- a/education/admin.py +++ b/education/admin.py @@ -1,3 +1,58 @@ 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') + }), + ) \ No newline at end of file diff --git a/education/apps.py b/education/apps.py index 4a92e70..4fab4c8 100644 --- a/education/apps.py +++ b/education/apps.py @@ -4,3 +4,4 @@ from django.apps import AppConfig class EducationConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'education' + verbose_name = "Учебный процесс" diff --git a/education/migrations/0003_remove_student_email_remove_student_first_name_and_more.py b/education/migrations/0003_remove_student_email_remove_student_first_name_and_more.py new file mode 100644 index 0000000..1afd5c2 --- /dev/null +++ b/education/migrations/0003_remove_student_email_remove_student_first_name_and_more.py @@ -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', + ), + ] diff --git a/education/models.py b/education/models.py index b045768..81b6dd0 100644 --- a/education/models.py +++ b/education/models.py @@ -76,7 +76,7 @@ class Group(models.Model): verbose_name_plural = "Группы" -class Student(ContactMixin): +class Student(models.Model): group = models.ForeignKey( Group, on_delete=models.CASCADE, verbose_name="Группа" ) @@ -84,6 +84,42 @@ class Student(ContactMixin): 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): return f"{self.last_name} {self.first_name} - {self.group}" diff --git a/employees/admin.py b/employees/admin.py index 8c38f3f..b21e73f 100644 --- a/employees/admin.py +++ b/employees/admin.py @@ -1,3 +1,35 @@ 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) \ No newline at end of file diff --git a/employees/apps.py b/employees/apps.py index 52b700d..355dbdc 100644 --- a/employees/apps.py +++ b/employees/apps.py @@ -4,3 +4,5 @@ from django.apps import AppConfig class EmployeesConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'employees' + verbose_name = "Структура колледжа" + diff --git a/employees/migrations/0003_remove_employee_email_remove_employee_first_name_and_more.py b/employees/migrations/0003_remove_employee_email_remove_employee_first_name_and_more.py new file mode 100644 index 0000000..53f169d --- /dev/null +++ b/employees/migrations/0003_remove_employee_email_remove_employee_first_name_and_more.py @@ -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', + ), + ] diff --git a/employees/models.py b/employees/models.py index 042230d..c32e41e 100644 --- a/employees/models.py +++ b/employees/models.py @@ -25,7 +25,7 @@ class Department(models.Model): verbose_name_plural = "Подразделения" -class Employee(ContactMixin): +class Employee(models.Model): department = models.ForeignKey( Department, on_delete=models.CASCADE, verbose_name="Подразделение" ) @@ -36,8 +36,51 @@ class Employee(ContactMixin): "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): - 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: verbose_name = "Сотрудник"