70 lines
2.7 KiB
Python
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
|