Files
Inventory/inventory/admin.py
2026-09-29 08:43:05 +02:00

121 lines
4.4 KiB
Python

from django.contrib import admin
from django import forms
from django.core.exceptions import ValidationError
from django.utils import timezone
from rest_framework_api_key.admin import APIKeyModelAdmin
from rest_framework_api_key.models import APIKey
from .models import AuditLog, AllInOneSpecification, ChoiceValue, ComputerSpecification, DesktopSpecification, Device, DeviceTask, Employee, FieldDefinition, FieldOption, ImportJob, InspectionRecord, InventoryAPIKey, LaptopSpecification, MonitorSpecification, PrinterSpecification, RepairRecord, SavedView, UserPreference, UserProfile, WorkflowEvent
from .permissions import can_edit
try:
admin.site.unregister(APIKey)
except admin.sites.NotRegistered:
pass
class InventoryAPIKeyAdminForm(forms.ModelForm):
class Meta:
model = InventoryAPIKey
fields = "__all__"
def clean_expiry_date(self):
expiry = self.cleaned_data.get("expiry_date")
if not expiry:
raise ValidationError("Ein Ablaufdatum ist aus Sicherheitsgründen erforderlich.")
if expiry <= timezone.now():
raise ValidationError("Das Ablaufdatum muss in der Zukunft liegen.")
return expiry
def clean(self):
cleaned = super().clean()
user = cleaned.get("service_user")
if cleaned.get("can_write") and user and not can_edit(user):
self.add_error("service_user", "Schreibzugriff erfordert ein Bearbeiter- oder Administratorkonto.")
return cleaned
@admin.register(Device)
class DeviceAdmin(admin.ModelAdmin):
list_display = ("number", "stage", "status", "device_type", "model", "employee", "date", "archived_at")
search_fields = ("=number", "model", "laptop_specification__cpu", "desktop_specification__cpu", "aio_specification__cpu", "computer_specification__cpu", "ticket", "comment")
list_filter = ("stage", "status", "device_type", "employee", "archived_at")
readonly_fields = ("number", "created_at", "updated_at")
@admin.register(DeviceTask)
class DeviceTaskAdmin(admin.ModelAdmin):
list_display = ("title", "device", "state", "assigned_to", "due_date", "completed_at")
list_filter = ("state", "due_date")
search_fields = ("title", "device__number")
@admin.register(WorkflowEvent)
class WorkflowEventAdmin(admin.ModelAdmin):
list_display = ("device", "from_stage", "to_stage", "user", "created_at")
readonly_fields = ("device", "from_stage", "to_stage", "note", "user", "created_at")
@admin.register(InspectionRecord, RepairRecord)
class StageRecordAdmin(admin.ModelAdmin):
list_display = ("device", "recorded_by", "created_at")
def get_readonly_fields(self, request, obj=None):
return tuple(field.name for field in self.model._meta.fields)
def has_add_permission(self, request):
return False
def has_delete_permission(self, request, obj=None):
return False
@admin.register(LaptopSpecification, DesktopSpecification, AllInOneSpecification, ComputerSpecification, MonitorSpecification, PrinterSpecification)
class SpecificationAdmin(admin.ModelAdmin):
list_display = ("device",)
def has_add_permission(self, request):
return False
def has_change_permission(self, request, obj=None):
return False
def has_delete_permission(self, request, obj=None):
return False
@admin.register(ChoiceValue)
class ChoiceValueAdmin(admin.ModelAdmin):
list_display = ("kind", "label", "active", "sort_order")
list_filter = ("kind", "active")
@admin.register(InventoryAPIKey)
class InventoryAPIKeyAdmin(APIKeyModelAdmin):
form = InventoryAPIKeyAdminForm
list_display = (
"prefix", "name", "service_user", "can_read", "can_write", "created",
"expiry_date", "_has_expired", "revoked", "last_used_at",
)
list_filter = ("can_read", "can_write", "revoked", "created")
search_fields = ("name", "prefix", "service_user__username")
def get_readonly_fields(self, request, obj=None):
return super().get_readonly_fields(request, obj) + ("created_by", "last_used_at", "last_used_ip")
def save_model(self, request, obj, form=None, change=False):
if not obj.pk:
obj.created_by = request.user
super().save_model(request, obj, form, change)
admin.site.register(Employee)
admin.site.register(UserProfile)
admin.site.register(FieldDefinition)
admin.site.register(FieldOption)
admin.site.register(AuditLog)
admin.site.register(UserPreference)
admin.site.register(SavedView)
admin.site.register(ImportJob)