@@ -8,9 +8,12 @@ def initialize(obj, time_converter)
88 @time_converter = time_converter
99 end
1010
11- def generate_events ( faculty_semester , semester_period )
12- teaching_time = generate_teaching_time
13- event_periods = semester_period . plan ( teaching_time )
11+ def generate_events ( faculty_semester , semester_period , weeks_dates )
12+ teaching_times = generate_teaching_times ( weeks_dates )
13+ # Count event periods in current semester period in all week intervals.
14+ event_periods = teaching_times . flat_map do |teaching_time |
15+ semester_period . plan ( teaching_time )
16+ end
1417 create_events ( event_periods , faculty_semester ) . tap do |events |
1518 events . map { |e | e . deleted = !!deleted_at }
1619 end
@@ -32,21 +35,41 @@ def day
3235 end
3336
3437 private
38+
3539 attr_reader :time_converter
3640
3741 def filter_extra_events ( all_events , planned_events )
3842 planned_event_ids = planned_events . map ( &:id )
3943 all_events . find_all { |evt | !planned_event_ids . include? ( evt . id ) }
4044 end
4145
42- def generate_teaching_time
43- teaching_period = if start_time && end_time
44- # Timetable slot has start time and end time already specified.
45- Period . new ( start_time , end_time )
46- else
47- time_converter . convert_time ( first_hour , duration )
46+ def generate_teaching_times ( weeks_dates )
47+ teaching_period = generate_teaching_period
48+
49+ if weeks . blank?
50+ # Timetable slot with even/odd week parity.
51+ [ Sirius ::TeachingTime . new ( teaching_period : teaching_period , day : day , parity : parity ) ]
52+ else
53+ # Timetable slot with specified weeks.
54+ weeks_intervals . map do |first , last |
55+ start_date = weeks_dates [ first - 1 ] . first
56+ end_date = weeks_dates [ last - 1 ] . last
57+ Sirius ::TeachingTime . new ( teaching_period : teaching_period , day : day , start_date : start_date , end_date : end_date )
4858 end
49- Sirius ::TeachingTime . new ( teaching_period : teaching_period , day : day , parity : parity )
59+ end
60+ end
61+
62+ def generate_teaching_period
63+ if start_time && end_time
64+ # Timetable slot has start time and end time already specified.
65+ Period . new ( start_time , end_time )
66+ else
67+ time_converter . convert_time ( first_hour , duration )
68+ end
69+ end
70+
71+ def weeks_intervals
72+ weeks . slice_when { |i , j | i + 1 != j } . map ( &:minmax )
5073 end
5174
5275 def create_events ( event_periods , faculty_semester )
0 commit comments