Initialize clean CSR inventory repository
This commit is contained in:
120
inventory/admin.py
Normal file
120
inventory/admin.py
Normal file
@@ -0,0 +1,120 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user