feat: gemeinsamen ZIP-Export und -Import hinzufügen

This commit is contained in:
2026-07-22 12:35:59 +02:00
parent e0c2c0bbc9
commit c586e9fdaa
9 changed files with 347 additions and 4 deletions
+60 -1
View File
@@ -4,6 +4,7 @@ import tinymce
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.core.exceptions import PermissionDenied
from django.db import transaction
from django.http import FileResponse, Http404, JsonResponse
from django.shortcuts import get_object_or_404, redirect, render
@@ -11,7 +12,11 @@ from django.utils.text import slugify
from django.views import View
from netbox.views import generic
from .filtersets import DocumentFilterSet, AssignmentFilterSet, DocumentCategoryFilterSet
from .forms import DocumentForm, AssignmentForm, ImportForm, DocumentCategoryForm
from .forms import (
ArchiveExportForm, ArchiveImportForm, AssignmentForm, DocumentCategoryForm,
DocumentForm, ImportForm,
)
from .archive import ArchiveFailure, export_documents, import_archive
from .importers import ImportFailure, import_document
from .models import Document, DocumentAssignment, DocumentAttachment, DocumentCategory
from .tables import DocumentTable, AssignmentTable, DocumentCategoryTable
@@ -160,3 +165,57 @@ class DocumentMediaUploadView(PermissionRequiredMixin, View):
content_type=upload.content_type or "", size=upload.size,
)
return JsonResponse({"location": attachment.file.url})
class DocumentArchiveView(View):
template_name = "netbox_documentation/document_archive.html"
def _render(self, request, export_form=None, import_form=None):
return render(request, self.template_name, {
"export_form": export_form or ArchiveExportForm(user=request.user),
"import_form": import_form or ArchiveImportForm(),
})
def get(self, request):
if not request.user.has_perm("netbox_documentation.view_document"):
raise PermissionDenied
return self._render(request)
def post(self, request):
action = request.POST.get("action")
if action == "export":
if not request.user.has_perm("netbox_documentation.view_document"):
raise PermissionDenied
form = ArchiveExportForm(request.POST, user=request.user)
if not form.is_valid():
return self._render(request, export_form=form)
stream = export_documents(form.cleaned_data["documents"])
response = FileResponse(stream, content_type="application/zip")
response["Content-Disposition"] = 'attachment; filename="netbox-documentation-export.zip"'
return response
if action == "import":
required = (
"netbox_documentation.import_document",
"netbox_documentation.add_document",
"netbox_documentation.change_document",
"netbox_documentation.add_documentassignment",
"netbox_documentation.add_documentattachment",
"netbox_documentation.add_documentcategory",
)
if not all(request.user.has_perm(permission) for permission in required):
raise PermissionDenied
form = ArchiveImportForm(request.POST, request.FILES)
if not form.is_valid():
return self._render(request, import_form=form)
try:
result = import_archive(form.cleaned_data["archive"], form.cleaned_data["update_existing"])
except ArchiveFailure as exc:
form.add_error("archive", str(exc))
return self._render(request, import_form=form)
messages.success(request, (
f"Archiv importiert: {result['created']} erstellt, {result['updated']} aktualisiert."
))
if result["skipped_assignments"]:
messages.warning(request, f"{result['skipped_assignments']} nicht verfügbare Objektzuordnungen wurden übersprungen.")
return redirect("plugins:netbox_documentation:document_list")
return self._render(request)