From 5acb5e304de3f0d0bc316b468e5978cc07747a95 Mon Sep 17 00:00:00 2001 From: Moritz Date: Sun, 25 Jan 2026 18:33:27 +0100 Subject: [PATCH] Fix CSV upload file reading Handle consume_uploaded_entries returning [content] directly instead of [{:ok, content}]. Add locale support for translations in background tasks. --- lib/mv_web/live/global_settings_live.ex | 32 +++++++++++++++++++------ 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/lib/mv_web/live/global_settings_live.ex b/lib/mv_web/live/global_settings_live.ex index d133c5a..0238cf0 100644 --- a/lib/mv_web/live/global_settings_live.ex +++ b/lib/mv_web/live/global_settings_live.ex @@ -59,9 +59,13 @@ defmodule MvWeb.GlobalSettingsLive do @max_errors 50 @impl true - def mount(_params, _session, socket) do + def mount(_params, session, socket) do {:ok, settings} = Membership.get_settings() + # Get locale from session for translations + locale = session["locale"] || "de" + Gettext.put_locale(MvWeb.Gettext, locale) + socket = socket |> assign(:page_title, gettext("Settings")) @@ -70,6 +74,7 @@ defmodule MvWeb.GlobalSettingsLive do |> assign(:import_state, nil) |> assign(:import_progress, nil) |> assign(:import_status, :idle) + |> assign(:locale, locale) |> assign_form() # Configure file upload with auto-upload enabled # Files are uploaded automatically when selected, no need for manual trigger @@ -586,6 +591,10 @@ defmodule MvWeb.GlobalSettingsLive do actor: actor ] + # Get locale from socket for translations in background tasks + locale = socket.assigns[:locale] || "de" + Gettext.put_locale(MvWeb.Gettext, locale) + if Config.sql_sandbox?() do # Run synchronously in tests to avoid Ecto Sandbox issues with async tasks {:ok, chunk_result} = @@ -604,6 +613,9 @@ defmodule MvWeb.GlobalSettingsLive do # Use start_child for fire-and-forget: no monitor, no Task messages # We only use our own send/2 messages for communication Task.Supervisor.start_child(Mv.TaskSupervisor, fn -> + # Set locale in task process for translations + Gettext.put_locale(MvWeb.Gettext, locale) + {:ok, chunk_result} = MemberCSV.process_chunk( chunk, @@ -674,13 +686,19 @@ defmodule MvWeb.GlobalSettingsLive do end defp consume_and_read_csv(socket) do - consume_uploaded_entries(socket, :csv_file, fn %{path: path}, _entry -> - case File.read(path) do - {:ok, content} -> {:ok, content} - {:error, reason} -> {:error, Exception.message(reason)} - end - end) + result = + consume_uploaded_entries(socket, :csv_file, fn %{path: path}, _entry -> + case File.read(path) do + {:ok, content} -> {:ok, content} + {:error, reason} -> {:error, Exception.message(reason)} + end + end) + + result |> case do + [content] when is_binary(content) -> + {:ok, content} + [{:ok, content}] when is_binary(content) -> {:ok, content}