diff --git a/education/admin.py b/education/admin.py index 57d62e8..8e73f92 100644 --- a/education/admin.py +++ b/education/admin.py @@ -19,7 +19,7 @@ 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') + search_fields = ('department__name', 'head__account__first_name', 'head__account__last_name') @admin.register(Specialty) @@ -33,7 +33,7 @@ class SpecialtyAdmin(admin.ModelAdmin): 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') + search_fields = ('name', 'specialty__name', 'curator__account__first_name', 'curator__account__last_name') autocomplete_fields = ('specialty', 'curator') @@ -42,7 +42,7 @@ 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', + 'account__first_name', 'account__last_name', 'account__middle_name', 'group__name', 'account__login' ) autocomplete_fields = ('group', 'account') diff --git a/education/models.py b/education/models.py index 81b6dd0..5233ef4 100644 --- a/education/models.py +++ b/education/models.py @@ -14,6 +14,7 @@ class AcademicYear(models.Model): class Meta: verbose_name = "Учебный год" verbose_name_plural = "Учебные годы" + ordering = ['-year'] class Department(models.Model): @@ -25,6 +26,7 @@ class Department(models.Model): class Meta: verbose_name = "Учебное отделение" verbose_name_plural = "Учебные отделения" + ordering = ["name"] class DepartmentHead(models.Model): @@ -42,6 +44,7 @@ class DepartmentHead(models.Model): verbose_name = "Руководитель отделения" verbose_name_plural = "Руководители отделений" unique_together = ("department", "head") + ordering = ["department", "head"] class Specialty(models.Model): @@ -57,6 +60,7 @@ class Specialty(models.Model): class Meta: verbose_name = "Специальность" verbose_name_plural = "Специальности" + ordering = ["code"] class Group(models.Model): @@ -72,8 +76,9 @@ class Group(models.Model): return self.name class Meta: - verbose_name = "Группа" - verbose_name_plural = "Группы" + verbose_name = "Студенческая группа" + verbose_name_plural = "Студенческие группы" + ordering = ["name", "specialty"] class Student(models.Model): @@ -126,4 +131,5 @@ class Student(models.Model): class Meta: verbose_name = "Студент" verbose_name_plural = "Студенты" + ordering = ["group", "account"] diff --git a/employees/admin.py b/employees/admin.py index b21e73f..624e5e0 100644 --- a/employees/admin.py +++ b/employees/admin.py @@ -19,8 +19,8 @@ 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' + 'account__first_name', 'account__last_name', 'account__middle_name', + 'account__phone', 'account__email', 'position__name', 'department__name' ) autocomplete_fields = ('department', 'position', 'account') diff --git a/employees/models.py b/employees/models.py index c32e41e..5bcade8 100644 --- a/employees/models.py +++ b/employees/models.py @@ -12,6 +12,7 @@ class Position(models.Model): class Meta: verbose_name = "Должность" verbose_name_plural = "Должности" + ordering = ["name"] class Department(models.Model): @@ -23,7 +24,7 @@ class Department(models.Model): class Meta: verbose_name = "Подразделение" verbose_name_plural = "Подразделения" - + ordering = ["name"] class Employee(models.Model): department = models.ForeignKey( @@ -85,4 +86,4 @@ class Employee(models.Model): class Meta: verbose_name = "Сотрудник" verbose_name_plural = "Сотрудники" - + ordering = ["department", "position", "account"] diff --git a/events/admin.py b/events/admin.py index 8c38f3f..0d34ebe 100644 --- a/events/admin.py +++ b/events/admin.py @@ -1,3 +1,117 @@ from django.contrib import admin +from .models import ( + EventStatus, ActivityType, Event, EventOrganizer, + EventDetail, EventParticipant, MethodicalFile, RelevantMethodicalFile +) -# Register your models here. + +@admin.register(EventStatus) +class EventStatusAdmin(admin.ModelAdmin): + list_display = ('name',) + search_fields = ('name',) + + +@admin.register(ActivityType) +class ActivityTypeAdmin(admin.ModelAdmin): + list_display = ('name',) + search_fields = ('name',) + + +class EventOrganizerInline(admin.TabularInline): + model = EventOrganizer + extra = 1 + autocomplete_fields = ('employee',) + + +class EventDetailInline(admin.TabularInline): + model = EventDetail + extra = 1 + autocomplete_fields = ('activity_type',) + + +class EventParticipantInline(admin.TabularInline): + model = EventParticipant + extra = 1 + autocomplete_fields = ('student',) + + +@admin.register(Event) +class EventAdmin(admin.ModelAdmin): + list_display = ('name', 'date', 'location', 'status', 'academic_year') + list_filter = ('status', 'academic_year', 'date') + search_fields = ('name', 'location') + inlines = [EventOrganizerInline, EventDetailInline, EventParticipantInline] + autocomplete_fields = ('academic_year', 'status') + + fieldsets = ( + ('Основная информация', { + 'fields': ('name', 'academic_year', 'status', 'date', 'location') + }), + ('Дополнительно', { + 'fields': ('description',) + }), + ) + + +@admin.register(EventOrganizer) +class EventOrganizerAdmin(admin.ModelAdmin): + list_display = ('event', 'employee') + list_filter = ('event__academic_year',) + search_fields = ('employee__account__first_name', 'employee__account__last_name', 'event__name') + autocomplete_fields = ('employee', 'event') + + +@admin.register(EventDetail) +class EventDetailAdmin(admin.ModelAdmin): + list_display = ('event', 'activity_type') + list_filter = ('activity_type',) + search_fields = ('event__name', 'activity_type__name') + autocomplete_fields = ('event', 'activity_type') + + +@admin.register(EventParticipant) +class EventParticipantAdmin(admin.ModelAdmin): + list_display = ('student_full_name', 'event', 'points') + list_filter = ('event__academic_year', 'event') + search_fields = ( + 'student__account__first_name', 'student__account__last_name', + 'event__name' + ) + autocomplete_fields = ('student', 'event') + + @admin.display(description='ФИО студента') + def student_full_name(self, obj): + return str(obj.student) + + + +class RelevantMethodicalFileInline(admin.TabularInline): + model = RelevantMethodicalFile + extra = 1 + autocomplete_fields = ('activity_type',) + +@admin.register(MethodicalFile) +class MethodicalFileAdmin(admin.ModelAdmin): + list_display = ('name', 'specialty', 'upload_date', 'employee') + list_filter = ('specialty', 'upload_date') + search_fields = ('name', 'specialty__name', 'employee__account__first_name', 'employee__account__last_name') + autocomplete_fields = ('specialty', 'employee') + + fieldsets = ( + ('Основная информация', { + 'fields': ('name', 'specialty', 'file_path') + }), + ('Дополнительно', { + 'fields': ('employee',) + }), + ) + + inlines = [RelevantMethodicalFileInline] + + +@admin.register(RelevantMethodicalFile) +class RelevantMethodicalFileAdmin(admin.ModelAdmin): + list_display = ('methodical_file', 'activity_type') + list_filter = ('activity_type',) + search_fields = ('methodical_file__name', 'activity_type__name') + autocomplete_fields = ('methodical_file', 'activity_type') \ No newline at end of file diff --git a/events/apps.py b/events/apps.py index 20f48f2..983b652 100644 --- a/events/apps.py +++ b/events/apps.py @@ -4,3 +4,4 @@ from django.apps import AppConfig class EventsConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'events' + verbose_name = 'Мероприятия' diff --git a/events/models.py b/events/models.py index c0b5dce..03bb7e1 100644 --- a/events/models.py +++ b/events/models.py @@ -13,6 +13,7 @@ class EventStatus(models.Model): class Meta: verbose_name = "Статус проведения" verbose_name_plural = "Статусы проведения" + ordering = ["name"] class ActivityType(models.Model): @@ -24,7 +25,7 @@ class ActivityType(models.Model): class Meta: verbose_name = "Деятельность мероприятия" verbose_name_plural = "Деятельности мероприятий" - + ordering = ["name"] class Event(models.Model): academic_year = models.ForeignKey( @@ -44,7 +45,7 @@ class Event(models.Model): class Meta: verbose_name = "Мероприятие" verbose_name_plural = "Мероприятия" - + ordering = ["date", "name"] class EventOrganizer(models.Model): employee = models.ForeignKey( @@ -61,7 +62,7 @@ class EventOrganizer(models.Model): verbose_name = "Организатор мероприятия" verbose_name_plural = "Организаторы мероприятий" unique_together = ("employee", "event") - + ordering = ["employee", "event"] class EventDetail(models.Model): activity_type = models.ForeignKey( @@ -78,7 +79,7 @@ class EventDetail(models.Model): verbose_name = "Деталь мероприятия" verbose_name_plural = "Детали мероприятий" unique_together = ("activity_type", "event") - + ordering = ["activity_type", "event"] class EventParticipant(models.Model): student = models.ForeignKey( @@ -95,7 +96,7 @@ class EventParticipant(models.Model): class Meta: verbose_name = "Участник мероприятия" verbose_name_plural = "Участники мероприятий" - + ordering = ["event", "student"] class MethodicalFile(models.Model): specialty = models.ForeignKey( @@ -114,7 +115,7 @@ class MethodicalFile(models.Model): class Meta: verbose_name = "Методический файл" verbose_name_plural = "Методические файлы" - + ordering = ["specialty", "name", "upload_date", "employee"] class RelevantMethodicalFile(models.Model): methodical_file = models.ForeignKey( @@ -131,3 +132,4 @@ class RelevantMethodicalFile(models.Model): verbose_name = "Релевантный методический файл" verbose_name_plural = "Релевантные методические файлы" + ordering = ["methodical_file", "activity_type"] diff --git a/outreach/admin.py b/outreach/admin.py index 8c38f3f..79edcea 100644 --- a/outreach/admin.py +++ b/outreach/admin.py @@ -1,3 +1,90 @@ from django.contrib import admin +from .models import ( + InstitutionType, Representative, School, Partner, + PartnerRepresentative, SchoolResponsibility +) -# Register your models here. + +@admin.register(InstitutionType) +class InstitutionTypeAdmin(admin.ModelAdmin): + list_display = ('name',) + search_fields = ('name',) + + +@admin.register(Representative) +class RepresentativeAdmin(admin.ModelAdmin): + list_display = ('full_name', 'position') + search_fields = ('first_name', 'last_name', 'middle_name', 'phone', 'email', 'position') + + @admin.display(description='ФИО') + def full_name(self, obj): + return str(obj) + + fieldsets = ( + ('Основная информация', { + 'fields': ('first_name', 'last_name', 'middle_name', 'position') + }), + ('Контактные данные', { + 'fields': ('phone', 'email') + }), + ) + + +class PartnerRepresentativeInline(admin.TabularInline): + model = PartnerRepresentative + extra = 1 + autocomplete_fields = ('representative',) + + +@admin.register(Partner) +class PartnerAdmin(admin.ModelAdmin): + list_display = ('name',) + search_fields = ('name',) + inlines = [PartnerRepresentativeInline] + + fieldsets = ( + ('Основная информация', { + 'fields': ('name', 'description') + }), + ) + + +@admin.register(PartnerRepresentative) +class PartnerRepresentativeAdmin(admin.ModelAdmin): + list_display = ('representative', 'partner') + search_fields = ('representative__first_name', 'representative__last_name', 'partner__name') + autocomplete_fields = ('representative', 'partner') + + +@admin.register(School) +class SchoolAdmin(admin.ModelAdmin): + list_display = ('name', 'institution_type', 'director') + list_filter = ('institution_type',) + search_fields = ('name', 'address', 'director__first_name', 'director__last_name') + autocomplete_fields = ('director', 'institution_type') + + fieldsets = ( + ('Основная информация', { + 'fields': ('name', 'institution_type', 'address') + }), + ('Директор', { + 'fields': ('director',) + }), + ) + + +@admin.register(SchoolResponsibility) +class SchoolResponsibilityAdmin(admin.ModelAdmin): + list_display = ('academic_year', 'school', 'responsible') + list_filter = ('academic_year', 'school__institution_type') + search_fields = ( + 'school__name', 'responsible__first_name', + 'responsible__last_name', 'academic_year__year' + ) + autocomplete_fields = ('school', 'responsible', 'academic_year') + + fieldsets = ( + ('Ответственность', { + 'fields': ('academic_year', 'school', 'responsible') + }), + ) \ No newline at end of file diff --git a/outreach/apps.py b/outreach/apps.py index 75c0650..c715532 100644 --- a/outreach/apps.py +++ b/outreach/apps.py @@ -4,3 +4,4 @@ from django.apps import AppConfig class OutreachConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'outreach' + verbose_name = 'Профориентационная работа' diff --git a/outreach/models.py b/outreach/models.py index 9046a0f..584f060 100644 --- a/outreach/models.py +++ b/outreach/models.py @@ -14,18 +14,19 @@ class InstitutionType(models.Model): class Meta: verbose_name = "Вид учебного заведения" verbose_name_plural = "Виды учебных заведений" + ordering = ["name"] class Representative(ContactMixin): position = models.CharField(max_length=100, blank=True, null=True, verbose_name="Должность") def __str__(self): - return f"{self.last_name} {self.first_name} - {self.position}" + return f"{super().__str__()}"+(" - "+self.position if self.position else "") class Meta: verbose_name = "Представитель" verbose_name_plural = "Представители" - + ordering = ["position"] class School(models.Model): director = models.ForeignKey( @@ -43,7 +44,7 @@ class School(models.Model): class Meta: verbose_name = "Школа" verbose_name_plural = "Школы" - + ordering = ["institution_type", "name", "address"] class Partner(models.Model): name = models.CharField(max_length=200, verbose_name="Название") @@ -55,7 +56,7 @@ class Partner(models.Model): class Meta: verbose_name = "Партнер" verbose_name_plural = "Партнеры" - + ordering = ["name"] class PartnerRepresentative(models.Model): representative = models.OneToOneField( @@ -72,7 +73,7 @@ class PartnerRepresentative(models.Model): verbose_name = "Представитель партнера" verbose_name_plural = "Представители партнеров" unique_together = ("representative", "partner") - + ordering = ["partner", "representative"] class SchoolResponsibility(models.Model): academic_year = models.ForeignKey( @@ -91,4 +92,4 @@ class SchoolResponsibility(models.Model): class Meta: verbose_name = "Ответственный за школу" verbose_name_plural = "Ответственные за школы" - + ordering = ["academic_year", "responsible", "school"]