diff --git a/backend/employees/admin.py b/backend/employees/admin.py
index 81ca5eaa..1af30f88 100644
--- a/backend/employees/admin.py
+++ b/backend/employees/admin.py
@@ -157,16 +157,32 @@ class EmployeeAdmin(DjangoUserAdmin):
"position",
"is_active",
"email_verified",
+ "is_ldap_managed",
"is_staff",
)
- list_filter = ("is_active", "email_verified", "is_staff", "is_superuser", "position", "groups")
+ list_filter = (
+ "is_active",
+ "email_verified",
+ "is_staff",
+ "is_superuser",
+ "is_ldap_managed",
+ "position",
+ "groups",
+ )
search_fields = ("email", "first_name", "last_name", "phone_number")
ordering = ("last_name", "first_name")
list_select_related = ("position",)
filter_horizontal = ("groups", "user_permissions", "skills")
- readonly_fields = ("last_login", "created_at", "updated_at")
+ readonly_fields = (
+ "last_login",
+ "created_at",
+ "updated_at",
+ "ldap_sync_info",
+ "email_activation_code",
+ "sms_activation_code",
+ )
fieldsets = (
(None, {"fields": ("email", "password")}),
@@ -190,14 +206,60 @@ class EmployeeAdmin(DjangoUserAdmin):
"fields": (
"is_active",
"email_verified",
+ "email_activation_code",
+ "sms_activation_code",
"is_staff",
"is_superuser",
"groups",
"user_permissions",
)
}),
+ ("LDAP", {
+ "fields": ("is_ldap_managed", "ldap_sync_info"),
+ "classes": ("collapse",),
+ }),
("Служебное", {"fields": ("last_login", "created_at", "updated_at")}),
)
+
+ def ldap_sync_info(self, obj):
+ """Отображает информацию о состоянии синхронизации LDAP."""
+ if not obj.pk:
+ return "-"
+
+ try:
+ sync_state = LdapSyncState.objects.filter(
+ model="employee",
+ object_pk=str(obj.pk)
+ ).first()
+
+ if not sync_state:
+ return "Нет записи синхронизации"
+
+ from django.utils.html import format_html
+
+ info = []
+ if sync_state.ldap_dn:
+ info.append(f"DN: {sync_state.ldap_dn}")
+ if sync_state.ldap_guid:
+ info.append(f"GUID: {sync_state.ldap_guid}")
+ if sync_state.last_sync_dir:
+ info.append(f"Направление: {sync_state.last_sync_dir}")
+ if sync_state.last_ldap_modify_ts:
+ info.append(
+ f"LDAP изменен: {sync_state.last_ldap_modify_ts}"
+ )
+ if sync_state.last_django_modify_ts:
+ info.append(
+ f"Django изменен: {sync_state.last_django_modify_ts}"
+ )
+ if sync_state.updated_at:
+ info.append(f"Обновлено: {sync_state.updated_at}")
+
+ return format_html("
".join(info)) if info else "-"
+ except Exception as e:
+ return f"Ошибка: {e}"
+
+ ldap_sync_info.short_description = "Состояние LDAP синхронизации"
add_fieldsets = (
(None, {
@@ -227,8 +289,17 @@ class EmployeeAdmin(DjangoUserAdmin):
@admin.register(Position)
class PositionAdmin(SimpleHistoryAdmin):
list_display = ("name", "description")
- search_fields = ("name", "description")
+ search_fields = ("name", "description", "ldap_group_dn")
filter_horizontal = ("groups",)
+
+ fieldsets = (
+ (None, {"fields": ("name", "description")}),
+ ("Права", {"fields": ("groups",)}),
+ ("LDAP", {
+ "fields": ("ldap_group_dn",),
+ "classes": ("collapse",),
+ }),
+ )
@admin.register(EmployeeAction)
@@ -242,21 +313,42 @@ class EmployeeActionAdmin(SimpleHistoryAdmin):
@admin.register(Department)
class DepartmentAdmin(admin.ModelAdmin):
- list_display = ("name", "head", "created_at")
+ list_display = ("name", "head", "head_appointed_at", "created_at")
list_filter = ("head",)
- search_fields = ("name",)
+ search_fields = ("name", "description", "ldap_group_dn")
autocomplete_fields = ("head",)
readonly_fields = ("created_at", "head_appointed_at")
inlines = [DepartmentMembershipInline]
+
+ fieldsets = (
+ (None, {"fields": ("name", "description")}),
+ ("Руководство", {
+ "fields": ("head", "head_appointed_at"),
+ }),
+ ("LDAP", {
+ "fields": ("ldap_group_dn",),
+ "classes": ("collapse",),
+ }),
+ ("Служебное", {"fields": ("created_at",)}),
+ )
@admin.register(DepartmentRole)
class DepartmentRoleAdmin(admin.ModelAdmin):
list_display = ("name", "department")
list_filter = ("department",)
- search_fields = ("name", "department__name")
+ search_fields = ("name", "department__name", "ldap_group_dn")
autocomplete_fields = ("department",)
filter_horizontal = ("scoped_permissions",)
+
+ fieldsets = (
+ (None, {"fields": ("department", "name")}),
+ ("Права", {"fields": ("scoped_permissions",)}),
+ ("LDAP", {
+ "fields": ("ldap_group_dn",),
+ "classes": ("collapse",),
+ }),
+ )
@admin.register(EmployeeDepartment)
class EmployeeDepartmentAdmin(admin.ModelAdmin):