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:
Stanley Stuart 2014-03-04 10:38:40 -06:00
parent a103081077
commit 658286f03d
6 changed files with 177 additions and 175 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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