/opt/netbox/report.py
class SiteReport(Script):
    class Meta:
        name = "Site prüfen"
        description = "Prüft, ob eine Site angegeben ist."

    def test_device_sites(self):
        """Prüft alle aktiven Devices auf eine zugewiesene Site."""
        active_devices = Device.objects.filter(status="active")
        for device in active_devices:
            if device.device_type.is_child_device:
                self.log_success("Child Device übersprungen.", obj=device)
                continue

            if device.site_id is None:
                self.log_failure("Device hat keine Site zugewiesen.", obj=device)
            else:
                self.log_success("Site zugewiesen.", obj=device)

    def test_vm_sites(self):
        """Prüft alle aktiven virtuellen Maschinen auf eine zugewiesene Site."""
        active_vms = VirtualMachine.objects.filter(status="active")
        for vm in active_vms:
            # NetBox v4 erlaubt direkte site_id an der VM. Falls leer, prüfen wir das Cluster.
            if vm.site_id is not None:
                self.log_success("Site direkt an VM zugewiesen.", obj=vm)
            elif vm.cluster and vm.cluster.site_id is not None:
                self.log_success("Site über Cluster zugewiesen.", obj=vm)
            else:
                self.log_failure("Virtual Machine hat weder direkt noch über das Cluster eine Site zugewiesen.", obj=vm)