move QuizSerializer into quizzes namespace
closes CNVS-11591 Change-Id: Id33551d07f76fbbcb74612ca5bc2c32a7846801c Reviewed-on: https://gerrit.instructure.com/31226 Reviewed-by: Jason Madsen <jmadsen@instructure.com> Tested-by: Jenkins <jenkins@instructure.com> QA-Review: Caleb Guanzon <cguanzon@instructure.com> Product-Review: Stanley Stuart <stanley@instructure.com>
This commit is contained in:
parent
a103081077
commit
658286f03d
|
@ -75,7 +75,7 @@ module Canvas
|
||||||
# use object if you don't want to.
|
# use object if you don't want to.
|
||||||
def self.inherited(klass)
|
def self.inherited(klass)
|
||||||
super(klass)
|
super(klass)
|
||||||
resource_name = klass.name.underscore.downcase.split('_serializer').first
|
resource_name = klass.name.demodulize.underscore.downcase.split('_serializer').first
|
||||||
klass.send(:alias_method, resource_name.to_sym, :object)
|
klass.send(:alias_method, resource_name.to_sym, :object)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,162 +0,0 @@
|
||||||
class QuizSerializer < Canvas::APISerializer
|
|
||||||
include LockedSerializer
|
|
||||||
include PermissionsSerializer
|
|
||||||
|
|
||||||
root :quiz
|
|
||||||
|
|
||||||
attributes :id, :title, :html_url, :mobile_url, :description, :quiz_type,
|
|
||||||
:time_limit, :shuffle_answers, :show_correct_answers,
|
|
||||||
:scoring_policy, :allowed_attempts, :one_question_at_a_time,
|
|
||||||
:question_count, :points_possible, :cant_go_back,
|
|
||||||
:access_code, :ip_filter, :due_at, :lock_at, :unlock_at,
|
|
||||||
:published, :unpublishable, :locked_for_user, :lock_info,
|
|
||||||
:lock_explanation, :hide_results, :show_correct_answers_at,
|
|
||||||
:hide_correct_answers_at, :all_dates, :can_unpublish, :can_update,
|
|
||||||
:require_lockdown_browser, :require_lockdown_browser_for_results,
|
|
||||||
:require_lockdown_browser_monitor, :lockdown_browser_monitor_data,
|
|
||||||
:speed_grader_url, :permissions
|
|
||||||
|
|
||||||
def_delegators :@controller,
|
|
||||||
:api_v1_course_assignment_group_url,
|
|
||||||
:speed_grader_course_gradebook_url,
|
|
||||||
:api_v1_course_quiz_submission_url,
|
|
||||||
:api_v1_course_quiz_submissions_url
|
|
||||||
|
|
||||||
has_one :assignment_group, embed: :ids, root: :assignment_group
|
|
||||||
has_many :quiz_submissions, embed: :ids, root: :quiz_submissions
|
|
||||||
|
|
||||||
def speed_grader_url
|
|
||||||
return nil unless show_speedgrader?
|
|
||||||
speed_grader_course_gradebook_url(quiz.context, assignment_id: quiz.assignment.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def quiz_submissions_url
|
|
||||||
if user_may_grade?
|
|
||||||
api_v1_course_quiz_submissions_url(quiz.context, quiz)
|
|
||||||
else
|
|
||||||
quiz_submission = quiz.quiz_submissions.where(user_id: current_user).first
|
|
||||||
if quiz_submission
|
|
||||||
api_v1_course_quiz_submission_url(quiz.context, quiz, quiz_submission)
|
|
||||||
else
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def html_url
|
|
||||||
controller.send(:course_quiz_url, context, quiz)
|
|
||||||
end
|
|
||||||
|
|
||||||
def mobile_url
|
|
||||||
controller.send(:course_quiz_url, context, quiz, persist_headless: 1, force_user: 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
def all_dates
|
|
||||||
quiz.formatted_dates_hash(due_dates[1])
|
|
||||||
end
|
|
||||||
|
|
||||||
def locked_for_json_type; 'quiz' end
|
|
||||||
|
|
||||||
# Teacher or Observer?
|
|
||||||
def include_all_dates?
|
|
||||||
due_dates[1].present?
|
|
||||||
end
|
|
||||||
|
|
||||||
def include_unpublishable?
|
|
||||||
quiz.grants_right?(current_user, session, :manage)
|
|
||||||
end
|
|
||||||
|
|
||||||
def filter(keys)
|
|
||||||
super(keys).select do |key|
|
|
||||||
case key
|
|
||||||
when :all_dates then include_all_dates?
|
|
||||||
when :access_code, :speed_grader_url then user_may_grade?
|
|
||||||
when :unpublishable then include_unpublishable?
|
|
||||||
else true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def can_unpublish
|
|
||||||
quiz.can_unpublish?
|
|
||||||
end
|
|
||||||
|
|
||||||
def can_update
|
|
||||||
quiz.grants_right?(current_user, session, :update)
|
|
||||||
end
|
|
||||||
|
|
||||||
def question_count
|
|
||||||
quiz.available_question_count
|
|
||||||
end
|
|
||||||
|
|
||||||
def require_lockdown_browser
|
|
||||||
quiz.require_lockdown_browser?
|
|
||||||
end
|
|
||||||
|
|
||||||
def require_lockdown_browser_for_results
|
|
||||||
quiz.require_lockdown_browser_for_results?
|
|
||||||
end
|
|
||||||
|
|
||||||
def require_lockdown_browser_monitor
|
|
||||||
quiz.require_lockdown_browser_monitor?
|
|
||||||
end
|
|
||||||
|
|
||||||
def lockdown_browser_monitor_data
|
|
||||||
quiz.lockdown_browser_monitor_data
|
|
||||||
end
|
|
||||||
|
|
||||||
def serializable_object(options={})
|
|
||||||
hash = super(options)
|
|
||||||
# legacy v1 api
|
|
||||||
unless accepts_jsonapi?
|
|
||||||
links = hash.delete('links')
|
|
||||||
id = hash['assignment_group']
|
|
||||||
hash['assignment_group_id'] = quiz.assignment_group.try(:id)
|
|
||||||
end
|
|
||||||
hash
|
|
||||||
end
|
|
||||||
|
|
||||||
def assignment_group_url
|
|
||||||
api_v1_course_assignment_group_url(quiz.context, quiz.assignment_group.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def stringify_ids?
|
|
||||||
!!(accepts_jsonapi? || stringify_json_ids?)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def show_speedgrader?
|
|
||||||
quiz.assignment.present? && quiz.published? && quiz.context.allows_speed_grader?
|
|
||||||
end
|
|
||||||
|
|
||||||
def due_dates
|
|
||||||
@due_dates ||= quiz.due_dates_for(current_user)
|
|
||||||
end
|
|
||||||
|
|
||||||
# If the current user is a student and is in a course section which has
|
|
||||||
# an assignment override, the date will be that of the section's, otherwise
|
|
||||||
# we will use the Quiz's.
|
|
||||||
#
|
|
||||||
# @param [:due_at|:lock_at|:unlock_at] domain
|
|
||||||
def overridden_date(domain)
|
|
||||||
due_dates[0] ? due_dates[0][domain] : quiz.send(domain)
|
|
||||||
end
|
|
||||||
|
|
||||||
def due_at
|
|
||||||
overridden_date :due_at
|
|
||||||
end
|
|
||||||
|
|
||||||
def lock_at
|
|
||||||
overridden_date :lock_at
|
|
||||||
end
|
|
||||||
|
|
||||||
def unlock_at
|
|
||||||
overridden_date :unlock_at
|
|
||||||
end
|
|
||||||
|
|
||||||
def user_may_grade?
|
|
||||||
quiz.grants_right?(current_user, session, :grade)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -0,0 +1,164 @@
|
||||||
|
module Quizzes
|
||||||
|
class QuizSerializer < Canvas::APISerializer
|
||||||
|
include LockedSerializer
|
||||||
|
include PermissionsSerializer
|
||||||
|
|
||||||
|
root :quiz
|
||||||
|
|
||||||
|
attributes :id, :title, :html_url, :mobile_url, :description, :quiz_type,
|
||||||
|
:time_limit, :shuffle_answers, :show_correct_answers,
|
||||||
|
:scoring_policy, :allowed_attempts, :one_question_at_a_time,
|
||||||
|
:question_count, :points_possible, :cant_go_back,
|
||||||
|
:access_code, :ip_filter, :due_at, :lock_at, :unlock_at,
|
||||||
|
:published, :unpublishable, :locked_for_user, :lock_info,
|
||||||
|
:lock_explanation, :hide_results, :show_correct_answers_at,
|
||||||
|
:hide_correct_answers_at, :all_dates, :can_unpublish, :can_update,
|
||||||
|
:require_lockdown_browser, :require_lockdown_browser_for_results,
|
||||||
|
:require_lockdown_browser_monitor, :lockdown_browser_monitor_data,
|
||||||
|
:speed_grader_url, :permissions
|
||||||
|
|
||||||
|
def_delegators :@controller,
|
||||||
|
:api_v1_course_assignment_group_url,
|
||||||
|
:speed_grader_course_gradebook_url,
|
||||||
|
:api_v1_course_quiz_submission_url,
|
||||||
|
:api_v1_course_quiz_submissions_url
|
||||||
|
|
||||||
|
has_one :assignment_group, embed: :ids, root: :assignment_group
|
||||||
|
has_many :quiz_submissions, embed: :ids, root: :quiz_submissions
|
||||||
|
|
||||||
|
def speed_grader_url
|
||||||
|
return nil unless show_speedgrader?
|
||||||
|
speed_grader_course_gradebook_url(quiz.context, assignment_id: quiz.assignment.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def quiz_submissions_url
|
||||||
|
if user_may_grade?
|
||||||
|
api_v1_course_quiz_submissions_url(quiz.context, quiz)
|
||||||
|
else
|
||||||
|
quiz_submission = quiz.quiz_submissions.where(user_id: current_user).first
|
||||||
|
if quiz_submission
|
||||||
|
api_v1_course_quiz_submission_url(quiz.context, quiz, quiz_submission)
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def html_url
|
||||||
|
controller.send(:course_quiz_url, context, quiz)
|
||||||
|
end
|
||||||
|
|
||||||
|
def mobile_url
|
||||||
|
controller.send(:course_quiz_url, context, quiz, persist_headless: 1, force_user: 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
def all_dates
|
||||||
|
quiz.formatted_dates_hash(due_dates[1])
|
||||||
|
end
|
||||||
|
|
||||||
|
def locked_for_json_type; 'quiz' end
|
||||||
|
|
||||||
|
# Teacher or Observer?
|
||||||
|
def include_all_dates?
|
||||||
|
due_dates[1].present?
|
||||||
|
end
|
||||||
|
|
||||||
|
def include_unpublishable?
|
||||||
|
quiz.grants_right?(current_user, session, :manage)
|
||||||
|
end
|
||||||
|
|
||||||
|
def filter(keys)
|
||||||
|
super(keys).select do |key|
|
||||||
|
case key
|
||||||
|
when :all_dates then include_all_dates?
|
||||||
|
when :access_code, :speed_grader_url then user_may_grade?
|
||||||
|
when :unpublishable then include_unpublishable?
|
||||||
|
else true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def can_unpublish
|
||||||
|
quiz.can_unpublish?
|
||||||
|
end
|
||||||
|
|
||||||
|
def can_update
|
||||||
|
quiz.grants_right?(current_user, session, :update)
|
||||||
|
end
|
||||||
|
|
||||||
|
def question_count
|
||||||
|
quiz.available_question_count
|
||||||
|
end
|
||||||
|
|
||||||
|
def require_lockdown_browser
|
||||||
|
quiz.require_lockdown_browser?
|
||||||
|
end
|
||||||
|
|
||||||
|
def require_lockdown_browser_for_results
|
||||||
|
quiz.require_lockdown_browser_for_results?
|
||||||
|
end
|
||||||
|
|
||||||
|
def require_lockdown_browser_monitor
|
||||||
|
quiz.require_lockdown_browser_monitor?
|
||||||
|
end
|
||||||
|
|
||||||
|
def lockdown_browser_monitor_data
|
||||||
|
quiz.lockdown_browser_monitor_data
|
||||||
|
end
|
||||||
|
|
||||||
|
def serializable_object(options={})
|
||||||
|
hash = super(options)
|
||||||
|
# legacy v1 api
|
||||||
|
unless accepts_jsonapi?
|
||||||
|
links = hash.delete('links')
|
||||||
|
id = hash['assignment_group']
|
||||||
|
hash['assignment_group_id'] = quiz.assignment_group.try(:id)
|
||||||
|
end
|
||||||
|
hash
|
||||||
|
end
|
||||||
|
|
||||||
|
def assignment_group_url
|
||||||
|
api_v1_course_assignment_group_url(quiz.context, quiz.assignment_group.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def stringify_ids?
|
||||||
|
!!(accepts_jsonapi? || stringify_json_ids?)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def show_speedgrader?
|
||||||
|
quiz.assignment.present? && quiz.published? && quiz.context.allows_speed_grader?
|
||||||
|
end
|
||||||
|
|
||||||
|
def due_dates
|
||||||
|
@due_dates ||= quiz.due_dates_for(current_user)
|
||||||
|
end
|
||||||
|
|
||||||
|
# If the current user is a student and is in a course section which has
|
||||||
|
# an assignment override, the date will be that of the section's, otherwise
|
||||||
|
# we will use the Quiz's.
|
||||||
|
#
|
||||||
|
# @param [:due_at|:lock_at|:unlock_at] domain
|
||||||
|
def overridden_date(domain)
|
||||||
|
due_dates[0] ? due_dates[0][domain] : quiz.send(domain)
|
||||||
|
end
|
||||||
|
|
||||||
|
def due_at
|
||||||
|
overridden_date :due_at
|
||||||
|
end
|
||||||
|
|
||||||
|
def lock_at
|
||||||
|
overridden_date :lock_at
|
||||||
|
end
|
||||||
|
|
||||||
|
def unlock_at
|
||||||
|
overridden_date :unlock_at
|
||||||
|
end
|
||||||
|
|
||||||
|
def user_may_grade?
|
||||||
|
quiz.grants_right?(current_user, session, :grade)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
|
@ -55,7 +55,7 @@ module Api::V1::Quiz
|
||||||
end
|
end
|
||||||
|
|
||||||
def quiz_json(quiz, context, user, session)
|
def quiz_json(quiz, context, user, session)
|
||||||
QuizSerializer.new(quiz,
|
Quizzes::QuizSerializer.new(quiz,
|
||||||
scope: user,
|
scope: user,
|
||||||
session: session,
|
session: session,
|
||||||
root: false,
|
root: false,
|
||||||
|
@ -73,7 +73,7 @@ module Api::V1::Quiz
|
||||||
controller: self,
|
controller: self,
|
||||||
root: :quizzes,
|
root: :quizzes,
|
||||||
meta: meta,
|
meta: meta,
|
||||||
each_serializer: QuizSerializer,
|
each_serializer: Quizzes::QuizSerializer,
|
||||||
include_root: false).as_json
|
include_root: false).as_json
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,7 @@ describe Quizzes::QuizzesApiController, type: :request do
|
||||||
'Accept' => 'application/vnd.api+json')
|
'Accept' => 'application/vnd.api+json')
|
||||||
@json = @json.fetch('quizzes').map { |q| q.with_indifferent_access }
|
@json = @json.fetch('quizzes').map { |q| q.with_indifferent_access }
|
||||||
@json.should =~ [
|
@json.should =~ [
|
||||||
QuizSerializer.new(@quiz, scope: @user, controller: controller, session: session).
|
Quizzes::QuizSerializer.new(@quiz, scope: @user, controller: controller, session: session).
|
||||||
as_json[:quiz].with_indifferent_access
|
as_json[:quiz].with_indifferent_access
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
@ -179,7 +179,7 @@ describe Quizzes::QuizzesApiController, type: :request do
|
||||||
@json = @json.fetch('quizzes').map { |q| q.with_indifferent_access }
|
@json = @json.fetch('quizzes').map { |q| q.with_indifferent_access }
|
||||||
@quiz = Quizzes::Quiz.first
|
@quiz = Quizzes::Quiz.first
|
||||||
@json.should =~ [
|
@json.should =~ [
|
||||||
QuizSerializer.new(@quiz, scope: @user, controller: controller, session: session).
|
Quizzes::QuizSerializer.new(@quiz, scope: @user, controller: controller, session: session).
|
||||||
as_json[:quiz].with_indifferent_access
|
as_json[:quiz].with_indifferent_access
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
@ -337,7 +337,7 @@ describe Quizzes::QuizzesApiController, type: :request do
|
||||||
'Accept' => 'application/vnd.api+json')
|
'Accept' => 'application/vnd.api+json')
|
||||||
@json = @json.fetch('quizzes').map { |q| q.with_indifferent_access }
|
@json = @json.fetch('quizzes').map { |q| q.with_indifferent_access }
|
||||||
@json.should =~ [
|
@json.should =~ [
|
||||||
QuizSerializer.new(@quiz.reload, scope: @user, controller: controller, session: session).
|
Quizzes::QuizSerializer.new(@quiz.reload, scope: @user, controller: controller, session: session).
|
||||||
as_json[:quiz].with_indifferent_access
|
as_json[:quiz].with_indifferent_access
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe QuizSerializer do
|
describe Quizzes::QuizSerializer do
|
||||||
let(:quiz) { @quiz }
|
let(:quiz) { @quiz }
|
||||||
let(:context ) { @context }
|
let(:context ) { @context }
|
||||||
let(:serializer) { @serializer }
|
let(:serializer) { @serializer }
|
||||||
|
@ -24,7 +24,7 @@ describe QuizSerializer do
|
||||||
controller.stubs(:session).returns session
|
controller.stubs(:session).returns session
|
||||||
controller.stubs(:context).returns context
|
controller.stubs(:context).returns context
|
||||||
@quiz.stubs(:grants_right?).at_least_once.returns true
|
@quiz.stubs(:grants_right?).at_least_once.returns true
|
||||||
@serializer = QuizSerializer.new(@quiz,
|
@serializer = Quizzes::QuizSerializer.new(@quiz,
|
||||||
controller: controller,
|
controller: controller,
|
||||||
scope: @user,
|
scope: @user,
|
||||||
session: @session)
|
session: @session)
|
||||||
|
@ -116,7 +116,7 @@ describe QuizSerializer do
|
||||||
quiz.expects(:locked_for?).
|
quiz.expects(:locked_for?).
|
||||||
with(@user, check_policies: true, context: @context).
|
with(@user, check_policies: true, context: @context).
|
||||||
returns({due_at: true})
|
returns({due_at: true})
|
||||||
json = QuizSerializer.new(quiz, scope: @user, controller: controller).
|
json = Quizzes::QuizSerializer.new(quiz, scope: @user, controller: controller).
|
||||||
as_json[:quiz]
|
as_json[:quiz]
|
||||||
json.should have_key :lock_info
|
json.should have_key :lock_info
|
||||||
json.should have_key :lock_explanation
|
json.should have_key :lock_explanation
|
||||||
|
@ -125,7 +125,7 @@ describe QuizSerializer do
|
||||||
quiz.expects(:locked_for?).
|
quiz.expects(:locked_for?).
|
||||||
with(@user, check_policies: true, context: @context).
|
with(@user, check_policies: true, context: @context).
|
||||||
returns false
|
returns false
|
||||||
json = QuizSerializer.new(quiz, scope: @user, controller: controller).
|
json = Quizzes::QuizSerializer.new(quiz, scope: @user, controller: controller).
|
||||||
as_json[:quiz]
|
as_json[:quiz]
|
||||||
json.should_not have_key :lock_info
|
json.should_not have_key :lock_info
|
||||||
json.should_not have_key :lock_explanation
|
json.should_not have_key :lock_explanation
|
||||||
|
@ -184,7 +184,7 @@ describe QuizSerializer do
|
||||||
it "sends the url for all submissions when user may grade" do
|
it "sends the url for all submissions when user may grade" do
|
||||||
course_with_teacher_logged_in(active_all: true)
|
course_with_teacher_logged_in(active_all: true)
|
||||||
quiz_with_graded_submission([], course: @course)
|
quiz_with_graded_submission([], course: @course)
|
||||||
serializer = QuizSerializer.new(@quiz,
|
serializer = Quizzes::QuizSerializer.new(@quiz,
|
||||||
controller: controller,
|
controller: controller,
|
||||||
scope: @teacher)
|
scope: @teacher)
|
||||||
serializer.as_json[:quiz]['links']['quiz_submissions'].should ==
|
serializer.as_json[:quiz]['links']['quiz_submissions'].should ==
|
||||||
|
@ -194,7 +194,7 @@ describe QuizSerializer do
|
||||||
it "sends the url to a student's submission for students" do
|
it "sends the url to a student's submission for students" do
|
||||||
course_with_student_logged_in(active_all: true)
|
course_with_student_logged_in(active_all: true)
|
||||||
quiz_with_graded_submission([], user: @student, course: @course)
|
quiz_with_graded_submission([], user: @student, course: @course)
|
||||||
serializer = QuizSerializer.new(@quiz,
|
serializer = Quizzes::QuizSerializer.new(@quiz,
|
||||||
controller: controller,
|
controller: controller,
|
||||||
scope: @student)
|
scope: @student)
|
||||||
serializer.as_json[:quiz]['links']['quiz_submissions'].should ==
|
serializer.as_json[:quiz]['links']['quiz_submissions'].should ==
|
||||||
|
@ -207,7 +207,7 @@ describe QuizSerializer do
|
||||||
|
|
||||||
it "sends nil if user can't grade and doesn't have a submission" do
|
it "sends nil if user can't grade and doesn't have a submission" do
|
||||||
course_with_student_logged_in(active_all: true)
|
course_with_student_logged_in(active_all: true)
|
||||||
serializer = QuizSerializer.new(@quiz,
|
serializer = Quizzes::QuizSerializer.new(@quiz,
|
||||||
controller: controller,
|
controller: controller,
|
||||||
scope: @student)
|
scope: @student)
|
||||||
serializer.as_json[:quiz]['links']['quiz_submissions'].should be_nil
|
serializer.as_json[:quiz]['links']['quiz_submissions'].should be_nil
|
Loading…
Reference in New Issue