167 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
defmodule ConfientWeb.DepositController do
 | 
						|
  use ConfientWeb, :controller
 | 
						|
  import Phoenix.HTML
 | 
						|
 | 
						|
  def index(conn, _params) do
 | 
						|
    works = Confient.Deposit.list_works()
 | 
						|
    render(conn, "index.html", works: works)
 | 
						|
  end
 | 
						|
 | 
						|
  def form(conn, params = %{"id" => id}) do
 | 
						|
    case Confient.School.get_class(id) do
 | 
						|
      {:error, :no_class} ->
 | 
						|
        conn
 | 
						|
        |> put_flash(
 | 
						|
          :error,
 | 
						|
          "La classe demandée n'existe pas."
 | 
						|
        )
 | 
						|
        |> redirect(to: "/")
 | 
						|
 | 
						|
      {:ok, class} ->
 | 
						|
        next_assignments = Confient.Works.get_next_assignments(class)
 | 
						|
 | 
						|
        if length(next_assignments) > 0 && length(class.students) do
 | 
						|
          changeset = Confient.Student.Work.changeset(%Confient.Student.Work{}, %{})
 | 
						|
 | 
						|
          student =
 | 
						|
            with {:ok, id} <- Map.fetch(params, "student_id"),
 | 
						|
                 {val, _} <- Integer.parse(id) do
 | 
						|
              Enum.find(class.students, Enum.at(class.students, 0), &(&1.id == val))
 | 
						|
            else
 | 
						|
              :error -> Enum.at(class.students, 0)
 | 
						|
            end
 | 
						|
 | 
						|
          assignment =
 | 
						|
            with {:ok, id} <- Map.fetch(params, "assignment_id"),
 | 
						|
                 {val, _} <- Integer.parse(id) do
 | 
						|
              Enum.find(next_assignments, Enum.at(next_assignments, 0), &(&1.id == val))
 | 
						|
            else
 | 
						|
              :error -> Enum.at(next_assignments, 0)
 | 
						|
            end
 | 
						|
 | 
						|
          render(conn, "form.html",
 | 
						|
            assignment_id: assignment.id,
 | 
						|
            student_id: student.id,
 | 
						|
            changeset: changeset,
 | 
						|
            class: class,
 | 
						|
            assignments: next_assignments
 | 
						|
          )
 | 
						|
        else
 | 
						|
          conn
 | 
						|
          |> put_flash(
 | 
						|
            :info,
 | 
						|
            "Aucun devoir à rendre pour la classe #{class.name}"
 | 
						|
          )
 | 
						|
          |> redirect(to: "/")
 | 
						|
        end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def deposit(conn, %{
 | 
						|
        "id" => id,
 | 
						|
        "work" => %{"assignment_id" => assignment_id, "student_id" => student_id, "file" => work}
 | 
						|
      }) do
 | 
						|
    with {:ok, class} <- Confient.School.get_class(id),
 | 
						|
         {:ok, student} <- Confient.School.get_student(student_id),
 | 
						|
         {:ok, assignment} <- Confient.Works.get_assignment(assignment_id),
 | 
						|
         :ok <- Confient.Deposit.verify_date(assignment.due),
 | 
						|
         {:ok, ext} <- Confient.Deposit.verify_file(work) do
 | 
						|
      dir =
 | 
						|
        Confient.Deposit.get_upload_dir(class.name, assignment.slug)
 | 
						|
        |> Confient.Deposit.ensure_upload_dir()
 | 
						|
 | 
						|
      fname = Confient.Deposit.gen_filename(class.name, assignment.slug, student, ext)
 | 
						|
 | 
						|
      case File.copy(work.path, "#{dir}/#{fname}") do
 | 
						|
        {:ok, _} ->
 | 
						|
          Confient.Works.create_or_update_work(%{
 | 
						|
            path: fname,
 | 
						|
            student_id: student.id,
 | 
						|
            assignment_id: assignment.id
 | 
						|
          })
 | 
						|
 | 
						|
          conn
 | 
						|
          |> put_flash(
 | 
						|
            :info,
 | 
						|
            raw("Fichier <strong>#{work.filename}</strong> déposé avec succès<br>
 | 
						|
            Elève : #{student.lastname} #{student.firstname}<br>
 | 
						|
            Devoir : #{assignment.title}<br>
 | 
						|
            Classe : #{class.name}")
 | 
						|
          )
 | 
						|
          |> redirect(to: "/")
 | 
						|
 | 
						|
        {:error, _} ->
 | 
						|
          conn
 | 
						|
          |> put_flash(
 | 
						|
            :error,
 | 
						|
            "Erreur lors du téléversement du fichier."
 | 
						|
          )
 | 
						|
          |> redirect(
 | 
						|
            to:
 | 
						|
              Routes.deposit_path(conn, :form, id,
 | 
						|
                student_id: student.id,
 | 
						|
                assignment_id: assignment.id
 | 
						|
              )
 | 
						|
          )
 | 
						|
      end
 | 
						|
    else
 | 
						|
      {:error, :date_too_late} ->
 | 
						|
        conn
 | 
						|
        |> put_flash(
 | 
						|
          :error,
 | 
						|
          "La date de rendue pour le devoir sélectionné est dépassée."
 | 
						|
        )
 | 
						|
        |> redirect(to: Routes.deposit_path(conn, :form, id))
 | 
						|
 | 
						|
      {:error, :no_class} ->
 | 
						|
        conn
 | 
						|
        |> put_flash(
 | 
						|
          :error,
 | 
						|
          "La classe demandé n'existe pas."
 | 
						|
        )
 | 
						|
        |> redirect(to: "/")
 | 
						|
 | 
						|
      {:error, :no_student} ->
 | 
						|
        conn
 | 
						|
        |> put_flash(
 | 
						|
          :error,
 | 
						|
          "L'étudiant demandé n'existe pas."
 | 
						|
        )
 | 
						|
        |> redirect(to: "/")
 | 
						|
 | 
						|
      {:error, :no_assignment} ->
 | 
						|
        conn
 | 
						|
        |> put_flash(
 | 
						|
          :error,
 | 
						|
          "Le devoir demandé n'existe pas."
 | 
						|
        )
 | 
						|
        |> redirect(to: "/")
 | 
						|
 | 
						|
      {:error, :invalid_file_type} ->
 | 
						|
        {:ok, student} = Confient.School.get_student(student_id)
 | 
						|
        {:ok, assignment} = Confient.Works.get_assignment(assignment_id)
 | 
						|
 | 
						|
        conn
 | 
						|
        |> put_flash(
 | 
						|
          :error,
 | 
						|
          raw("Format de fichier invalide pour le fichier <strong>#{work.filename}</strong><br>
 | 
						|
            Elève : #{student.lastname} #{student.firstname}<br>
 | 
						|
            Devoir : #{assignment.title}")
 | 
						|
        )
 | 
						|
        |> redirect(
 | 
						|
          to:
 | 
						|
            Routes.deposit_path(conn, :form, id,
 | 
						|
              student_id: student.id,
 | 
						|
              assignment_id: assignment.id
 | 
						|
            )
 | 
						|
        )
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def deposit(conn, %{"id" => id}),
 | 
						|
    do:
 | 
						|
      conn
 | 
						|
      |> put_flash(:error, "Aucun fichier spécifié")
 | 
						|
      |> redirect(to: Routes.deposit_path(conn, :form, id))
 | 
						|
end
 |