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)