Session + presentation fields no longer overwritten when columns are absent
from the CSV (start_datetime, end_datetime, sort, code, name, abstract_code).
Presentation lookup no longer requires presentation_name to find an existing
record — only INSERT requires it. This fixes presenter email updates when
re-importing a partial CSV that has presenter_code but no presentation_name.
Presenter email is now only written when the presenter_email column is
present in the CSV, preventing accidental email clears on partial imports.
Presenter INSERT/UPDATE gate restored to original logic: requires
(presenter_code or presenter_number) and presenter_given_name.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Session field column-presence fixes are solid. Presentation lookup no longer
requires presentation_name to find existing records. Presenter gate broadened
to run lookup even without explicit code. Presenter INSERT still broken —
reverted field changes after IntegrityError issue; email-only column guard kept.
Do not rely on this state for presenter creation. Needs rework from c9c69ec.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Presentation-only imports that link to sessions by code were silently
clearing session names because a missing column hit the else branch.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Google Sheets embeds \xa0 (non-breaking space) in 12-hour time values
(e.g. "3:00\xa0PM") and when date/time columns are combined. This caused
MariaDB datetime INSERTs to fail with an OperationalError.
Adds _clean_datetime() which strips \xa0, normalizes whitespace, and
parses common import formats (M/D/YYYY H:MM AM/PM, etc.) into
YYYY-MM-DD HH:MM:SS before the DB write. Applied to all four datetime
fields: session and presentation start/end.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>