2012-12-13 03:14:17 +08:00
|
|
|
module DatesOverridable
|
2013-07-24 09:46:05 +08:00
|
|
|
attr_accessor :applied_overrides, :overridden_for_user, :overridden,
|
|
|
|
:has_no_overrides
|
2013-02-05 08:51:39 +08:00
|
|
|
attr_writer :without_overrides
|
2014-09-24 04:23:30 +08:00
|
|
|
include DifferentiableAssignment
|
2012-12-20 04:38:12 +08:00
|
|
|
|
2012-12-13 03:14:17 +08:00
|
|
|
def self.included(base)
|
|
|
|
base.has_many :assignment_overrides, :dependent => :destroy
|
|
|
|
base.has_many :active_assignment_overrides, :class_name => 'AssignmentOverride', :conditions => {:workflow_state => 'active'}
|
|
|
|
base.has_many :assignment_override_students, :dependent => :destroy
|
2014-02-12 06:11:25 +08:00
|
|
|
|
2012-12-13 03:14:17 +08:00
|
|
|
base.validates_associated :assignment_overrides
|
2012-12-29 05:02:21 +08:00
|
|
|
|
|
|
|
base.extend(ClassMethods)
|
2012-12-13 03:14:17 +08:00
|
|
|
end
|
|
|
|
|
2014-08-20 00:58:55 +08:00
|
|
|
def reload_overrides_cache?
|
|
|
|
self.updated_at && self.updated_at > 2.seconds.ago
|
|
|
|
end
|
|
|
|
|
2014-02-12 06:11:25 +08:00
|
|
|
def without_overrides
|
|
|
|
@without_overrides || self
|
|
|
|
end
|
|
|
|
|
2012-12-13 03:14:17 +08:00
|
|
|
def overridden_for(user)
|
|
|
|
AssignmentOverrideApplicator.assignment_overridden_for(self, user)
|
|
|
|
end
|
|
|
|
|
2014-02-12 06:11:25 +08:00
|
|
|
# All overrides, not just dates
|
|
|
|
def overrides_for(user)
|
|
|
|
AssignmentOverrideApplicator.overrides_for_assignment_and_user(self, user)
|
|
|
|
end
|
|
|
|
|
|
|
|
def overridden_for?(user)
|
|
|
|
overridden && (overridden_for_user == user)
|
2012-12-13 03:14:17 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
def has_overrides?
|
2014-10-30 02:28:13 +08:00
|
|
|
assignment_overrides.loaded? ? assignment_overrides.any? : assignment_overrides.exists?
|
2012-12-13 03:14:17 +08:00
|
|
|
end
|
|
|
|
|
make fancy midnight work for assignment overrides
also fixes an issue where some dates display as "Friday at 11:59pm" instead
of just "Friday"
Also does a little bit of refactoring and spec backfilling for the
override list presenter. The override list presenter now returns a much
more friendly list of "due date" hashes to the outside world to make it
easier to consume in views. Views don't have to format the dates by
passing in a hash anymore.
test plan:
- specs should pass
- as a teacher, create an assignment with overrides using the web
form. In one of the overrides, enter a day like March 1 at 12am.
- save the overrides
- Make sure fancy midnight works for lock dates and due dates, but not
unlock dates (12:00 am unlock date should show up as 12:00 am, not
11:59 pm)
- on the assignment's show page, you should just see "Friday", meaning
that the assignment is due at 11:59 pm on March 1.
- The "fancy midnight" scheme should work correctly for
assignments,quizzes,and discussion topics, including the default due
dates.
- Be sure to check that the dates show up correctly on the
assignment,quiz, and discussion show pages.
- Be sure to make an override that has a blank due_at, lock_at, and
unlock_at, but has a default due date, lock date, and unlock date.
The overrides should not inherit from the default due date (fixes
CNVS-4216)
fixes CNVS-4216, CNVS-4004, CNVS-3890
Change-Id: I8b5e10c074eb2a237a1298cb7def0cb32d3dcb7f
Reviewed-on: https://gerrit.instructure.com/18142
QA-Review: Amber Taniuchi <amber@instructure.com>
Tested-by: Jenkins <jenkins@instructure.com>
Reviewed-by: Simon Williams <simon@instructure.com>
2013-03-06 00:04:59 +08:00
|
|
|
def has_active_overrides?
|
2014-07-08 06:29:35 +08:00
|
|
|
assignment_overrides.active.exists?
|
make fancy midnight work for assignment overrides
also fixes an issue where some dates display as "Friday at 11:59pm" instead
of just "Friday"
Also does a little bit of refactoring and spec backfilling for the
override list presenter. The override list presenter now returns a much
more friendly list of "due date" hashes to the outside world to make it
easier to consume in views. Views don't have to format the dates by
passing in a hash anymore.
test plan:
- specs should pass
- as a teacher, create an assignment with overrides using the web
form. In one of the overrides, enter a day like March 1 at 12am.
- save the overrides
- Make sure fancy midnight works for lock dates and due dates, but not
unlock dates (12:00 am unlock date should show up as 12:00 am, not
11:59 pm)
- on the assignment's show page, you should just see "Friday", meaning
that the assignment is due at 11:59 pm on March 1.
- The "fancy midnight" scheme should work correctly for
assignments,quizzes,and discussion topics, including the default due
dates.
- Be sure to check that the dates show up correctly on the
assignment,quiz, and discussion show pages.
- Be sure to make an override that has a blank due_at, lock_at, and
unlock_at, but has a default due date, lock date, and unlock date.
The overrides should not inherit from the default due date (fixes
CNVS-4216)
fixes CNVS-4216, CNVS-4004, CNVS-3890
Change-Id: I8b5e10c074eb2a237a1298cb7def0cb32d3dcb7f
Reviewed-on: https://gerrit.instructure.com/18142
QA-Review: Amber Taniuchi <amber@instructure.com>
Tested-by: Jenkins <jenkins@instructure.com>
Reviewed-by: Simon Williams <simon@instructure.com>
2013-03-06 00:04:59 +08:00
|
|
|
end
|
|
|
|
|
2014-02-12 06:11:25 +08:00
|
|
|
def multiple_due_dates?
|
|
|
|
if overridden
|
|
|
|
!!multiple_due_dates_apply_to?(overridden_for_user)
|
|
|
|
else
|
|
|
|
raise "#{self.class.name} has not been overridden"
|
2012-12-13 03:14:17 +08:00
|
|
|
end
|
2014-02-12 06:11:25 +08:00
|
|
|
end
|
2012-12-13 03:14:17 +08:00
|
|
|
|
2014-02-12 06:11:25 +08:00
|
|
|
def multiple_due_dates_apply_to?(user)
|
|
|
|
return false if !context.multiple_sections?
|
|
|
|
return false if context.user_has_been_student?(user)
|
2012-12-13 03:14:17 +08:00
|
|
|
|
2014-02-12 06:11:25 +08:00
|
|
|
if context.user_has_been_observer?(user)
|
|
|
|
observed_student_due_dates(user).length > 1
|
|
|
|
elsif context.user_has_been_admin?(user)
|
|
|
|
dates = all_dates_visible_to(user)
|
|
|
|
dates && dates.map{ |hash| self.class.due_date_compare_value(hash[:due_at]) }.uniq.size > 1
|
2012-12-13 03:14:17 +08:00
|
|
|
elsif context.user_has_no_enrollments?(user)
|
2014-02-12 06:11:25 +08:00
|
|
|
all_due_dates.length > 1
|
2012-12-13 03:14:17 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def all_due_dates
|
2014-12-04 00:36:34 +08:00
|
|
|
due_at_overrides = assignment_overrides.loaded? ? assignment_overrides.select{|ao| ao.active? && ao.due_at_overridden} : assignment_overrides.active.overriding_due_at
|
|
|
|
dates = due_at_overrides.map(&:as_hash)
|
|
|
|
dates << base_due_date_hash unless differentiated_assignments_applies?
|
|
|
|
dates
|
2014-04-17 03:45:28 +08:00
|
|
|
end
|
|
|
|
|
make fancy midnight work for assignment overrides
also fixes an issue where some dates display as "Friday at 11:59pm" instead
of just "Friday"
Also does a little bit of refactoring and spec backfilling for the
override list presenter. The override list presenter now returns a much
more friendly list of "due date" hashes to the outside world to make it
easier to consume in views. Views don't have to format the dates by
passing in a hash anymore.
test plan:
- specs should pass
- as a teacher, create an assignment with overrides using the web
form. In one of the overrides, enter a day like March 1 at 12am.
- save the overrides
- Make sure fancy midnight works for lock dates and due dates, but not
unlock dates (12:00 am unlock date should show up as 12:00 am, not
11:59 pm)
- on the assignment's show page, you should just see "Friday", meaning
that the assignment is due at 11:59 pm on March 1.
- The "fancy midnight" scheme should work correctly for
assignments,quizzes,and discussion topics, including the default due
dates.
- Be sure to check that the dates show up correctly on the
assignment,quiz, and discussion show pages.
- Be sure to make an override that has a blank due_at, lock_at, and
unlock_at, but has a default due date, lock date, and unlock date.
The overrides should not inherit from the default due date (fixes
CNVS-4216)
fixes CNVS-4216, CNVS-4004, CNVS-3890
Change-Id: I8b5e10c074eb2a237a1298cb7def0cb32d3dcb7f
Reviewed-on: https://gerrit.instructure.com/18142
QA-Review: Amber Taniuchi <amber@instructure.com>
Tested-by: Jenkins <jenkins@instructure.com>
Reviewed-by: Simon Williams <simon@instructure.com>
2013-03-06 00:04:59 +08:00
|
|
|
def all_dates_visible_to(user)
|
2014-07-11 04:41:06 +08:00
|
|
|
if user.nil?
|
|
|
|
all_due_dates
|
|
|
|
elsif ObserverEnrollment.observed_students(context, user).any?
|
2014-02-12 06:11:25 +08:00
|
|
|
observed_student_due_dates(user)
|
|
|
|
elsif context.user_has_been_student?(user) || context.user_has_been_admin?(user) || context.user_has_been_observer?(user)
|
|
|
|
overrides = overrides_for(user)
|
|
|
|
overrides = overrides.map(&:as_hash)
|
2014-04-17 03:45:28 +08:00
|
|
|
unless differentiated_assignments_applies?
|
|
|
|
overrides << base_due_date_hash if overrides.empty? || context.user_has_been_admin?(user)
|
|
|
|
end
|
2014-02-12 06:11:25 +08:00
|
|
|
overrides
|
|
|
|
elsif context.user_has_no_enrollments?(user)
|
|
|
|
all_due_dates
|
2013-12-05 06:09:17 +08:00
|
|
|
end
|
make fancy midnight work for assignment overrides
also fixes an issue where some dates display as "Friday at 11:59pm" instead
of just "Friday"
Also does a little bit of refactoring and spec backfilling for the
override list presenter. The override list presenter now returns a much
more friendly list of "due date" hashes to the outside world to make it
easier to consume in views. Views don't have to format the dates by
passing in a hash anymore.
test plan:
- specs should pass
- as a teacher, create an assignment with overrides using the web
form. In one of the overrides, enter a day like March 1 at 12am.
- save the overrides
- Make sure fancy midnight works for lock dates and due dates, but not
unlock dates (12:00 am unlock date should show up as 12:00 am, not
11:59 pm)
- on the assignment's show page, you should just see "Friday", meaning
that the assignment is due at 11:59 pm on March 1.
- The "fancy midnight" scheme should work correctly for
assignments,quizzes,and discussion topics, including the default due
dates.
- Be sure to check that the dates show up correctly on the
assignment,quiz, and discussion show pages.
- Be sure to make an override that has a blank due_at, lock_at, and
unlock_at, but has a default due date, lock date, and unlock date.
The overrides should not inherit from the default due date (fixes
CNVS-4216)
fixes CNVS-4216, CNVS-4004, CNVS-3890
Change-Id: I8b5e10c074eb2a237a1298cb7def0cb32d3dcb7f
Reviewed-on: https://gerrit.instructure.com/18142
QA-Review: Amber Taniuchi <amber@instructure.com>
Tested-by: Jenkins <jenkins@instructure.com>
Reviewed-by: Simon Williams <simon@instructure.com>
2013-03-06 00:04:59 +08:00
|
|
|
end
|
|
|
|
|
2014-02-12 06:11:25 +08:00
|
|
|
def observed_student_due_dates(user)
|
|
|
|
dates = ObserverEnrollment.observed_students(context, user).map do |student, enrollments|
|
|
|
|
self.all_dates_visible_to(student)
|
|
|
|
end
|
|
|
|
dates.flatten.uniq
|
2012-12-13 03:14:17 +08:00
|
|
|
end
|
|
|
|
|
2013-08-21 03:33:02 +08:00
|
|
|
def dates_hash_visible_to(user)
|
|
|
|
all_dates = all_dates_visible_to(user)
|
|
|
|
|
2014-02-12 06:11:25 +08:00
|
|
|
if all_dates
|
2014-04-17 03:45:28 +08:00
|
|
|
# remove base if all sections are set
|
2014-02-12 06:11:25 +08:00
|
|
|
overrides = all_dates.select { |d| d[:set_type] == 'CourseSection' }
|
|
|
|
if overrides.count > 0 && overrides.count == context.active_course_sections.count
|
|
|
|
all_dates.delete_if {|d| d[:base] }
|
|
|
|
end
|
2013-08-21 03:33:02 +08:00
|
|
|
|
2014-02-12 06:11:25 +08:00
|
|
|
formatted_dates_hash(all_dates)
|
|
|
|
else
|
|
|
|
[due_date_hash]
|
|
|
|
end
|
2014-02-13 17:23:06 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
def formatted_dates_hash(dates)
|
2014-05-29 04:54:41 +08:00
|
|
|
return [] unless dates.present?
|
|
|
|
|
2014-02-13 17:23:06 +08:00
|
|
|
dates = dates.sort_by do |date|
|
2013-08-21 03:33:02 +08:00
|
|
|
due_at = date[:due_at]
|
2014-03-18 04:54:26 +08:00
|
|
|
[ due_at.present? ? CanvasSort::First : CanvasSort::Last, due_at.presence || CanvasSort::First ]
|
2013-08-21 03:33:02 +08:00
|
|
|
end
|
|
|
|
|
2014-03-05 00:02:02 +08:00
|
|
|
dates.map { |h| h.slice(:id, :due_at, :unlock_at, :lock_at, :title, :base) }
|
2013-08-21 03:33:02 +08:00
|
|
|
end
|
|
|
|
|
2012-12-13 03:14:17 +08:00
|
|
|
def due_date_hash
|
make fancy midnight work for assignment overrides
also fixes an issue where some dates display as "Friday at 11:59pm" instead
of just "Friday"
Also does a little bit of refactoring and spec backfilling for the
override list presenter. The override list presenter now returns a much
more friendly list of "due date" hashes to the outside world to make it
easier to consume in views. Views don't have to format the dates by
passing in a hash anymore.
test plan:
- specs should pass
- as a teacher, create an assignment with overrides using the web
form. In one of the overrides, enter a day like March 1 at 12am.
- save the overrides
- Make sure fancy midnight works for lock dates and due dates, but not
unlock dates (12:00 am unlock date should show up as 12:00 am, not
11:59 pm)
- on the assignment's show page, you should just see "Friday", meaning
that the assignment is due at 11:59 pm on March 1.
- The "fancy midnight" scheme should work correctly for
assignments,quizzes,and discussion topics, including the default due
dates.
- Be sure to check that the dates show up correctly on the
assignment,quiz, and discussion show pages.
- Be sure to make an override that has a blank due_at, lock_at, and
unlock_at, but has a default due date, lock date, and unlock date.
The overrides should not inherit from the default due date (fixes
CNVS-4216)
fixes CNVS-4216, CNVS-4004, CNVS-3890
Change-Id: I8b5e10c074eb2a237a1298cb7def0cb32d3dcb7f
Reviewed-on: https://gerrit.instructure.com/18142
QA-Review: Amber Taniuchi <amber@instructure.com>
Tested-by: Jenkins <jenkins@instructure.com>
Reviewed-by: Simon Williams <simon@instructure.com>
2013-03-06 00:04:59 +08:00
|
|
|
hash = { :due_at => due_at, :unlock_at => unlock_at, :lock_at => lock_at }
|
2012-12-13 03:14:17 +08:00
|
|
|
if self.is_a?(Assignment)
|
|
|
|
hash.merge!({ :all_day => all_day, :all_day_date => all_day_date })
|
make fancy midnight work for assignment overrides
also fixes an issue where some dates display as "Friday at 11:59pm" instead
of just "Friday"
Also does a little bit of refactoring and spec backfilling for the
override list presenter. The override list presenter now returns a much
more friendly list of "due date" hashes to the outside world to make it
easier to consume in views. Views don't have to format the dates by
passing in a hash anymore.
test plan:
- specs should pass
- as a teacher, create an assignment with overrides using the web
form. In one of the overrides, enter a day like March 1 at 12am.
- save the overrides
- Make sure fancy midnight works for lock dates and due dates, but not
unlock dates (12:00 am unlock date should show up as 12:00 am, not
11:59 pm)
- on the assignment's show page, you should just see "Friday", meaning
that the assignment is due at 11:59 pm on March 1.
- The "fancy midnight" scheme should work correctly for
assignments,quizzes,and discussion topics, including the default due
dates.
- Be sure to check that the dates show up correctly on the
assignment,quiz, and discussion show pages.
- Be sure to make an override that has a blank due_at, lock_at, and
unlock_at, but has a default due date, lock date, and unlock date.
The overrides should not inherit from the default due date (fixes
CNVS-4216)
fixes CNVS-4216, CNVS-4004, CNVS-3890
Change-Id: I8b5e10c074eb2a237a1298cb7def0cb32d3dcb7f
Reviewed-on: https://gerrit.instructure.com/18142
QA-Review: Amber Taniuchi <amber@instructure.com>
Tested-by: Jenkins <jenkins@instructure.com>
Reviewed-by: Simon Williams <simon@instructure.com>
2013-03-06 00:04:59 +08:00
|
|
|
elsif self.assignment
|
|
|
|
hash.merge!({ :all_day => assignment.all_day, :all_day_date => assignment.all_day_date})
|
2012-12-13 03:14:17 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
if @applied_overrides && override = @applied_overrides.find { |o| o.due_at == due_at }
|
|
|
|
hash[:override] = override
|
|
|
|
hash[:title] = override.title
|
|
|
|
end
|
|
|
|
|
|
|
|
hash
|
|
|
|
end
|
|
|
|
|
2014-02-12 06:11:25 +08:00
|
|
|
def base_due_date_hash
|
|
|
|
without_overrides.due_date_hash.merge(:base => true)
|
2012-12-29 05:02:21 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
module ClassMethods
|
|
|
|
def due_date_compare_value(date)
|
|
|
|
# due dates are considered equal if they're the same up to the minute
|
|
|
|
date.to_i / 60
|
|
|
|
end
|
|
|
|
|
|
|
|
def due_dates_equal?(date1, date2)
|
|
|
|
due_date_compare_value(date1) == due_date_compare_value(date2)
|
|
|
|
end
|
|
|
|
end
|
2012-12-20 04:38:12 +08:00
|
|
|
end
|