expose poll_choice#is_correct to students when available
fixes CNVS-13474 This commit exposes the is_correct attribute on poll_choices when a student has submitted their answer to the latest poll_session, and that poll_session has been closed. Test plan - As a teacher, create a poll, relevant poll choices, and a poll session - Publish the poll session - As a student, at this point is_correct should not be viewable on poll choices - As a student, submit a poll submission - As a student, at this point is_correct should not be viewable on poll choices - As a teacher, close the poll session - As a student, at this point is_correct should be viewable on poll choices Change-Id: I20a8bb534affe5e1a23c1dddbb727043535dd23d Reviewed-on: https://gerrit.instructure.com/36031 Reviewed-by: Jason Madsen <jmadsen@instructure.com> Tested-by: Jenkins <jenkins@instructure.com> QA-Review: Trevor deHaan <tdehaan@instructure.com> Product-Review: Josh Simpson <jsimpson@instructure.com>
This commit is contained in:
parent
21de3036c0
commit
38917d0c32
|
@ -85,7 +85,6 @@ module Polling
|
|||
#
|
||||
def show
|
||||
@poll_choice = @poll.poll_choices.find(params[:id])
|
||||
|
||||
if authorized_action(@poll, @current_user, :read)
|
||||
render json: serialize_jsonapi(@poll_choice)
|
||||
end
|
||||
|
|
|
@ -70,7 +70,7 @@ module Polling
|
|||
# }
|
||||
#
|
||||
def index
|
||||
@polls = @current_user.polls
|
||||
@polls = @current_user.polls.order('created_at DESC')
|
||||
@polls = Api.paginate(@polls, self, api_v1_polls_url)
|
||||
|
||||
render json: serialize_jsonapi(@polls)
|
||||
|
|
|
@ -45,6 +45,24 @@ module Polling
|
|||
can :read
|
||||
end
|
||||
|
||||
def closed_and_viewable_for?(user)
|
||||
results = poll_sessions.with_each_shard do |scope|
|
||||
scope
|
||||
.joins(:poll_submissions)
|
||||
.where(["polling_poll_submissions.user_id = ? AND is_published=? AND course_id IN (?) AND (course_section_id IS NULL OR course_section_id IN (?))",
|
||||
user,
|
||||
false,
|
||||
user.enrollments.map(&:course_id).compact,
|
||||
user.enrollments.map(&:course_section_id).compact]
|
||||
)
|
||||
.order('polling_poll_sessions.created_at DESC')
|
||||
.limit(1)
|
||||
.exists?
|
||||
end
|
||||
|
||||
results.any?
|
||||
end
|
||||
|
||||
def total_results
|
||||
poll_sessions.reduce(Hash.new(0)) do |poll_results, session|
|
||||
poll_results = poll_results.merge(session.results) do |key, poll_result_value, session_result_value|
|
||||
|
|
|
@ -31,7 +31,9 @@ module Polling
|
|||
end
|
||||
|
||||
def student_keys
|
||||
[:id, :text]
|
||||
keys = [:id, :text]
|
||||
keys << :is_correct if poll.closed_and_viewable_for?(current_user)
|
||||
keys
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -114,14 +114,31 @@ describe Polling::PollChoicesController, type: :request do
|
|||
response.code.should == '200'
|
||||
end
|
||||
|
||||
it "doesn't display is_correct within poll choices" do
|
||||
Polling::PollSession.create!(course: @course, poll: @poll)
|
||||
context "with opened sessions" do
|
||||
it "doesn't display is_correct within poll choices" do
|
||||
Polling::PollSession.create!(course: @course, poll: @poll).publish!
|
||||
|
||||
json = get_show
|
||||
poll_choice_json = json['poll_choices'].first
|
||||
json = get_show
|
||||
poll_choice_json = json['poll_choices'].first
|
||||
|
||||
poll_choice_json.should_not have_key('is_correct')
|
||||
poll_choice_json.should_not have_key('is_correct')
|
||||
end
|
||||
end
|
||||
|
||||
context "with closed, available sessions" do
|
||||
it "displays is_correct within poll choices" do
|
||||
session = Polling::PollSession.create!(course: @course, poll: @poll)
|
||||
session.publish!
|
||||
session.poll_submissions.create!(user: @student, poll: @poll, poll_choice: @poll_choice)
|
||||
session.close!
|
||||
|
||||
json = get_show
|
||||
poll_choice_json = json['poll_choices'].first
|
||||
|
||||
poll_choice_json.should have_key('is_correct')
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -42,6 +42,44 @@ describe Polling::Poll do
|
|||
end
|
||||
end
|
||||
|
||||
describe "#closed_and_viewable_for?" do
|
||||
it "returns false if the latest poll session available to the user is opened" do
|
||||
student = student_in_course(active_user:true).user
|
||||
poll = @teacher.polls.create!(question: 'A Test Poll')
|
||||
session = poll.poll_sessions.create(course: @course)
|
||||
session.publish!
|
||||
|
||||
poll.closed_and_viewable_for?(student).should be_false
|
||||
end
|
||||
|
||||
context "the latest poll session available to the user is closed" do
|
||||
before(:each) do
|
||||
@student = student_in_course(active_user:true).user
|
||||
@poll = @teacher.polls.create!(question: 'A Test Poll')
|
||||
@choice = @poll.poll_choices.create!(text: 'Choice A', is_correct: true)
|
||||
@session = @poll.poll_sessions.create(course: @course)
|
||||
end
|
||||
|
||||
it "returns true if the user has submitted" do
|
||||
@session.publish!
|
||||
@session.poll_submissions.create!(
|
||||
poll: @poll,
|
||||
user: @student,
|
||||
poll_choice: @choice
|
||||
)
|
||||
@session.close!
|
||||
|
||||
@poll.closed_and_viewable_for?(@student).should be_true
|
||||
end
|
||||
|
||||
it "returns false if the user hasn't submitted" do
|
||||
@session.publish!
|
||||
@session.close!
|
||||
@poll.closed_and_viewable_for?(@student).should be_false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#total_results" do
|
||||
def create_submission(session, choice)
|
||||
student = student_in_course(active_user:true).user
|
||||
|
|
Loading…
Reference in New Issue