Skip to content

Commit

Permalink
[ENHANCEMENT] [MER-3181] Allow progress to be set from client (Simon-…
Browse files Browse the repository at this point in the history
…Initiative#4756)

* set progress complete

* allow progress to be set from client side

* test failure case, cleanup

* Auto format

---------

Co-authored-by: darrensiegel <[email protected]>
  • Loading branch information
darrensiegel and darrensiegel committed Apr 18, 2024
1 parent d3d558d commit b7983c9
Show file tree
Hide file tree
Showing 5 changed files with 181 additions and 1 deletion.
11 changes: 11 additions & 0 deletions lib/oli/delivery/attempts/core.ex
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,17 @@ defmodule Oli.Delivery.Attempts.Core do
)
end

def get_resource_access_from_guid(resource_attempt_guid) do
Repo.one(
from(a in ResourceAccess,
left_join: ra in ResourceAttempt,
on: a.id == ra.resource_access_id,
where: ra.attempt_guid == ^resource_attempt_guid,
select: a
)
)
end

@doc """
For a given project id, this retrieves part attempts and user information, for those part attempts
that are evaluated and that have snapshots defined. This is a key query for powering analytics
Expand Down
1 change: 0 additions & 1 deletion lib/oli/delivery/attempts/page_lifecycle/ungraded.ex
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ defmodule Oli.Delivery.Attempts.PageLifecycle.Ungraded do
}) do
now = DateTime.utc_now()

# mark resource attempt as evaluated
update_resource_attempt(resource_attempt, %{
date_evaluated: now,
date_submitted: now,
Expand Down
7 changes: 7 additions & 0 deletions lib/oli/delivery/metrics.ex
Original file line number Diff line number Diff line change
Expand Up @@ -1166,6 +1166,13 @@ defmodule Oli.Delivery.Metrics do
@doc """
Updates page progress to be 100% complete.
"""
def mark_progress_completed(resource_attempt_guid) when is_binary(resource_attempt_guid) do
case Core.get_resource_access_from_guid(resource_attempt_guid) do
nil -> {:error, :resource_access_not_found}
ra -> mark_progress_completed(ra)
end
end

def mark_progress_completed(%ResourceAccess{} = ra) do
Core.update_resource_access(ra, %{progress: 1.0})
end
Expand Down
20 changes: 20 additions & 0 deletions lib/oli_web/controllers/api/page_lifecycle_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,26 @@ defmodule OliWeb.Api.PageLifecycleController do
end
end

def transition(conn, %{
"action" => "mark_completed",
"attempt_guid" => attempt_guid
}) do
case Oli.Delivery.Metrics.mark_progress_completed(attempt_guid) do
{:ok, _} ->
json(conn, %{
result: "success",
commandResult: "success"
})

{:error, reason} ->
json(conn, %{
result: "success",
commandResult: "failure",
reason: reason
})
end
end

defp command_failure(conn, reason, section_slug, revision_slug) do
json(conn, %{
result: "success",
Expand Down
143 changes: 143 additions & 0 deletions test/oli_web/controllers/api/page_lifecycle_controller_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
defmodule OliWeb.PageLifecycleTest do
use OliWeb.ConnCase

alias Oli.Activities.Model.Part
alias Oli.Delivery.Attempts.Core
alias Oli.Seeder
alias OliWeb.Router.Helpers, as: Routes

describe "set progress completed tests" do
setup [:setup_session]

test "can set progress", %{
conn: conn,
map: map
} do
attempt = map.ungraded_page_user1_attempt1

assert_progress(0.0, attempt.attempt_guid)

conn =
post(
conn,
Routes.page_lifecycle_path(conn, :transition),
%{"attempt_guid" => attempt.attempt_guid, "action" => "mark_completed"}
)

assert %{"result" => "success", "commandResult" => "success"} = json_response(conn, 200)

assert_progress(1.0, attempt.attempt_guid)
end

test "fails when guid is bad", %{
conn: conn
} do
conn =
post(
conn,
Routes.page_lifecycle_path(conn, :transition),
%{"attempt_guid" => "this_guid_does_not_exist", "action" => "mark_completed"}
)

assert %{"result" => "success", "commandResult" => "failure"} = json_response(conn, 200)
end
end

defp assert_progress(progress, guid) do
assert Core.get_resource_access_from_guid(guid).progress == progress
end

defp setup_session(%{conn: conn}) do
content = %{
"stem" => "1",
"authoring" => %{
"parts" => [
%{
"id" => "1",
"responses" => [
%{
"rule" => "input like {a}",
"score" => 10,
"id" => "r1",
"feedback" => %{"id" => "1", "content" => "yes"}
},
%{
"rule" => "input like {b}",
"score" => 1,
"id" => "r2",
"feedback" => %{"id" => "2", "content" => "almost"}
},
%{
"rule" => "input like {c}",
"score" => 0,
"id" => "r3",
"feedback" => %{"id" => "3", "content" => "no"}
}
],
"scoringStrategy" => "best",
"evaluationStrategy" => "regex"
}
]
}
}

map =
Seeder.base_project_with_resource2()
|> Seeder.add_activity(%{title: "one", max_attempts: 2, content: content}, :activity)
|> Seeder.create_section()
|> Seeder.add_user(%{}, :user1)

Seeder.ensure_published(map.publication.id)

map =
Seeder.add_page(
map,
%{
title: "page1",
content: %{
"model" => [
%{
"type" => "activity-reference",
"activity_id" => Map.get(map, :activity).revision.resource_id
}
]
},
objectives: %{"attached" => []}
},
:ungraded_page
)
|> Seeder.create_section_resources()
|> Seeder.create_resource_attempt(
%{attempt_number: 1},
:user1,
:ungraded_page,
:ungraded_page_user1_attempt1
)
|> Seeder.create_activity_attempt(
%{attempt_number: 1, transformed_model: content},
:activity,
:ungraded_page_user1_attempt1,
:ungraded_page_user1_activity_attempt1
)
|> Seeder.create_part_attempt(
%{attempt_number: 1},
%Part{id: "1", responses: [], hints: []},
:ungraded_page_user1_activity_attempt1,
:ungraded_page_user1_activity_attempt1_part1_attempt1
)

user = map.user1

lti_params_id =
Oli.Lti.TestHelpers.all_default_claims()
|> put_in(["https://purl.imsglobal.org/spec/lti/claim/context", "id"], map.section.slug)
|> cache_lti_params(user.id)

conn =
Plug.Test.init_test_session(conn, lti_session: nil)
|> Pow.Plug.assign_current_user(user, OliWeb.Pow.PowHelpers.get_pow_config(:user))
|> OliWeb.Common.LtiSession.put_session_lti_params(lti_params_id)

{:ok, conn: conn, map: map}
end
end

0 comments on commit b7983c9

Please sign in to comment.