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
 |