All checks were successful
continuous-integration/drone/push Build is passing
125 lines
4.0 KiB
Elixir
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(:confient, :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
|