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 #{archive_name}" ) ) |> 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