From e8391dbf1e71cc5c2fb333b1b30bdb0df4652027 Mon Sep 17 00:00:00 2001 From: AIIrondev Date: Tue, 4 Aug 2026 21:50:17 +0200 Subject: [PATCH] fix of the json upload format --- Web/app.py | 45 ++++++++++++++++++--------------- Web/templates/upload_batch.html | 15 +++++++++-- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/Web/app.py b/Web/app.py index c3ade09..a2d8a51 100755 --- a/Web/app.py +++ b/Web/app.py @@ -11850,37 +11850,40 @@ def test_push_notification(): return jsonify({'success': False}), 500 -@app.route('/batch_upload', methods=['GET']) -def batch_upload_page(): - """ - Serves the HTML frontend for the batch CSV and image upload. - """ - # Check permissions if necessary, similar to your other routes - if 'username' not in session: - flash('Bitte melden Sie sich an.', 'error') - return redirect(url_for('login')) - - return render_template('upload_batch.html') - def clean_db_field(val): - """Bereinigt Werte, die fälschlicherweise als String-Listen aus der CSV kommen.""" + """Bereinigt Werte, die fälschlicherweise als String-Listen oder mit Klammern aus der CSV kommen.""" + import ast import pandas as pd + if not val or pd.isna(val): return None val_str = str(val).strip() - # Erkennt und entpackt String-Listen wie "['100465']" oder '["100465"]' - if (val_str.startswith("['") and val_str.endswith("']")) or (val_str.startswith('["') and val_str.endswith('"]')): - inner = val_str[2:-2].strip() - return inner if inner and inner != "''" and inner != '""' else None + # Wenn es wie eine Liste aussieht (z.B. "['100177']" oder "['']") + if val_str.startswith("[") and val_str.endswith("]"): + try: + parsed = ast.literal_eval(val_str) + if isinstance(parsed, list): + # Nimm das erste Element der Liste, wenn vorhanden + for item in parsed: + cleaned_item = str(item).strip() + if cleaned_item and cleaned_item not in ("", "''", '""', "None", "nan"): + return cleaned_item + return None + except Exception: + # Fallback bei Syntaxfehlern + inner = val_str[1:-1].strip().replace("'", "").replace('"', '') + return inner if inner and inner not in ("''", '""') else None - if val_str in ("[]", "['']", '[""]', "nan", "None"): + if val_str in ("[]", "['']", '[""]', "nan", "None", "''", '""'): return None return val_str + + @app.route('/upload_csv_batch', methods=['POST']) def upload_csv_batch(): """ @@ -12064,8 +12067,10 @@ def upload_csv_batch(): reservierbar = bool(row.get('Reservierbar', False)) - # Code_4 Behandlung - row_code = clean_db_field(row.get('Code_4', '')) + # Code_4 / Barcode sauber extrahieren und bereinigen + raw_code = row.get('Code_4') or row.get('Barcode') or '' + row_code = clean_db_field(raw_code) + if row_code: unique_code = row_code elif item_count > 1: diff --git a/Web/templates/upload_batch.html b/Web/templates/upload_batch.html index 7e9a813..ae9d119 100644 --- a/Web/templates/upload_batch.html +++ b/Web/templates/upload_batch.html @@ -221,6 +221,7 @@ document.getElementById('batchUploadForm').addEventListener('submit', async func log(`Batch ${b + 1}: ${batchRows.length} Items & ${requiredImagesForBatch.size} zugehörige Bilder.`); + // Request absenden const response = await fetch('/upload_csv_batch', { method: 'POST', body: formData, @@ -229,13 +230,23 @@ document.getElementById('batchUploadForm').addEventListener('submit', async func } }); - const result = await response.json(); + // 1. Antwort als rohen Text auslesen (verhindert den JSON.parse Crash) + const responseText = await response.text(); + let result; + + try { + result = JSON.parse(responseText); + } catch (parseErr) { + // Wenn der Server kein JSON schickt (z.B. Python 500 Error als HTML-Seite) + console.error("Server-Antwort war kein JSON:", responseText); + throw new Error(`Server-Fehler (Status ${response.status}). Der Server hat ein HTML-Dokument statt JSON zurückgegeben. Prüfe die Flask-Konsole!`); + } if (!response.ok || !result.success) { throw new Error(result.message || `Server-Fehler ${response.status}`); } - log(`Batch ${b + 1} abgeschlossen.`); + log(`Batch ${b + 1} abgeschlossen: ${result.message}`); progressBar.value = b + 1; }