agdar/hr/admin.py
2025-11-02 14:35:35 +03:00

147 lines
4.9 KiB
Python

"""
Django admin configuration for HR app.
"""
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from .models import Attendance, Schedule, Holiday, LeaveRequest, LeaveBalance
@admin.register(Attendance)
class AttendanceAdmin(admin.ModelAdmin):
"""Admin interface for Attendance model."""
list_display = ['employee', 'date', 'check_in', 'check_out', 'hours_worked', 'status', 'tenant']
list_filter = ['status', 'date', 'tenant']
search_fields = ['employee__username', 'employee__first_name', 'employee__last_name', 'notes']
readonly_fields = ['id', 'hours_worked', 'created_at', 'updated_at']
date_hierarchy = 'date'
fieldsets = (
(None, {
'fields': ('employee', 'date', 'tenant', 'status')
}),
(_('Time'), {
'fields': ('check_in', 'check_out', 'hours_worked')
}),
(_('Notes'), {
'fields': ('notes',),
'classes': ('collapse',)
}),
(_('Metadata'), {
'fields': ('id', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
def save_model(self, request, obj, form, change):
"""Auto-calculate hours_worked on save."""
super().save_model(request, obj, form, change)
@admin.register(Schedule)
class ScheduleAdmin(admin.ModelAdmin):
"""Admin interface for Schedule model."""
list_display = ['employee', 'day_of_week', 'start_time', 'end_time', 'duration_hours', 'is_active', 'tenant']
list_filter = ['day_of_week', 'is_active', 'tenant']
search_fields = ['employee__username', 'employee__first_name', 'employee__last_name']
readonly_fields = ['id', 'duration_hours', 'created_at', 'updated_at']
fieldsets = (
(None, {
'fields': ('employee', 'day_of_week', 'tenant', 'is_active')
}),
(_('Time'), {
'fields': ('start_time', 'end_time', 'duration_hours')
}),
(_('Metadata'), {
'fields': ('id', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
@admin.register(Holiday)
class HolidayAdmin(admin.ModelAdmin):
"""Admin interface for Holiday model."""
list_display = ['name', 'date', 'is_recurring', 'tenant']
list_filter = ['is_recurring', 'date', 'tenant']
search_fields = ['name', 'description']
readonly_fields = ['id', 'created_at', 'updated_at']
date_hierarchy = 'date'
fieldsets = (
(None, {
'fields': ('name', 'date', 'tenant', 'is_recurring')
}),
(_('Description'), {
'fields': ('description',),
'classes': ('collapse',)
}),
(_('Metadata'), {
'fields': ('id', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
@admin.register(LeaveRequest)
class LeaveRequestAdmin(admin.ModelAdmin):
"""Admin interface for Leave Request model."""
list_display = ['employee', 'leave_type', 'start_date', 'end_date', 'days_requested', 'status', 'tenant']
list_filter = ['status', 'leave_type', 'start_date', 'tenant']
search_fields = ['employee__username', 'employee__first_name', 'employee__last_name', 'reason']
readonly_fields = ['id', 'days_requested', 'created_at', 'updated_at']
date_hierarchy = 'start_date'
fieldsets = (
(None, {
'fields': ('employee', 'leave_type', 'tenant', 'status')
}),
(_('Leave Period'), {
'fields': ('start_date', 'end_date', 'days_requested')
}),
(_('Details'), {
'fields': ('reason', 'attachment')
}),
(_('Approval'), {
'fields': ('reviewed_by', 'reviewed_at', 'reviewer_comments'),
'classes': ('collapse',)
}),
(_('Metadata'), {
'fields': ('id', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
def save_model(self, request, obj, form, change):
"""Auto-calculate days_requested on save."""
super().save_model(request, obj, form, change)
@admin.register(LeaveBalance)
class LeaveBalanceAdmin(admin.ModelAdmin):
"""Admin interface for Leave Balance model."""
list_display = ['employee', 'year', 'leave_type', 'total_days', 'used_days', 'remaining_days', 'tenant']
list_filter = ['year', 'leave_type', 'tenant']
search_fields = ['employee__username', 'employee__first_name', 'employee__last_name']
readonly_fields = ['id', 'remaining_days', 'utilization_percentage', 'created_at', 'updated_at']
fieldsets = (
(None, {
'fields': ('employee', 'year', 'leave_type', 'tenant')
}),
(_('Balance'), {
'fields': ('total_days', 'used_days', 'remaining_days', 'utilization_percentage')
}),
(_('Metadata'), {
'fields': ('id', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)