fix of the json upload format
This commit is contained in:
+25
-20
@@ -11850,37 +11850,40 @@ def test_push_notification():
|
|||||||
return jsonify({'success': False}), 500
|
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):
|
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
|
import pandas as pd
|
||||||
|
|
||||||
if not val or pd.isna(val):
|
if not val or pd.isna(val):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
val_str = str(val).strip()
|
val_str = str(val).strip()
|
||||||
|
|
||||||
# Erkennt und entpackt String-Listen wie "['100465']" oder '["100465"]'
|
# Wenn es wie eine Liste aussieht (z.B. "['100177']" oder "['']")
|
||||||
if (val_str.startswith("['") and val_str.endswith("']")) or (val_str.startswith('["') and val_str.endswith('"]')):
|
if val_str.startswith("[") and val_str.endswith("]"):
|
||||||
inner = val_str[2:-2].strip()
|
try:
|
||||||
return inner if inner and inner != "''" and inner != '""' else None
|
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 None
|
||||||
|
|
||||||
return val_str
|
return val_str
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@app.route('/upload_csv_batch', methods=['POST'])
|
@app.route('/upload_csv_batch', methods=['POST'])
|
||||||
def upload_csv_batch():
|
def upload_csv_batch():
|
||||||
"""
|
"""
|
||||||
@@ -12064,8 +12067,10 @@ def upload_csv_batch():
|
|||||||
|
|
||||||
reservierbar = bool(row.get('Reservierbar', False))
|
reservierbar = bool(row.get('Reservierbar', False))
|
||||||
|
|
||||||
# Code_4 Behandlung
|
# Code_4 / Barcode sauber extrahieren und bereinigen
|
||||||
row_code = clean_db_field(row.get('Code_4', ''))
|
raw_code = row.get('Code_4') or row.get('Barcode') or ''
|
||||||
|
row_code = clean_db_field(raw_code)
|
||||||
|
|
||||||
if row_code:
|
if row_code:
|
||||||
unique_code = row_code
|
unique_code = row_code
|
||||||
elif item_count > 1:
|
elif item_count > 1:
|
||||||
|
|||||||
@@ -221,6 +221,7 @@ document.getElementById('batchUploadForm').addEventListener('submit', async func
|
|||||||
|
|
||||||
log(`Batch ${b + 1}: ${batchRows.length} Items & ${requiredImagesForBatch.size} zugehörige Bilder.`);
|
log(`Batch ${b + 1}: ${batchRows.length} Items & ${requiredImagesForBatch.size} zugehörige Bilder.`);
|
||||||
|
|
||||||
|
// Request absenden
|
||||||
const response = await fetch('/upload_csv_batch', {
|
const response = await fetch('/upload_csv_batch', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: formData,
|
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) {
|
if (!response.ok || !result.success) {
|
||||||
throw new Error(result.message || `Server-Fehler ${response.status}`);
|
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;
|
progressBar.value = b + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user