from django.contrib import admin from django.utils.html import format_html from .models import JobPosition, JobApplication @admin.register(JobPosition) class JobPositionAdmin(admin.ModelAdmin): list_display = [ 'title', 'department', 'location', 'open_positions', 'employment_type', 'status_badge', 'featured', 'posted_date', 'applications_count' ] list_filter = ['status', 'employment_type', 'location_type', 'featured', 'department', 'posted_date'] search_fields = ['title', 'department', 'location', 'short_description'] prepopulated_fields = {'slug': ('title',)} readonly_fields = ['posted_date', 'updated_date', 'applications_count'] fieldsets = ( ('Basic Information', { 'fields': ('title', 'slug', 'department', 'status', 'featured', 'priority') }), ('Employment Details', { 'fields': ('employment_type', 'location_type', 'location', 'open_positions', 'experience_required') }), ('Salary Information', { 'fields': ('salary_min', 'salary_max', 'salary_currency', 'salary_period', 'salary_additional') }), ('Job Description', { 'fields': ('short_description', 'about_role') }), ('Requirements & Qualifications', { 'fields': ('requirements', 'responsibilities', 'qualifications', 'bonus_points', 'benefits'), 'classes': ('collapse',) }), ('Dates', { 'fields': ('start_date', 'deadline', 'posted_date', 'updated_date') }), ) def status_badge(self, obj): colors = { 'active': 'green', 'closed': 'red', 'draft': 'orange' } return format_html( '{}', colors.get(obj.status, 'black'), obj.get_status_display() ) status_badge.short_description = 'Status' def applications_count(self, obj): count = obj.applications.count() return format_html( '{} application(s)', count ) applications_count.short_description = 'Applications' @admin.register(JobApplication) class JobApplicationAdmin(admin.ModelAdmin): list_display = [ 'full_name', 'email', 'job', 'status_badge', 'applied_date', 'resume_link' ] list_filter = ['status', 'job', 'applied_date'] search_fields = ['first_name', 'last_name', 'email', 'job__title'] readonly_fields = ['applied_date', 'updated_date', 'resume_link'] fieldsets = ( ('Job Information', { 'fields': ('job', 'status') }), ('Applicant Information', { 'fields': ('first_name', 'last_name', 'email', 'phone') }), ('Professional Information', { 'fields': ('current_position', 'current_company', 'years_of_experience') }), ('Application Details', { 'fields': ('cover_letter', 'resume', 'resume_link', 'portfolio_url') }), ('Social Links', { 'fields': ('linkedin_url', 'github_url', 'website_url'), 'classes': ('collapse',) }), ('Availability & Salary', { 'fields': ('available_from', 'notice_period', 'expected_salary', 'salary_currency'), 'classes': ('collapse',) }), ('Metadata', { 'fields': ('applied_date', 'updated_date', 'consent', 'notes') }), ) def status_badge(self, obj): colors = { 'new': 'blue', 'reviewing': 'orange', 'shortlisted': 'purple', 'interviewed': 'teal', 'accepted': 'green', 'rejected': 'red' } return format_html( '{}', colors.get(obj.status, 'black'), obj.get_status_display() ) status_badge.short_description = 'Status' def resume_link(self, obj): if obj.resume: return format_html( 'Download Resume', obj.resume.url ) return '-' resume_link.short_description = 'Resume' actions = ['mark_as_reviewing', 'mark_as_shortlisted', 'mark_as_rejected'] def mark_as_reviewing(self, request, queryset): queryset.update(status='reviewing') self.message_user(request, f'{queryset.count()} application(s) marked as reviewing.') mark_as_reviewing.short_description = 'Mark as Reviewing' def mark_as_shortlisted(self, request, queryset): queryset.update(status='shortlisted') self.message_user(request, f'{queryset.count()} application(s) marked as shortlisted.') mark_as_shortlisted.short_description = 'Mark as Shortlisted' def mark_as_rejected(self, request, queryset): queryset.update(status='rejected') self.message_user(request, f'{queryset.count()} application(s) marked as rejected.') mark_as_rejected.short_description = 'Mark as Rejected'