diff --git a/README.md b/README.md index 39725d4..6a841fb 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Release-Tag oder ein bestimmter Commit verwendet werden: ```bash /opt/netbox/venv/bin/pip install --upgrade --force-reinstall \ - "git+https://git.mrblake.cc/MrBlake/Netbox-Utilities.git@v0.3.0" + "git+https://git.mrblake.cc/MrBlake/Netbox-Utilities.git@v0.3.1" ``` Alternativ kann hinter dem `@` die vollständige Commit-ID stehen. @@ -135,7 +135,12 @@ Auf Geräteseiten mit freien Modulschächten steht dieselbe Funktion zusätzlich dort bereits vorausgewählt. Das funktioniert sowohl für modulare Patchpanels als auch für andere NetBox-Geräte mit Modulschächten. -Alle ausgewählten Schächte erhalten denselben Modultyp, Status und dieselbe +Der Benutzer kann entweder bestimmte freie Modulschächte auswählen oder über +**Anzahl (1–x)** eine Menge eingeben. Bei der Mengenangabe verwendet das Plugin +die ersten freien Modulschächte in der natürlichen NetBox-Reihenfolge. Beide +Eingabearten können nicht miteinander kombiniert werden. + +Alle gewählten Schächte erhalten denselben Modultyp, Status und dieselbe Beschreibung. Optional werden die Komponenten aus den Vorlagen des Modultyps für jedes Modul repliziert. NetBox prüft dabei jeden Einbau mit derselben Logik wie beim einzelnen Modul. Der Vorgang ist atomar: Ist ein Schacht inzwischen diff --git a/netbox_utilities/__init__.py b/netbox_utilities/__init__.py index d36019c..eb279d5 100644 --- a/netbox_utilities/__init__.py +++ b/netbox_utilities/__init__.py @@ -5,7 +5,7 @@ class NetBoxUtilitiesConfig(PluginConfig): name = "netbox_utilities" verbose_name = "NetBox Utilities" description = "Personal navigation, global tenant filtering, and bulk module installation" - version = "0.3.0" + version = "0.3.1" author = "LKE" base_url = "utilities" min_version = "4.6.5" diff --git a/netbox_utilities/forms.py b/netbox_utilities/forms.py index d3fa9f0..aad19a7 100644 --- a/netbox_utilities/forms.py +++ b/netbox_utilities/forms.py @@ -21,9 +21,19 @@ class BulkModuleInstallForm(forms.Form): module_bays = DynamicModelMultipleChoiceField( label="Modulschächte", queryset=ModuleBay.objects.all(), + required=False, query_params={"device_id": "$device"}, context={"disabled": "_occupied"}, - help_text="Alle ausgewählten Modulschächte erhalten ein Modul des gewählten Typs.", + help_text="Bestimmte freie Schächte auswählen. Alternativ kann die Anzahl verwendet werden.", + ) + quantity = forms.IntegerField( + label="Anzahl (1–x)", + required=False, + min_value=1, + help_text=( + "Baut die angegebene Anzahl automatisch in die ersten freien Modulschächte ein. " + "Nicht zusammen mit einer manuellen Schachtauswahl verwenden." + ), ) status = forms.ChoiceField( label="Status", @@ -56,12 +66,35 @@ class BulkModuleInstallForm(forms.Form): device = device.pk if device: module_bays = module_bays.filter(device_id=device) + self.available_module_bays = module_bays self.fields["module_bays"].queryset = module_bays def clean(self): cleaned_data = super().clean() device = cleaned_data.get("device") module_bays = cleaned_data.get("module_bays") + quantity = cleaned_data.get("quantity") + + if module_bays and quantity: + self.add_error("quantity", "Anzahl und manuelle Schachtauswahl können nicht kombiniert werden.") + elif not module_bays and not quantity and "module_bays" not in self.errors and "quantity" not in self.errors: + self.add_error(None, "Wählen Sie Modulschächte aus oder geben Sie eine Anzahl ein.") + elif quantity and device: + available_bays = self.available_module_bays + available_count = available_bays.count() + if quantity > available_count: + availability = ( + "nur ein freier Modulschacht" + if available_count == 1 + else f"nur {available_count} freie Modulschächte" + ) + self.add_error( + "quantity", + f"Für dieses Gerät sind {availability} verfügbar.", + ) + else: + cleaned_data["module_bays"] = list(available_bays[:quantity]) + if device and module_bays: invalid_bays = [ module_bay.name diff --git a/netbox_utilities/templates/netbox_utilities/bulk_module_install.html b/netbox_utilities/templates/netbox_utilities/bulk_module_install.html index 65d1ba3..0eb51ad 100644 --- a/netbox_utilities/templates/netbox_utilities/bulk_module_install.html +++ b/netbox_utilities/templates/netbox_utilities/bulk_module_install.html @@ -14,7 +14,9 @@