Marwan Alwali 263292f6be update
2025-11-04 00:50:06 +03:00

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',)
}),
)