Files

70 lines
2.7 KiB
Python

from dcim.models import Location, Region, Site
from django import forms
from tenancy.models import Tenant, TenantGroup
class ExportForm(forms.Form):
scope_type = forms.ChoiceField(
label="Exportbereich",
choices=(
("tenant_group", "Mandantengruppe"),
("tenant", "Mandant"),
("region", "Region"),
("site", "Standort"),
("location", "Lokation"),
),
)
tenant_group = forms.ModelChoiceField(
label="Mandantengruppe", queryset=TenantGroup.objects.all(), required=False
)
tenant = forms.ModelChoiceField(label="Mandant", queryset=Tenant.objects.all(), required=False)
region = forms.ModelChoiceField(label="Region", queryset=Region.objects.all(), required=False)
site = forms.ModelChoiceField(label="Standort", queryset=Site.objects.all(), required=False)
location = forms.ModelChoiceField(label="Lokation", queryset=Location.objects.all(), required=False)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["tenant"].label_from_instance = lambda obj: f"{obj.group or '-'} / {obj}"
self.fields["location"].label_from_instance = lambda obj: f"{obj.site} / {obj}"
def clean(self):
cleaned = super().clean()
scope_type = cleaned.get("scope_type")
selected = cleaned.get(scope_type) if scope_type else None
if scope_type and selected is None:
self.add_error(scope_type, "Bitte ein Objekt für den Exportbereich auswählen.")
cleaned["scope_object"] = selected
return cleaned
class ImportForm(forms.Form):
archive = forms.FileField(
label="NetBox-Export-Archiv",
widget=forms.ClearableFileInput(attrs={"accept": ".zip,application/zip"}),
)
conflict_strategy = forms.ChoiceField(
label="Vorhandene Objekte",
choices=(
("update", "Aktualisieren"),
("skip", "Überspringen"),
("fail", "Import abbrechen"),
),
initial="update",
)
dry_run = forms.BooleanField(
label="Nur prüfen (keine Änderungen)",
required=False,
initial=True,
help_text="Führt den vollständigen Import aus und setzt die Datenbanktransaktion anschließend zurück.",
)
confirm_apply = forms.BooleanField(
label="Ich bestätige den schreibenden Import",
required=False,
)
def clean(self):
cleaned = super().clean()
if not cleaned.get("dry_run") and not cleaned.get("confirm_apply"):
self.add_error("confirm_apply", "Für einen schreibenden Import ist die Bestätigung erforderlich.")
return cleaned