from django.contrib import admin from django.db import models from django.db.models import F from django.http import HttpRequest from django.utils.translation import gettext_lazy as _ from various.models import Room @admin.register(Room) class RoomAdmin(admin.ModelAdmin): """ Admin configuration for rooms. """ list_display = ["id", "name", "length", "width", "height", "get_volume_display"] list_editable = ["name", "length", "width", "height"] actions = ["action_fix_minimum"] def get_queryset(self, request): """ Change queryset to add a computed field for volume. Args: request: HTTP """ return super().get_queryset(request).annotate(volume=F("width") * F("length") * F("height")) def get_volume_display(self, obj: Room) -> str: return f"{obj.get_volume()} cm³" get_volume_display.short_description = _("area") get_volume_display.admin_order_field = "volume" def action_fix_minimum(self, request: HttpRequest, queryset: models.QuerySet): """ Change room dimensions to have at least 1cm in every axis. Args: request: HTTP request. queryset: selected rooms. """ for room in queryset: # type: Room room.width = max(1, room.width) room.length = max(1, room.length) room.height = max(1, room.height) room.save() self.message_user(request, _("The selected rooms have been updated."))