This commit is contained in:
Mikan
2025-05-18 22:48:39 +03:00
parent c0865fdf51
commit f1dd7fa22a
10 changed files with 236 additions and 23 deletions

View File

@@ -19,7 +19,7 @@ class DepartmentHeadAdmin(admin.ModelAdmin):
list_display = ('department', 'head') list_display = ('department', 'head')
list_filter = ('department',) list_filter = ('department',)
autocomplete_fields = ('department', 'head') 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) @admin.register(Specialty)
@@ -33,7 +33,7 @@ class SpecialtyAdmin(admin.ModelAdmin):
class GroupAdmin(admin.ModelAdmin): class GroupAdmin(admin.ModelAdmin):
list_display = ('name', 'specialty', 'curator') list_display = ('name', 'specialty', 'curator')
list_filter = ('specialty__department', 'specialty') 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') autocomplete_fields = ('specialty', 'curator')
@@ -42,7 +42,7 @@ class StudentAdmin(admin.ModelAdmin):
list_display = ('full_name', 'group', 'account') list_display = ('full_name', 'group', 'account')
list_filter = ('group__specialty__department', 'group__specialty', 'group') list_filter = ('group__specialty__department', 'group__specialty', 'group')
search_fields = ( search_fields = (
'first_name', 'last_name', 'middle_name', 'account__first_name', 'account__last_name', 'account__middle_name',
'group__name', 'account__login' 'group__name', 'account__login'
) )
autocomplete_fields = ('group', 'account') autocomplete_fields = ('group', 'account')

View File

@@ -14,6 +14,7 @@ class AcademicYear(models.Model):
class Meta: class Meta:
verbose_name = "Учебный год" verbose_name = "Учебный год"
verbose_name_plural = "Учебные годы" verbose_name_plural = "Учебные годы"
ordering = ['-year']
class Department(models.Model): class Department(models.Model):
@@ -25,6 +26,7 @@ class Department(models.Model):
class Meta: class Meta:
verbose_name = "Учебное отделение" verbose_name = "Учебное отделение"
verbose_name_plural = "Учебные отделения" verbose_name_plural = "Учебные отделения"
ordering = ["name"]
class DepartmentHead(models.Model): class DepartmentHead(models.Model):
@@ -42,6 +44,7 @@ class DepartmentHead(models.Model):
verbose_name = "Руководитель отделения" verbose_name = "Руководитель отделения"
verbose_name_plural = "Руководители отделений" verbose_name_plural = "Руководители отделений"
unique_together = ("department", "head") unique_together = ("department", "head")
ordering = ["department", "head"]
class Specialty(models.Model): class Specialty(models.Model):
@@ -57,6 +60,7 @@ class Specialty(models.Model):
class Meta: class Meta:
verbose_name = "Специальность" verbose_name = "Специальность"
verbose_name_plural = "Специальности" verbose_name_plural = "Специальности"
ordering = ["code"]
class Group(models.Model): class Group(models.Model):
@@ -72,8 +76,9 @@ class Group(models.Model):
return self.name return self.name
class Meta: class Meta:
verbose_name = "Группа" verbose_name = "Студенческая группа"
verbose_name_plural = "Группы" verbose_name_plural = "Студенческие группы"
ordering = ["name", "specialty"]
class Student(models.Model): class Student(models.Model):
@@ -126,4 +131,5 @@ class Student(models.Model):
class Meta: class Meta:
verbose_name = "Студент" verbose_name = "Студент"
verbose_name_plural = "Студенты" verbose_name_plural = "Студенты"
ordering = ["group", "account"]

View File

@@ -19,8 +19,8 @@ class EmployeeAdmin(admin.ModelAdmin):
list_display = ('full_name', 'position', 'department', 'account') list_display = ('full_name', 'position', 'department', 'account')
list_filter = ('department', 'position') list_filter = ('department', 'position')
search_fields = ( search_fields = (
'first_name', 'last_name', 'middle_name', 'account__first_name', 'account__last_name', 'account__middle_name',
'phone', 'email', 'position__name', 'department__name' 'account__phone', 'account__email', 'position__name', 'department__name'
) )
autocomplete_fields = ('department', 'position', 'account') autocomplete_fields = ('department', 'position', 'account')

View File

@@ -12,6 +12,7 @@ class Position(models.Model):
class Meta: class Meta:
verbose_name = "Должность" verbose_name = "Должность"
verbose_name_plural = "Должности" verbose_name_plural = "Должности"
ordering = ["name"]
class Department(models.Model): class Department(models.Model):
@@ -23,7 +24,7 @@ class Department(models.Model):
class Meta: class Meta:
verbose_name = "Подразделение" verbose_name = "Подразделение"
verbose_name_plural = "Подразделения" verbose_name_plural = "Подразделения"
ordering = ["name"]
class Employee(models.Model): class Employee(models.Model):
department = models.ForeignKey( department = models.ForeignKey(
@@ -85,4 +86,4 @@ class Employee(models.Model):
class Meta: class Meta:
verbose_name = "Сотрудник" verbose_name = "Сотрудник"
verbose_name_plural = "Сотрудники" verbose_name_plural = "Сотрудники"
ordering = ["department", "position", "account"]

View File

@@ -1,3 +1,117 @@
from django.contrib import admin 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')

View File

@@ -4,3 +4,4 @@ from django.apps import AppConfig
class EventsConfig(AppConfig): class EventsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField' default_auto_field = 'django.db.models.BigAutoField'
name = 'events' name = 'events'
verbose_name = 'Мероприятия'

View File

@@ -13,6 +13,7 @@ class EventStatus(models.Model):
class Meta: class Meta:
verbose_name = "Статус проведения" verbose_name = "Статус проведения"
verbose_name_plural = "Статусы проведения" verbose_name_plural = "Статусы проведения"
ordering = ["name"]
class ActivityType(models.Model): class ActivityType(models.Model):
@@ -24,7 +25,7 @@ class ActivityType(models.Model):
class Meta: class Meta:
verbose_name = "Деятельность мероприятия" verbose_name = "Деятельность мероприятия"
verbose_name_plural = "Деятельности мероприятий" verbose_name_plural = "Деятельности мероприятий"
ordering = ["name"]
class Event(models.Model): class Event(models.Model):
academic_year = models.ForeignKey( academic_year = models.ForeignKey(
@@ -44,7 +45,7 @@ class Event(models.Model):
class Meta: class Meta:
verbose_name = "Мероприятие" verbose_name = "Мероприятие"
verbose_name_plural = "Мероприятия" verbose_name_plural = "Мероприятия"
ordering = ["date", "name"]
class EventOrganizer(models.Model): class EventOrganizer(models.Model):
employee = models.ForeignKey( employee = models.ForeignKey(
@@ -61,7 +62,7 @@ class EventOrganizer(models.Model):
verbose_name = "Организатор мероприятия" verbose_name = "Организатор мероприятия"
verbose_name_plural = "Организаторы мероприятий" verbose_name_plural = "Организаторы мероприятий"
unique_together = ("employee", "event") unique_together = ("employee", "event")
ordering = ["employee", "event"]
class EventDetail(models.Model): class EventDetail(models.Model):
activity_type = models.ForeignKey( activity_type = models.ForeignKey(
@@ -78,7 +79,7 @@ class EventDetail(models.Model):
verbose_name = "Деталь мероприятия" verbose_name = "Деталь мероприятия"
verbose_name_plural = "Детали мероприятий" verbose_name_plural = "Детали мероприятий"
unique_together = ("activity_type", "event") unique_together = ("activity_type", "event")
ordering = ["activity_type", "event"]
class EventParticipant(models.Model): class EventParticipant(models.Model):
student = models.ForeignKey( student = models.ForeignKey(
@@ -95,7 +96,7 @@ class EventParticipant(models.Model):
class Meta: class Meta:
verbose_name = "Участник мероприятия" verbose_name = "Участник мероприятия"
verbose_name_plural = "Участники мероприятий" verbose_name_plural = "Участники мероприятий"
ordering = ["event", "student"]
class MethodicalFile(models.Model): class MethodicalFile(models.Model):
specialty = models.ForeignKey( specialty = models.ForeignKey(
@@ -114,7 +115,7 @@ class MethodicalFile(models.Model):
class Meta: class Meta:
verbose_name = "Методический файл" verbose_name = "Методический файл"
verbose_name_plural = "Методические файлы" verbose_name_plural = "Методические файлы"
ordering = ["specialty", "name", "upload_date", "employee"]
class RelevantMethodicalFile(models.Model): class RelevantMethodicalFile(models.Model):
methodical_file = models.ForeignKey( methodical_file = models.ForeignKey(
@@ -131,3 +132,4 @@ class RelevantMethodicalFile(models.Model):
verbose_name = "Релевантный методический файл" verbose_name = "Релевантный методический файл"
verbose_name_plural = "Релевантные методические файлы" verbose_name_plural = "Релевантные методические файлы"
ordering = ["methodical_file", "activity_type"]

View File

@@ -1,3 +1,90 @@
from django.contrib import admin 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')
}),
)

View File

@@ -4,3 +4,4 @@ from django.apps import AppConfig
class OutreachConfig(AppConfig): class OutreachConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField' default_auto_field = 'django.db.models.BigAutoField'
name = 'outreach' name = 'outreach'
verbose_name = 'Профориентационная работа'

View File

@@ -14,18 +14,19 @@ class InstitutionType(models.Model):
class Meta: class Meta:
verbose_name = "Вид учебного заведения" verbose_name = "Вид учебного заведения"
verbose_name_plural = "Виды учебных заведений" verbose_name_plural = "Виды учебных заведений"
ordering = ["name"]
class Representative(ContactMixin): class Representative(ContactMixin):
position = models.CharField(max_length=100, blank=True, null=True, verbose_name="Должность") position = models.CharField(max_length=100, blank=True, null=True, verbose_name="Должность")
def __str__(self): 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: class Meta:
verbose_name = "Представитель" verbose_name = "Представитель"
verbose_name_plural = "Представители" verbose_name_plural = "Представители"
ordering = ["position"]
class School(models.Model): class School(models.Model):
director = models.ForeignKey( director = models.ForeignKey(
@@ -43,7 +44,7 @@ class School(models.Model):
class Meta: class Meta:
verbose_name = "Школа" verbose_name = "Школа"
verbose_name_plural = "Школы" verbose_name_plural = "Школы"
ordering = ["institution_type", "name", "address"]
class Partner(models.Model): class Partner(models.Model):
name = models.CharField(max_length=200, verbose_name="Название") name = models.CharField(max_length=200, verbose_name="Название")
@@ -55,7 +56,7 @@ class Partner(models.Model):
class Meta: class Meta:
verbose_name = "Партнер" verbose_name = "Партнер"
verbose_name_plural = "Партнеры" verbose_name_plural = "Партнеры"
ordering = ["name"]
class PartnerRepresentative(models.Model): class PartnerRepresentative(models.Model):
representative = models.OneToOneField( representative = models.OneToOneField(
@@ -72,7 +73,7 @@ class PartnerRepresentative(models.Model):
verbose_name = "Представитель партнера" verbose_name = "Представитель партнера"
verbose_name_plural = "Представители партнеров" verbose_name_plural = "Представители партнеров"
unique_together = ("representative", "partner") unique_together = ("representative", "partner")
ordering = ["partner", "representative"]
class SchoolResponsibility(models.Model): class SchoolResponsibility(models.Model):
academic_year = models.ForeignKey( academic_year = models.ForeignKey(
@@ -91,4 +92,4 @@ class SchoolResponsibility(models.Model):
class Meta: class Meta:
verbose_name = "Ответственный за школу" verbose_name = "Ответственный за школу"
verbose_name_plural = "Ответственные за школы" verbose_name_plural = "Ответственные за школы"
ordering = ["academic_year", "responsible", "school"]