Update web/core/views.py
This commit is contained in:
+39
-11
@@ -342,32 +342,60 @@ def import_wizard(request):
|
||||
"Date",
|
||||
"Date Edited",
|
||||
])
|
||||
if request.method == "POST":
|
||||
if request.method == "POST":
|
||||
form = ImportForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
try:
|
||||
raw = form.cleaned_data["file"].read()
|
||||
|
||||
# --- header check (tolerant: utf-8-sig removes BOM, strip spaces, case-insensitive) ---
|
||||
# --- super‑defensive header peek (never raises) ---
|
||||
import io, csv as _csv
|
||||
sio = io.StringIO(raw.decode("utf-8-sig", errors="replace"))
|
||||
|
||||
header_ok = False
|
||||
try:
|
||||
rdr = _csv.reader(sio)
|
||||
first_row = next(rdr, [])
|
||||
norm = [c.strip().lower() for c in first_row]
|
||||
expected_norm = [c.lower() for c in _EXPECTED_HEADERS]
|
||||
|
||||
# If the first row doesn’t look like our header, allow import to proceed,
|
||||
# but show a gentle warning in the result page.
|
||||
def _clean(s):
|
||||
s = "" if s is None else str(s)
|
||||
# strip quotes and odd prefixes like r:"Talk Title"
|
||||
s = s.strip().strip("'").strip('"')
|
||||
if s.lower().startswith("r:"):
|
||||
s = s[2:].lstrip()
|
||||
return s.strip().lower()
|
||||
|
||||
norm = [_clean(c) for c in first_row]
|
||||
|
||||
# Pull expected headers from globals if defined, else use defaults
|
||||
expected = (
|
||||
globals().get("_EXPECTED_HEADERS")
|
||||
or globals().get("EXPECTED_HEADERS")
|
||||
or [
|
||||
"Subject", "Illustration", "Application", "Scripture", "Source",
|
||||
"Talk Title", "Talk Number", "Code", "Date", "Date Edited",
|
||||
]
|
||||
)
|
||||
expected_norm = [h.strip().lower() for h in expected]
|
||||
header_ok = (norm == expected_norm)
|
||||
except Exception:
|
||||
header_ok = False
|
||||
finally:
|
||||
# Rewind so the real importer reads the full file
|
||||
sio.seek(0)
|
||||
|
||||
# Make sure the utils module also knows the expected headers
|
||||
from . import utils as core_utils
|
||||
if not hasattr(core_utils, "EXPECTED_HEADERS"):
|
||||
core_utils.EXPECTED_HEADERS = _EXPECTED_HEADERS
|
||||
# hand off to your existing robust importer
|
||||
core_utils.EXPECTED_HEADERS = expected
|
||||
|
||||
# Hand off to your robust importer
|
||||
report = import_csv_bytes(
|
||||
raw,
|
||||
dry_run=form.cleaned_data["dry_run"],
|
||||
)
|
||||
|
||||
# attach header check info (if your template shows report dicts)
|
||||
# Attach header check info for the result template
|
||||
report = report or {}
|
||||
report["header_ok"] = header_ok
|
||||
if not header_ok:
|
||||
@@ -383,9 +411,9 @@ def import_wizard(request):
|
||||
)
|
||||
except Exception as e:
|
||||
messages.error(request, f"Import failed: {e}")
|
||||
else:
|
||||
else:
|
||||
form = ImportForm()
|
||||
return render(request, "import_wizard.html", {"form": form})
|
||||
return render(request, "import_wizard.html", {"form": form})
|
||||
|
||||
|
||||
@login_required
|
||||
|
||||
Reference in New Issue
Block a user