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.
|
||||
def self.inherited(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)
|
||||
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
|
||||
|
||||
def quiz_json(quiz, context, user, session)
|
||||
QuizSerializer.new(quiz,
|
||||
Quizzes::QuizSerializer.new(quiz,
|
||||
scope: user,
|
||||
session: session,
|
||||
root: false,
|
||||
|
@ -73,7 +73,7 @@ module Api::V1::Quiz
|
|||
controller: self,
|
||||
root: :quizzes,
|
||||
meta: meta,
|
||||
each_serializer: QuizSerializer,
|
||||
each_serializer: Quizzes::QuizSerializer,
|
||||
include_root: false).as_json
|
||||
end
|
||||
|
||||
|
|
|
@ -139,7 +139,7 @@ describe Quizzes::QuizzesApiController, type: :request do
|
|||
'Accept' => 'application/vnd.api+json')
|
||||
@json = @json.fetch('quizzes').map { |q| q.with_indifferent_access }
|
||||
@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
|
||||
]
|
||||
end
|
||||
|
@ -179,7 +179,7 @@ describe Quizzes::QuizzesApiController, type: :request do
|
|||
@json = @json.fetch('quizzes').map { |q| q.with_indifferent_access }
|
||||
@quiz = Quizzes::Quiz.first
|
||||
@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
|
||||
]
|
||||
end
|
||||
|
@ -337,7 +337,7 @@ describe Quizzes::QuizzesApiController, type: :request do
|
|||
'Accept' => 'application/vnd.api+json')
|
||||
@json = @json.fetch('quizzes').map { |q| q.with_indifferent_access }
|
||||
@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
|
||||
]
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe QuizSerializer do
|
||||
describe Quizzes::QuizSerializer do
|
||||
let(:quiz) { @quiz }
|
||||
let(:context ) { @context }
|
||||
let(:serializer) { @serializer }
|
||||
|
@ -24,7 +24,7 @@ describe QuizSerializer do
|
|||
controller.stubs(:session).returns session
|
||||
controller.stubs(:context).returns context
|
||||
@quiz.stubs(:grants_right?).at_least_once.returns true
|
||||
@serializer = QuizSerializer.new(@quiz,
|
||||
@serializer = Quizzes::QuizSerializer.new(@quiz,
|
||||
controller: controller,
|
||||
scope: @user,
|
||||
session: @session)
|
||||
|
@ -116,7 +116,7 @@ describe QuizSerializer do
|
|||
quiz.expects(:locked_for?).
|
||||
with(@user, check_policies: true, context: @context).
|
||||
returns({due_at: true})
|
||||
json = QuizSerializer.new(quiz, scope: @user, controller: controller).
|
||||
json = Quizzes::QuizSerializer.new(quiz, scope: @user, controller: controller).
|
||||
as_json[:quiz]
|
||||
json.should have_key :lock_info
|
||||
json.should have_key :lock_explanation
|
||||
|
@ -125,7 +125,7 @@ describe QuizSerializer do
|
|||
quiz.expects(:locked_for?).
|
||||
with(@user, check_policies: true, context: @context).
|
||||
returns false
|
||||
json = QuizSerializer.new(quiz, scope: @user, controller: controller).
|
||||
json = Quizzes::QuizSerializer.new(quiz, scope: @user, controller: controller).
|
||||
as_json[:quiz]
|
||||
json.should_not have_key :lock_info
|
||||
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
|
||||
course_with_teacher_logged_in(active_all: true)
|
||||
quiz_with_graded_submission([], course: @course)
|
||||
serializer = QuizSerializer.new(@quiz,
|
||||
serializer = Quizzes::QuizSerializer.new(@quiz,
|
||||
controller: controller,
|
||||
scope: @teacher)
|
||||
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
|
||||
course_with_student_logged_in(active_all: true)
|
||||
quiz_with_graded_submission([], user: @student, course: @course)
|
||||
serializer = QuizSerializer.new(@quiz,
|
||||
serializer = Quizzes::QuizSerializer.new(@quiz,
|
||||
controller: controller,
|
||||
scope: @student)
|
||||
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
|
||||
course_with_student_logged_in(active_all: true)
|
||||
serializer = QuizSerializer.new(@quiz,
|
||||
serializer = Quizzes::QuizSerializer.new(@quiz,
|
||||
controller: controller,
|
||||
scope: @student)
|
||||
serializer.as_json[:quiz]['links']['quiz_submissions'].should be_nil
|
Loading…
Reference in New Issue