Files
Claper/lib/claper/quizzes/quiz.ex
2025-11-20 10:44:06 +01:00

69 lines
1.9 KiB
Elixir

defmodule Claper.Quizzes.Quiz do
use Ecto.Schema
import Ecto.Changeset
@type t :: %__MODULE__{
id: integer(),
title: String.t(),
position: integer() | nil,
enabled: boolean(),
show_results: boolean(),
allow_anonymous: boolean(),
lti_line_item_url: String.t() | nil,
lti_resource: Lti13.Resources.Resource.t() | nil,
quiz_responses: [Claper.Quizzes.QuizResponse.t()] | nil,
quiz_questions: [Claper.Quizzes.QuizQuestion.t()] | nil,
presentation_file: Claper.Presentations.PresentationFile.t(),
inserted_at: NaiveDateTime.t(),
updated_at: NaiveDateTime.t()
}
schema "quizzes" do
field :title, :string
field :position, :integer, default: 0
field :enabled, :boolean, default: false
field :show_results, :boolean, default: true
field :allow_anonymous, :boolean, default: false
field :lti_line_item_url, :string
belongs_to :presentation_file, Claper.Presentations.PresentationFile
belongs_to :lti_resource, Lti13.Resources.Resource
has_many :quiz_questions, Claper.Quizzes.QuizQuestion,
preload_order: [asc: :id],
on_replace: :delete
has_many :quiz_responses, Claper.Quizzes.QuizResponse
timestamps()
end
@doc false
def changeset(quiz, attrs) do
quiz
|> cast(attrs, [
:title,
:position,
:presentation_file_id,
:enabled,
:show_results,
:allow_anonymous,
:lti_resource_id,
:lti_line_item_url
])
|> validate_required([:title, :position, :presentation_file_id])
|> cast_assoc(:quiz_questions,
required: true,
with: &Claper.Quizzes.QuizQuestion.changeset/2,
sort_param: :quiz_questions_order,
drop_param: :quiz_questions_delete
)
end
def update_line_item_changeset(quiz, attrs) do
quiz
|> cast(attrs, [:lti_line_item_url])
|> validate_required([:lti_line_item_url])
end
end