265 lines
10 KiB
Python
265 lines
10 KiB
Python
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 = ['title', 'maintenance_type', 'building', 'priority', 'status', 'requested_by', 'assigned_to', ]
|
|
# list_filter = ['priority', 'status', 'maintenance_type', 'building', ]
|
|
# search_fields = ['request_id', 'title', 'description', 'requested_by__username']
|
|
# # ordering = ['-requested_date']
|
|
# # readonly_fields = ['request_id', 'created_at', 'updated_at']
|
|
# fieldsets = (
|
|
# ('Basic Information', {
|
|
# 'fields': ('title', 'description', 'maintenance_type')
|
|
# }),
|
|
# ('Location', {
|
|
# 'fields': ('building', 'floor', 'room', 'asset')
|
|
# }),
|
|
# ('Request Details', {
|
|
# 'fields': ('priority', 'status')
|
|
# }),
|
|
# ('People Involved', {
|
|
# 'fields': ('requested_by', 'assigned_to')
|
|
# }),
|
|
# ('Timing', {
|
|
# 'fields': ('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',)
|
|
}),
|
|
)
|