Files
confient/lib/confient_web/controllers/assignment_controller.ex
Wilfried OLLIVIER 69ba0245bb
All checks were successful
continuous-integration/drone/push Build is passing
Fix: upload dir
2020-12-13 15:46:29 +01:00

125 lines
4.0 KiB
Elixir

defmodule ConfientWeb.AssignmentController do
use ConfientWeb, :controller
require Logger
import Phoenix.HTML
alias Confient.Works
alias Confient.Works.Assignment
def index(conn, _params) do
assignments = Works.list_assignments()
render(conn, "index.html", assignments: assignments)
end
def new(conn, _params) do
changeset = Works.change_assignment(%Assignment{})
classes = Confient.School.list_classes() |> Enum.map(&{&1.name, &1.id})
render(conn, "new.html", changeset: changeset, classes: classes)
end
def create(conn, %{"assignment" => assignment_params}) do
IO.inspect(assignment_params)
case Works.create_assignment(assignment_params) do
{:ok, assignment} ->
conn
|> put_flash(:info, "Devoir créé avec succès.")
|> redirect(to: Routes.assignment_path(conn, :show, assignment))
{:error, %Ecto.Changeset{} = changeset} ->
classes = Confient.School.list_classes() |> Enum.map(&{&1.name, &1.id})
render(conn, "new.html", changeset: changeset, classes: classes)
end
end
def show(conn, %{"id" => id}) do
assignment = Works.get_full_assignment!(id)
missing = Works.get_missing_works_from_student_in_assignement(id, assignment.class_id)
render(conn, "show.html", assignment: assignment, missing: missing)
end
def edit(conn, %{"id" => id}) do
classes = Confient.School.list_classes() |> Enum.map(&{&1.name, &1.id})
assignment = Works.get_assignment!(id)
changeset = Works.change_assignment(assignment)
render(conn, "edit.html", assignment: assignment, changeset: changeset, classes: classes)
end
def update(conn, %{"id" => id, "assignment" => assignment_params}) do
assignment = Works.get_assignment!(id)
case Works.update_assignment(assignment, assignment_params) do
{:ok, assignment} ->
conn
|> put_flash(:info, "Devoir mis à jour avec succès.")
|> redirect(to: Routes.assignment_path(conn, :show, assignment))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", assignment: assignment, changeset: changeset)
end
end
def delete(conn, %{"id" => id}) do
assignment = Works.get_assignment!(id)
{:ok, _assignment} = Works.delete_assignment(assignment)
File.rm_rf(Confient.Deposit.get_upload_dir(assignment.class.name, assignment.slug))
conn
|> put_flash(:info, "Devoir supprimé avec succès.")
|> redirect(to: Routes.assignment_path(conn, :index))
end
def archive(conn, %{"id" => assignment_id}) do
case Works.get_full_assignment!(assignment_id) do
nil ->
conn |> put_flash(:error, "Devoir inexistant") |> redirect(to: "/")
assignment ->
base = Application.get_env(:confiant, :upload_dir)
files =
Enum.map(assignment.students_works, fn v -> v.path end)
|> Enum.map(&String.to_charlist/1)
archive_name = "#{assignment.class.name}_#{assignment.slug}.zip"
archive_sub = "#{assignment.class.name}/#{assignment.slug}"
archive_path = "#{base}/#{archive_sub}/#{archive_name}"
case :zip.create(
String.to_charlist(archive_path),
files,
[{:cwd, "#{base}/#{archive_sub}"}]
) do
{:ok, _fname} ->
conn
|> put_flash(
:info,
raw(
"Archive créé est disponible <a href=#{
Path.join([
Application.fetch_env!(:confient, :domain),
"uploads",
assignment.class.name,
assignment.slug,
archive_name
])
}>#{archive_name}</href>"
)
)
|> redirect(to: Routes.assignment_path(conn, :show, assignment))
{:error, reason} ->
Logger.error(reason)
conn
|> put_flash(:error, "Error lors de la création de l'archive")
|> redirect(to: Routes.assignment_path(conn, :show, assignment))
end
end
end
end