Skip to content

Commit 9837f4d

Browse files
authored
refactor: fix timezones for marking sessions (doubtfire-lms#524)
* refactor: accept requested timezone from client to filter sessions for * fix: get correct day * fix: default timezone if nil * chore: remove comments
1 parent dce3b26 commit 9837f4d

File tree

6 files changed

+45
-19
lines changed

6 files changed

+45
-19
lines changed

app/api/marking_sessions_api.rb

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class MarkingSessionsApi < Grape::API
1717
requires :unit_id, type: Integer, desc: "Unit ID"
1818
optional :start_date, type: Date, desc: "Start date for analytics"
1919
optional :end_date, type: Date, desc: "End date for analytics"
20+
optional :timezone, type: String, desc: "Requested timezone to search sessions for"
2021
end
2122
get '/units/:unit_id/marking_sessions' do
2223
unit = Unit.find(params[:unit_id])
@@ -25,8 +26,20 @@ class MarkingSessionsApi < Grape::API
2526
error!({ error: "You are not authorised to view marking sessions for this unit" }, 403)
2627
end
2728

28-
end_date = (params[:end_date] || Time.zone.today).end_of_day
29-
start_date = (params[:start_date] || (end_date - 7.days)).beginning_of_day
29+
tz = Time.zone
30+
tz = ActiveSupport::TimeZone[params[:timezone]] if params[:timezone]
31+
32+
end_date = if params[:end_date].present?
33+
tz.parse(params[:end_date].to_s).end_of_day
34+
else
35+
tz.today.end_of_day
36+
end
37+
38+
start_date = if params[:start_date].present?
39+
tz.parse(params[:start_date].to_s).beginning_of_day
40+
else
41+
(end_date - 7.days).beginning_of_day
42+
end
3043

3144
sessions = MarkingSession
3245
.includes(:session_activities)

app/api/units_api.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,7 @@ class UnitsApi < Grape::API
391391
params do
392392
optional :start_date, type: Date, desc: 'Filter sessions starting from this date'
393393
optional :end_date, type: Date, desc: 'Filter sessions up to this date'
394+
optional :timezone, type: String, desc: 'Requested timezone to search sessions for'
394395
optional :ignore_sessions_during_tutorials, type: Boolean, desc: 'Filter out sessions that occured during tutorials'
395396
end
396397
get '/csv/units/:id/tutor_times_summary' do
@@ -405,6 +406,7 @@ class UnitsApi < Grape::API
405406
unit.id,
406407
params[:start_date]&.to_s,
407408
params[:end_date]&.to_s,
409+
params[:timezone]&.to_s,
408410
ignore_sessions_during_tutorials
409411
)
410412

app/models/unit.rb

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2723,10 +2723,27 @@ def move_files_to_archive
27232723
end
27242724
end
27252725

2726-
def get_tutor_times(start_date: nil, end_date: nil, ignore_sessions_during_tutorials: false)
2726+
def get_tutor_times(start_date: nil, end_date: nil, timezone: nil, ignore_sessions_during_tutorials: false)
27272727
query = MarkingSession.where(unit_id: id)
2728-
query = query.where('start_time >= ?', start_date.beginning_of_day) if start_date
2729-
query = query.where('start_time <= ?', end_date.end_of_day) if end_date
2728+
2729+
2730+
tz = Time.zone
2731+
tz = ActiveSupport::TimeZone[timezone] if timezone
2732+
2733+
end_date = if end_date.present?
2734+
tz.parse(end_date.to_s).end_of_day
2735+
else
2736+
tz.today.end_of_day
2737+
end
2738+
2739+
start_date = if start_date.present?
2740+
tz.parse(start_date.to_s).beginning_of_day
2741+
else
2742+
(end_date - 7.days).beginning_of_day
2743+
end
2744+
2745+
query = query.where(start_time: start_date..end_date)
2746+
27302747

27312748
query = query.where(during_tutorial: false) if ignore_sessions_during_tutorials
27322749

@@ -2782,8 +2799,8 @@ def get_tutor_times(start_date: nil, end_date: nil, ignore_sessions_during_tutor
27822799
end
27832800
end
27842801

2785-
def get_tutor_times_csv(start_date: nil, end_date: nil, ignore_sessions_during_tutorials: false)
2786-
summary = get_tutor_times(start_date: start_date, end_date: end_date, ignore_sessions_during_tutorials: ignore_sessions_during_tutorials)
2802+
def get_tutor_times_csv(start_date: nil, end_date: nil, timezone: nil, ignore_sessions_during_tutorials: false)
2803+
summary = get_tutor_times(start_date: start_date, end_date: end_date, timezone: timezone, ignore_sessions_during_tutorials: ignore_sessions_during_tutorials)
27872804

27882805
CSV.generate() do |csv|
27892806
# Add headers

app/services/session_tracker.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def self.record_assessment_activity(action:, user:, project:, ip_address:, task:
1818
project_id: project.id,
1919
task_id: task&.id,
2020
task_definition_id: task&.task_definition_id,
21-
created_at: DateTime.now
21+
created_at: Time.zone.now
2222
)
2323

2424
session.update_session_details

app/sidekiq/download_unit_tutor_times_summary_job.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class DownloadUnitTutorTimesSummaryJob
1414
on_conflict: :reject,
1515
retry: false
1616

17-
def perform(unit_id, start_date, end_date, ignore_sessions_during_tutorials)
17+
def perform(unit_id, start_date, end_date, timezone, ignore_sessions_during_tutorials)
1818
start_date = Date.parse(start_date) if start_date
1919
end_date = Date.parse(end_date) if end_date
2020
logger.info "Starting unit tutor times summary csv download..."
@@ -23,7 +23,7 @@ def perform(unit_id, start_date, end_date, ignore_sessions_during_tutorials)
2323
total(1)
2424

2525
unit = Unit.find(unit_id)
26-
csv = unit.get_tutor_times_csv(start_date: start_date, end_date: end_date, ignore_sessions_during_tutorials: ignore_sessions_during_tutorials)
26+
csv = unit.get_tutor_times_csv(start_date: start_date, end_date: end_date, timezone: timezone, ignore_sessions_during_tutorials: ignore_sessions_during_tutorials)
2727

2828
store(result: csv)
2929

test/api/marking_sessions_api_test.rb

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -274,13 +274,8 @@ def test_get_marking_sessions
274274

275275
def test_marking_sessions_tutorial_split
276276
unit = FactoryBot.create(:unit, student_count: 2, task_count: 2)
277-
# convenor = FactoryBot.create(:user, :convenor)
278277
unit_role = unit.staff.first
279278
convenor = unit_role.user
280-
# convenor = user
281-
# unit_role = unit.employ_staff(convenor, Role.convenor)
282-
283-
# add_auth_header_for(user: convenor)
284279

285280
activity_type = ActivityType.find_by(name: "Feedback")
286281
activity_type = ActivityType.create(name: "Feedback", abbreviation: "Feedback") if activity_type.nil?
@@ -375,8 +370,7 @@ def test_marking_sessions_tutorial_split
375370
assert_equal expected_marking_sessions_during_tutorial, MarkingSession.where(during_tutorial: true).count
376371
assert_equal expected_marking_sessions_outside_tutorial, MarkingSession.where(during_tutorial: false).count
377372

378-
thursday_offset = (today.wday - 4) % 7
379-
thursday = today - thursday_offset.days
373+
thursday = wednesday + 1.day
380374

381375
start_time = thursday.in_time_zone.change(hour: 12, min: 4) # 12:05pm
382376
end_time = thursday.in_time_zone.change(hour: 15, min: 0) # 3:00pm
@@ -450,8 +444,8 @@ def test_marking_session_csv_data
450444
)
451445
end
452446

453-
summary_without_tutorials = unit.get_tutor_times(start_date: Time.zone.now - 1.week, end_date: Time.zone.now + 1.week, ignore_sessions_during_tutorials: true)
454-
summary_with_tutorials = unit.get_tutor_times(start_date: Time.zone.now - 1.week, end_date: Time.zone.now + 1.week, ignore_sessions_during_tutorials: false)
447+
summary_without_tutorials = unit.get_tutor_times(start_date: Time.zone.now - 1.week, end_date: Time.zone.now + 1.week, timezone: Time.zone, ignore_sessions_during_tutorials: true)
448+
summary_with_tutorials = unit.get_tutor_times(start_date: Time.zone.now - 1.week, end_date: Time.zone.now + 1.week, timezone: Time.zone, ignore_sessions_during_tutorials: false)
455449

456450
# 10 sessions, 30 minutes each
457451
assert_equal 300, summary_without_tutorials.first[:total_minutes]

0 commit comments

Comments
 (0)