from django.contrib import admin from .models import ( Building, Floor, Room, AssetCategory, Asset, MaintenanceType, MaintenanceRequest, MaintenanceSchedule, Vendor, ServiceContract, Inspection, EnergyMeter, EnergyReading, SpaceReservation ) @admin.register(Building) class BuildingAdmin(admin.ModelAdmin): list_display = ['code', 'name', 'building_type', 'floor_count', 'total_area_sqm', 'is_active', 'facility_manager'] list_filter = ['building_type', 'is_active', 'construction_year', 'tenant'] search_fields = ['code', 'name', 'address'] ordering = ['code', 'name'] readonly_fields = ['building_id', 'created_at', 'updated_at'] fieldsets = ( ('Basic Information', { 'fields': ('tenant', 'name', 'building_id', 'code', 'building_type') }), ('Location & Dimensions', { 'fields': ('address', 'latitude', 'longitude', 'floor_count', 'total_area_sqm') }), ('Construction Details', { 'fields': ('construction_year', 'architect', 'contractor', 'last_major_renovation') }), ('Management', { 'fields': ('facility_manager', 'is_active') }), ('Timestamps', { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }), ) @admin.register(Floor) class FloorAdmin(admin.ModelAdmin): list_display = ['building', 'floor_number', 'name', 'area_sqm', 'is_public_access'] list_filter = ['building', 'is_public_access'] search_fields = ['name', 'building__name', 'building__code'] ordering = ['building', 'floor_number'] @admin.register(Room) class RoomAdmin(admin.ModelAdmin): list_display = ['room_number', 'name', 'floor', 'occupancy_status', 'area_sqm', 'capacity', 'is_accessible'] list_filter = ['occupancy_status', 'is_accessible', 'floor__building'] search_fields = ['room_number', 'name', 'floor__building__name'] ordering = ['floor', 'room_number'] readonly_fields = ['created_at', 'updated_at'] @admin.register(AssetCategory) class AssetCategoryAdmin(admin.ModelAdmin): list_display = ['name', 'code', 'parent_category', 'is_active'] list_filter = ['is_active'] search_fields = ['name', 'code', 'description'] ordering = ['name'] @admin.register(Asset) class AssetAdmin(admin.ModelAdmin): list_display = ['name', 'category', 'building', 'status', 'condition', 'assigned_to'] list_filter = ['status', 'condition', 'category', 'building'] search_fields = [ 'name', 'serial_number', 'manufacturer', 'model'] ordering = ['asset_id'] readonly_fields = ['asset_id', 'created_at', 'updated_at'] fieldsets = ( ('Basic Information', { 'fields': ('name', 'category') }), ('Location', { 'fields': ('building', 'floor', 'room', 'location_description') }), ('Asset Details', { 'fields': ('manufacturer', 'model', 'serial_number') }), ('Financial Information', { 'fields': ('purchase_date', 'purchase_cost', 'current_value', 'depreciation_rate') }), ('Warranty & Service', { 'fields': ('warranty_start_date', 'warranty_end_date', 'service_provider', 'service_contract_number') }), ('Status & Condition', { 'fields': ('status', 'condition', 'last_inspection_date', 'next_maintenance_date') }), ('Assignment', { 'fields': ('assigned_to', 'notes') }), ('Timestamps', { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }), ) def is_under_warranty(self, obj): return obj.is_under_warranty is_under_warranty.boolean = True is_under_warranty.short_description = 'Under Warranty' def needs_maintenance(self, obj): return obj.needs_maintenance needs_maintenance.boolean = True needs_maintenance.short_description = 'Needs Maintenance' @admin.register(MaintenanceType) class MaintenanceTypeAdmin(admin.ModelAdmin): list_display = ['name', 'code', 'estimated_duration_hours', 'is_active'] list_filter = ['is_active'] search_fields = ['name', 'code', 'description'] ordering = ['name'] @admin.register(MaintenanceRequest) class MaintenanceRequestAdmin(admin.ModelAdmin): list_display = ['request_id', 'title', 'maintenance_type', 'building', 'priority', 'status', 'requested_by', 'assigned_to', 'requested_date'] list_filter = ['priority', 'status', 'maintenance_type', 'building', 'requested_date'] search_fields = ['request_id', 'title', 'description', 'requested_by__username'] ordering = ['-requested_date'] # readonly_fields = ['request_id', 'created_at', 'updated_at'] fieldsets = ( ('Basic Information', { 'fields': ('request_id', 'title', 'description', 'maintenance_type') }), ('Location', { 'fields': ('building', 'floor', 'room', 'asset') }), ('Request Details', { 'fields': ('priority', 'status') }), ('People Involved', { 'fields': ('requested_by', 'assigned_to') }), ('Timing', { 'fields': ('requested_date', 'scheduled_date', 'started_date', 'completed_date') }), ('Cost Estimation', { 'fields': ('estimated_hours', 'estimated_cost', 'actual_cost') }), ('Additional Information', { 'fields': ('notes', 'completion_notes') }), ('Timestamps', { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }), ) @admin.register(MaintenanceSchedule) class MaintenanceScheduleAdmin(admin.ModelAdmin): list_display = ['name', 'maintenance_type', 'asset', 'building', 'frequency_interval', 'next_due_date', 'is_active'] list_filter = ['is_active', 'frequency_interval', 'maintenance_type'] search_fields = ['name', 'description'] ordering = ['next_due_date'] readonly_fields = ['created_at'] @admin.register(Vendor) class VendorAdmin(admin.ModelAdmin): list_display = ['name', 'vendor_type', 'contact_person', 'email', 'phone', 'rating', 'is_active'] list_filter = ['vendor_type', 'is_active', 'tenant'] search_fields = ['name', 'contact_person', 'email', 'crn', 'vrn'] ordering = ['name'] readonly_fields = ['created_at', 'updated_at'] @admin.register(ServiceContract) class ServiceContractAdmin(admin.ModelAdmin): list_display = ['contract_number', 'vendor', 'title', 'start_date', 'end_date', 'status', 'contract_value'] list_filter = ['status', 'vendor', 'start_date', 'end_date'] search_fields = ['contract_number', 'title', 'vendor__name'] ordering = ['-start_date'] readonly_fields = ['created_at', 'updated_at'] fieldsets = ( ('Basic Information', { 'fields': ('contract_number', 'vendor', 'title', 'description') }), ('Contract Terms', { 'fields': ('start_date', 'end_date', 'contract_value', 'payment_terms') }), ('Scope', { 'fields': ('buildings', 'service_areas') }), ('Status', { 'fields': ('status', 'auto_renewal', 'renewal_notice_days') }), ('Management', { 'fields': ('contract_manager', 'notes') }), ('Timestamps', { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }), ) def is_expiring_soon(self, obj): return obj.is_expiring_soon is_expiring_soon.boolean = True is_expiring_soon.short_description = 'Expiring Soon' @admin.register(Inspection) class InspectionAdmin(admin.ModelAdmin): list_display = ['inspection_id', 'inspection_type', 'title', 'building', 'scheduled_date', 'status', 'inspector'] list_filter = ['inspection_type', 'status', 'building', 'scheduled_date'] search_fields = ['inspection_id', 'title', 'inspector__username'] ordering = ['-scheduled_date'] readonly_fields = ['inspection_id', 'created_at', 'updated_at'] @admin.register(EnergyMeter) class EnergyMeterAdmin(admin.ModelAdmin): list_display = ['meter_id', 'meter_type', 'building', 'current_reading', 'last_reading_date', 'is_active'] list_filter = ['meter_type', 'building', 'is_active'] search_fields = ['meter_id', 'serial_number', 'building__name'] ordering = ['building', 'meter_type', 'meter_id'] readonly_fields = ['created_at', 'updated_at'] @admin.register(EnergyReading) class EnergyReadingAdmin(admin.ModelAdmin): list_display = ['meter', 'reading_date', 'reading_value', 'consumption', 'cost', 'is_estimated'] list_filter = ['reading_date', 'is_estimated', 'meter__meter_type'] search_fields = ['meter__meter_id', 'read_by__username'] ordering = ['-reading_date'] readonly_fields = ['created_at'] @admin.register(SpaceReservation) class SpaceReservationAdmin(admin.ModelAdmin): list_display = ['reservation_id', 'title', 'room', 'start_datetime', 'end_datetime', 'status', 'reserved_by'] list_filter = ['status', 'start_datetime', 'room__floor__building'] search_fields = ['reservation_id', 'title', 'reserved_by__username', 'contact_person'] ordering = ['-start_datetime'] readonly_fields = ['reservation_id', 'created_at', 'updated_at'] fieldsets = ( ('Basic Information', { 'fields': ('reservation_id', 'room', 'title', 'description') }), ('Schedule', { 'fields': ('start_datetime', 'end_datetime') }), ('Requester Information', { 'fields': ('reserved_by', 'contact_person', 'contact_email', 'contact_phone') }), ('Event Details', { 'fields': ('expected_attendees', 'setup_requirements', 'catering_required', 'av_equipment_required') }), ('Status & Approval', { 'fields': ('status', 'approved_by', 'approved_at') }), ('Billing', { 'fields': ('hourly_rate', 'total_cost') }), ('Notes', { 'fields': ('notes',) }), ('Timestamps', { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }), )