diff --git a/app/models/content_participation.rb b/app/models/content_participation.rb index d5806f549e7..8856bf367ee 100644 --- a/app/models/content_participation.rb +++ b/app/models/content_participation.rb @@ -61,11 +61,15 @@ class ContentParticipation < ActiveRecord::Base participant end + def self.content_posted?(content) + content.assignment.post_manually? ? content.posted? : true + end + def update_participation_count return unless saved_change_to_workflow_state? offset = if Account.site_admin.feature_enabled?(:visibility_feedback_student_grades_page) - content.posted? ? unread_count_offset : 0 + ContentParticipation.content_posted?(content) ? unread_count_offset : 0 else ((workflow_state == "unread") ? 1 : -1) end @@ -117,7 +121,7 @@ class ContentParticipation < ActiveRecord::Base def self.update_existing_participation_item(participations, workflow_state, content_item, content) participant = participations.find { |p| p.content_item == content_item } - return participant if participant.nil? || !content.posted? || same_workflow_state?(participant, workflow_state) + return participant if participant.nil? || !content_posted?(content) || same_workflow_state?(participant, workflow_state) participations -= [participant] diff --git a/app/models/content_participation_count.rb b/app/models/content_participation_count.rb index 0c95142280b..c18c0ad3e70 100644 --- a/app/models/content_participation_count.rb +++ b/app/models/content_participation_count.rb @@ -97,17 +97,17 @@ class ContentParticipationCount < ActiveRecord::Base SQL muted_condition = " AND (assignments.muted IS NULL OR NOT assignments.muted)" - posted_at_condition = " AND submissions.posted_at IS NOT NULL" + posted_at_condition = " AND (submissions.posted_at IS NOT NULL OR post_policies.post_manually IS FALSE)" visibility_feedback_enabled = Account.site_admin.feature_enabled?(:visibility_feedback_student_grades_page) submission_conditions << (visibility_feedback_enabled ? posted_at_condition : muted_condition) subs_with_grades = Submission.active.graded - .joins(:assignment) + .joins(assignment: [:post_policy]) .where(submission_conditions) .where.not(submissions: { score: nil }) .pluck(:id) subs_with_comments = Submission.active - .joins(:assignment, :submission_comments) + .joins(:submission_comments, assignment: [:post_policy]) .where(submission_conditions) .where(<<~SQL.squish, user).pluck(:id) (submission_comments.hidden IS NULL OR NOT submission_comments.hidden) @@ -116,7 +116,7 @@ class ContentParticipationCount < ActiveRecord::Base AND submission_comments.author_id <> ? SQL subs_with_assessments = Submission.active - .joins(:assignment, :rubric_assessments) + .joins(:rubric_assessments, assignment: [:post_policy]) .where(submission_conditions) .where.not(rubric_assessments: { data: nil }) .pluck(:id) diff --git a/spec/models/content_participation_count_spec.rb b/spec/models/content_participation_count_spec.rb index d9d218bb46d..7932aec8d1d 100644 --- a/spec/models/content_participation_count_spec.rb +++ b/spec/models/content_participation_count_spec.rb @@ -211,6 +211,14 @@ describe ContentParticipationCount do expect(ContentParticipationCount.unread_submission_count_for(@course, @student)).to eq 0 end + it "counts unread for automatically posted submissions that have no posted_at" do + Account.site_admin.enable_feature!(:visibility_feedback_student_grades_page) + student2 = User.create! + @submission = @assignment.update_submission(@student, { commenter: student2, comment: "good!" }).first + expect(@submission.reload.posted_at).to be nil + expect(ContentParticipationCount.unread_submission_count_for(@course, @student)).to eq 1 + end + context "muted assignments" do it "ignores counts from muted assignments" do @assignment.grade_student(@student, grade: 3, grader: @teacher) diff --git a/spec/models/content_participation_spec.rb b/spec/models/content_participation_spec.rb index 820c07037cb..de102c80cca 100644 --- a/spec/models/content_participation_spec.rb +++ b/spec/models/content_participation_spec.rb @@ -98,7 +98,8 @@ describe ContentParticipation do end.to change(ContentParticipation, :count).by 1 end - it "doesn't change the read state if submission is not posted" do + it "doesn't change the read state if submission is not posted and post policy is manual" do + @assignment.ensure_post_policy(post_manually: true) @content.update_columns(posted_at: nil) ContentParticipation.participate(content: @content, user: @student, workflow_state: "unread")