Skip to content

Commit fcac48c

Browse files
committed
add selection table for moderated grading
closes: CNVS-22001 test plan: 1. run migrations 2. the table moderated_grading_selection should exist with the following columns: - assignment_id - student_id - selected_provisional_grade_id 3. in rails console, the class (model) ModeratedGrading::Selection should exist. Change-Id: I137ad648e044d00cc9ba426d327f6cc91982e2b8 Reviewed-on: https://gerrit.instructure.com/63027 Tested-by: Jenkins QA-Review: Clare Strong <clare@instructure.com> Reviewed-by: James Williams <jamesw@instructure.com> Product-Review: Jeremy Stanley <jeremy@instructure.com>
1 parent d5cd841 commit fcac48c

7 files changed

Lines changed: 96 additions & 20 deletions

File tree

app/models/assignment.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class Assignment < ActiveRecord::Base
7575
has_one :rubric, :through => :rubric_association
7676
has_one :teacher_enrollment, class_name: 'TeacherEnrollment', foreign_key: 'course_id', primary_key: 'context_id', preload: :user, conditions: ["enrollments.workflow_state = 'active' AND enrollments.type = 'TeacherEnrollment'"]
7777
has_many :ignores, :as => :asset
78+
has_many :moderated_grading_selections, class_name: 'ModeratedGrading::Selection'
7879
belongs_to :context, :polymorphic => true
7980
validates_inclusion_of :context_type, :allow_nil => true, :in => ['Course']
8081
validates_length_of :title, :maximum => maximum_string_length, :allow_nil => false, :allow_blank => true

app/models/moderated_grading/provisional_grade.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ class ModeratedGrading::ProvisionalGrade < ActiveRecord::Base
77
belongs_to :submission
88
belongs_to :scorer, class_name: 'User'
99

10-
has_many :rubric_assessments, :as => :artifact
10+
has_many :rubric_assessments, as: :artifact
11+
has_one :selection,
12+
class_name: 'ModeratedGrading::Selection',
13+
foreign_key: :selected_provisional_grade_id
1114

1215
validates :scorer, presence: true
1316
validates :submission, presence: true
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class ModeratedGrading::Selection < ActiveRecord::Base
2+
belongs_to :provisional_grade,
3+
foreign_key: :selected_provisional_grade_id,
4+
class_name: 'ModeratedGrading::ProvisionalGrade'
5+
belongs_to :assignment
6+
belongs_to :student, class_name: 'User'
7+
end

app/models/user.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,10 @@ def self.enrollment_conditions(state)
143143
has_many :sis_post_grades_statuses
144144
has_many :content_migrations, :as => :context
145145
has_many :content_exports, :as => :context
146-
has_many :usage_rights, as: :context, class_name: 'UsageRights', dependent: :destroy
147-
146+
has_many :usage_rights,
147+
as: :context,
148+
class_name: 'UsageRights',
149+
dependent: :destroy
148150
has_many :gradebook_csvs, dependent: :destroy
149151

150152
has_one :profile, :class_name => 'UserProfile'
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class CreateSelectionTable < ActiveRecord::Migration
2+
tag :predeploy
3+
4+
def up
5+
create_table :moderated_grading_selections do |t|
6+
t.integer :assignment_id, limit: 8, null: false
7+
t.integer :student_id, limit: 8, null: false
8+
t.integer :selected_provisional_grade_id, limit: 8, null: true
9+
10+
t.timestamps null: false
11+
end
12+
13+
add_index :moderated_grading_selections, :assignment_id
14+
add_index :moderated_grading_selections,
15+
[:assignment_id, :student_id],
16+
unique: true,
17+
name: :idx_mg_selections_unique_on_assignment_and_student
18+
add_foreign_key :moderated_grading_selections, :assignments
19+
add_foreign_key :moderated_grading_selections, :users, column: :student_id
20+
add_foreign_key :moderated_grading_selections, :moderated_grading_provisional_grades, column: :selected_provisional_grade_id
21+
end
22+
23+
def down
24+
drop_table :moderated_grading_selections
25+
end
26+
end

spec/models/moderated_grading/provisional_grade_spec.rb

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,30 @@
1414
let(:now) { Time.zone.now }
1515

1616
it { is_expected.to be_valid }
17+
18+
it do
19+
is_expected.to have_one(:selection).
20+
with_foreign_key(:selected_provisional_grade_id).
21+
class_name('ModeratedGrading::Selection')
22+
end
23+
it { is_expected.to belong_to(:submission) }
24+
it { is_expected.to belong_to(:scorer).class_name('User') }
25+
it { is_expected.to have_many(:rubric_assessments) }
26+
1727
it { is_expected.to validate_presence_of(:scorer) }
1828
it { is_expected.to validate_presence_of(:submission) }
1929

2030
describe 'grade_attributes' do
2131
it "returns the proper format" do
2232
json = provisional_grade.grade_attributes
2333
expect(json).to eq({
24-
'provisional_grade_id' => provisional_grade.id,
25-
'grade' => 'A',
26-
'score' => 100.0,
27-
'graded_at' => nil,
28-
'scorer_id' => provisional_grade.scorer_id,
29-
'grade_matches_current_submission' => true
30-
})
34+
'provisional_grade_id' => provisional_grade.id,
35+
'grade' => 'A',
36+
'score' => 100.0,
37+
'graded_at' => nil,
38+
'scorer_id' => provisional_grade.scorer_id,
39+
'grade_matches_current_submission' => true
40+
})
3141
end
3242
end
3343

@@ -109,8 +119,8 @@
109119
pg = sub.find_or_create_provisional_grade! scorer: user, score: 1
110120

111121
prov_assmt = association.assess(:user => student, :assessor => user, :artifact => pg,
112-
:assessment => { :assessment_type => 'grading',
113-
:"criterion_#{@rubric.criteria_object.first.id}" => { :points => 3, :comments => "good 4 u" } })
122+
:assessment => { :assessment_type => 'grading',
123+
:"criterion_#{@rubric.criteria_object.first.id}" => { :points => 3, :comments => "good 4 u" } })
114124

115125
expect(prov_assmt.score).to eq 3
116126

@@ -174,13 +184,13 @@
174184
describe 'grade_attributes' do
175185
it "returns the proper format" do
176186
expect(ModeratedGrading::NullProvisionalGrade.new(1).grade_attributes).to eq({
177-
'provisional_grade_id' => nil,
178-
'grade' => nil,
179-
'score' => nil,
180-
'graded_at' => nil,
181-
'scorer_id' => 1,
182-
'grade_matches_current_submission' => true
183-
})
187+
'provisional_grade_id' => nil,
188+
'grade' => nil,
189+
'score' => nil,
190+
'graded_at' => nil,
191+
'scorer_id' => 1,
192+
'grade_matches_current_submission' => true
193+
})
184194
end
185195
end
186-
end
196+
end
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require 'spec_helper'
2+
3+
describe ModeratedGrading::Selection do
4+
it { is_expected.to belong_to(:assignment) }
5+
6+
it do
7+
is_expected.to belong_to(:provisional_grade).
8+
with_foreign_key(:selected_provisional_grade_id).
9+
class_name('ModeratedGrading::ProvisionalGrade')
10+
end
11+
12+
it do
13+
is_expected.to belong_to(:student).
14+
class_name('User')
15+
end
16+
17+
it "is restricted to one selection per assignment/student pair" do
18+
course_with_student
19+
@assignment = @course.assignments.create!
20+
s = @assignment.moderated_grading_selections.build
21+
s.student_id = @student.id
22+
s.save!
23+
s2 = @assignment.moderated_grading_selections.build
24+
s2.student_id = @student.id
25+
expect { s2.save! }.to raise_error(ActiveRecord::RecordNotUnique)
26+
end
27+
end

0 commit comments

Comments
 (0)