147 lines
4.9 KiB
Python
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',)
|
|
}),
|
|
)
|