CSV export implemented, a few other fixes
This commit is contained in:
parent
3a6e3e8eed
commit
56b72f8038
10 changed files with 245 additions and 21 deletions
lib/shift73k_web/controllers
94
lib/shift73k_web/controllers/user_shifts_csv_controller.ex
Normal file
94
lib/shift73k_web/controllers/user_shifts_csv_controller.ex
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
defmodule Shift73kWeb.UserShiftsCsvController do
|
||||
use Shift73kWeb, :controller
|
||||
|
||||
alias Shift73k.Shifts
|
||||
alias Shift73k.Shifts.Shift
|
||||
|
||||
def new(conn, _params) do
|
||||
render(conn, "new.html", error_message: nil)
|
||||
end
|
||||
|
||||
def export(conn, %{"csv_export" => request_params}) do
|
||||
IO.inspect(request_params, label: "csv request params :")
|
||||
|
||||
case Map.get(request_params, "user_id") == conn.assigns.current_user.id do
|
||||
true ->
|
||||
export_csv(conn, request_params)
|
||||
|
||||
false ->
|
||||
conn
|
||||
|> put_flash(:danger, "Unauthorized CSV export request")
|
||||
|> redirect(to: "/")
|
||||
|> halt()
|
||||
end
|
||||
end
|
||||
|
||||
defp export_csv(conn, %{"date_min" => date_min, "date_max" => date_max}) do
|
||||
date_range = Date.range(Date.from_iso8601!(date_min), Date.from_iso8601!(date_max))
|
||||
csv_content = build_csv_content(conn.assigns.current_user.id, date_range)
|
||||
filename_dt = DateTime.utc_now() |> Calendar.strftime("%Y%m%dT%H%M%S")
|
||||
filename = "#{conn.assigns.current_user.id}_#{filename_dt}.csv"
|
||||
|
||||
conn
|
||||
|> put_resp_content_type("text/csv")
|
||||
|> put_resp_header("content-disposition", "attachment; filename=\"#{filename}\"")
|
||||
|> send_resp(200, csv_content)
|
||||
end
|
||||
|
||||
def build_csv_content(user_id, date_range) do
|
||||
[csv_headers() | csv_data(user_id, date_range)]
|
||||
|> NimbleCSV.RFC4180.dump_to_iodata()
|
||||
|> to_string()
|
||||
|> IO.inspect()
|
||||
end
|
||||
|
||||
def csv_data(user_id, date_range) do
|
||||
user_id
|
||||
|> Shifts.list_shifts_by_user_in_date_range(date_range)
|
||||
|> Enum.map(&csv_shift_row/1)
|
||||
end
|
||||
|
||||
def csv_headers do
|
||||
[
|
||||
"Subject",
|
||||
"Start Date",
|
||||
"Start Time",
|
||||
"End Date",
|
||||
"End Time",
|
||||
"All Day Event",
|
||||
"Description",
|
||||
"Location",
|
||||
"Private"
|
||||
]
|
||||
end
|
||||
|
||||
defp csv_shift_row(%Shift{} = s) do
|
||||
dt_start = DateTime.new!(s.date, s.time_start, s.time_zone)
|
||||
shift_length_s = Shifts.shift_length(s) * 60
|
||||
dt_end = DateTime.add(dt_start, shift_length_s)
|
||||
|
||||
[
|
||||
s.subject,
|
||||
csv_date_string(dt_start),
|
||||
csv_time_string(dt_start),
|
||||
csv_date_string(dt_end),
|
||||
csv_time_string(dt_end),
|
||||
false,
|
||||
s.description,
|
||||
s.location,
|
||||
false
|
||||
]
|
||||
end
|
||||
|
||||
defp csv_date_string(%DateTime{} = dt) do
|
||||
dt
|
||||
|> DateTime.to_date()
|
||||
|> Calendar.strftime("%m/%d/%Y")
|
||||
end
|
||||
|
||||
defp csv_time_string(%DateTime{} = dt) do
|
||||
dt
|
||||
|> DateTime.to_time()
|
||||
|> Calendar.strftime("%-I:%M %p")
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue