From 7a5d3b75eb289052b2b7d391e5b1a1c34fd2f6f3 Mon Sep 17 00:00:00 2001 From: bes-r <27369668+bes-r@users.noreply.github.com> Date: Sun, 21 Jun 2026 14:31:13 +0200 Subject: [PATCH] huisstijl: leesbare uploadfouten + expliciete multipart-parser --- backend/modules/huisstijl/views.py | 26 +++++++++++++++++--------- frontend/src/api.js | 3 ++- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/backend/modules/huisstijl/views.py b/backend/modules/huisstijl/views.py index cfce0a8..0330bb1 100644 --- a/backend/modules/huisstijl/views.py +++ b/backend/modules/huisstijl/views.py @@ -5,7 +5,8 @@ PUT /api/huisstijl/ -> upload logo (alleen beheerders); voert een kwaliteitscheck uit en geeft waarschuwingen terug. DELETE /api/huisstijl/ -> logo verwijderen (alleen beheerders). """ -from rest_framework.decorators import api_view +from rest_framework.decorators import api_view, parser_classes +from rest_framework.parsers import FormParser, JSONParser, MultiPartParser from rest_framework.response import Response from .models import Huisstijl @@ -95,11 +96,12 @@ def analyseer_logo(f): @api_view(["GET", "PUT", "POST", "DELETE"]) +@parser_classes([MultiPartParser, FormParser, JSONParser]) def huisstijl(request): obj = Huisstijl.actueel() schrijven = request.method in ("PUT", "POST", "DELETE") - if schrijven and not (request.user and request.user.is_staff): - return Response({"detail": "Alleen beheerders kunnen het logo wijzigen."}, status=403) + if schrijven and not (request.user and request.user.is_authenticated and request.user.is_staff): + return Response({"detail": "Alleen beheerders (is_staff) kunnen het logo wijzigen. Vraag een beheerder om het logo in te stellen."}, status=403) if request.method == "DELETE": if obj.logo: @@ -110,14 +112,20 @@ def huisstijl(request): f = request.FILES.get("logo") if not f: return Response({"detail": "Geen bestand ontvangen (veld 'logo')."}, status=400) - analyse = analyseer_logo(f) + try: + analyse = analyseer_logo(f) + except Exception as e: # noqa: BLE001 — geef een leesbare reden i.p.v. 500. + return Response({"detail": f"Kon de afbeelding niet verwerken: {e}"}, status=400) if not analyse["ok"]: return Response({"detail": " ".join(analyse["fouten"]), "kwaliteit": analyse}, status=400) - f.seek(0) - if obj.logo: - obj.logo.delete(save=False) - obj.logo = f - obj.save() + try: + f.seek(0) + if obj.logo: + obj.logo.delete(save=False) + obj.logo = f + obj.save() + except Exception as e: # noqa: BLE001 + return Response({"detail": f"Opslaan van het logo mislukte: {e}"}, status=400) data = HuisstijlSerializer(obj, context={"request": request}).data data["kwaliteit"] = analyse return Response(data) diff --git a/frontend/src/api.js b/frontend/src/api.js index b9f4d70..f1b5404 100644 --- a/frontend/src/api.js +++ b/frontend/src/api.js @@ -59,7 +59,8 @@ export async function uploadLogo(file) { let data = null; try { data = await res.json(); } catch { data = null; } if (!res.ok) { - const err = new Error((data && (data.detail || JSON.stringify(data))) || "Upload mislukt"); + const reden = (data && (data.detail || JSON.stringify(data))) || `Upload mislukt (HTTP ${res.status} ${res.statusText || ""})`.trim(); + const err = new Error(reden); err.status = res.status; err.data = data; throw err;