diff --git a/ietf/meeting/tests_js.py b/ietf/meeting/tests_js.py index 1c1447a79..a407d5db1 100644 --- a/ietf/meeting/tests_js.py +++ b/ietf/meeting/tests_js.py @@ -917,7 +917,7 @@ class WeekviewTests(MeetingTestCase): return expected_items def test_timezone_default(self): - """Week view should show local times by default""" + """Week view should show UTC times by default""" self.assertNotEqual(self.meeting.time_zone.lower(), 'utc', 'Cannot test local time weekview because meeting is using UTC time.') self.login() @@ -929,8 +929,8 @@ class WeekviewTests(MeetingTestCase): expected_name = item.timeslot.name else: expected_name = item.session.group.name - expected_time = '-'.join([item.timeslot.local_start_time().strftime('%H%M'), - item.timeslot.local_end_time().strftime('%H%M')]) + expected_time = '-'.join([item.timeslot.utc_start_time().strftime('%H%M'), + item.timeslot.utc_end_time().strftime('%H%M')]) WebDriverWait(self.driver, 2).until( expected_conditions.presence_of_element_located( (By.XPATH, @@ -974,7 +974,7 @@ class WeekviewTests(MeetingTestCase): def test_event_wrapping(self): """Events that overlap midnight should be shown on both days - This assumes that the meeting is in America/New_York timezone. + This assumes that the meeting is in US/Eastern timezone. """ def _assert_wrapped(displayed, expected_time_string): self.assertEqual(len(displayed), 2) @@ -995,6 +995,9 @@ class WeekviewTests(MeetingTestCase): self.assertIn(expected_time_string, first_parent.text) duration = datetime.timedelta(minutes=120) # minutes + local_tz = self.meeting.time_zone + self.assertEqual(local_tz.lower(), 'us/eastern', + 'Test logic error - meeting local time zone must be US/Eastern') # Session during a single day in meeting local time but multi-day UTC # Compute a time that overlaps midnight, UTC, but won't when shifted to a local time zone @@ -1046,7 +1049,7 @@ class WeekviewTests(MeetingTestCase): self.login() # Test in meeting local time - self.driver.get(self.absreverse('ietf.meeting.views.week_view')) + self.driver.get(self.absreverse('ietf.meeting.views.week_view') + '?tz=%s' % local_tz.lower()) time_string = '-'.join([daytime_timeslot.local_start_time().strftime('%H%M'), daytime_timeslot.local_end_time().strftime('%H%M')]) diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index c50abde48..ebe06a0ad 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -1765,7 +1765,6 @@ def week_view(request, num=None, name=None, owner=None): return render(request, "meeting/week-view.html", { "items": json.dumps(items), - "timezone": meeting.time_zone, }) @role_required('Area Director','Secretariat','IAB') diff --git a/ietf/static/ietf/js/agenda/timezone.js b/ietf/static/ietf/js/agenda/timezone.js index 914bc8eb8..22f04175a 100644 --- a/ietf/static/ietf/js/agenda/timezone.js +++ b/ietf/static/ietf/js/agenda/timezone.js @@ -1,3 +1,6 @@ +// Callback for timezone change - called after current_timezone is updated +var timezone_change_callback; + // Initialize moments function initialize_moments() { var times=$('span.time') @@ -195,7 +198,9 @@ function update_times(newtz) { }); update_tooltips_all(); update_clock(); - // update_calendar(agenda_filter.get_filter()) + if (timezone_change_callback) { + timezone_change_callback(newtz); + } } // Highlight ongoing based on the current time @@ -253,3 +258,7 @@ function init_timers() { setInterval(function() { update_tooltips_all(); }, 3600000 / speedup); } +// Register a callback for timezone change +function set_tz_change_callback(cb) { + timezone_change_callback = cb; +} \ No newline at end of file diff --git a/ietf/templates/meeting/agenda.html b/ietf/templates/meeting/agenda.html index 00674d159..407932756 100644 --- a/ietf/templates/meeting/agenda.html +++ b/ietf/templates/meeting/agenda.html @@ -342,7 +342,9 @@ <script src="{% static 'ietf/js/agenda/agenda_filter.js' %}"></script> <script> - // Update the agenda display with specified filters + var current_timezone = 'UTC'; + + // Update the agenda display with specified filters function update_agenda_display(filter_params) { var agenda_rows=$('[id^="row-"]') @@ -380,46 +382,44 @@ } } - function update_weekview(filter_params) { - var weekview = $("#weekview"); - - if (!agenda_filter.filtering_is_enabled(filter_params)) { - weekview.addClass("hidden"); - return; - } - - // Filtering is enabled - weekview.removeClass("hidden"); - - var wv_iframe = document.getElementById('weekview'); - var wv_window = wv_iframe.contentWindow; - var queryparams = window.location.search; - {% if "-utc" in request.path %} - if (queryparams) { - queryparams += '&tz=utc'; - } else { - queryparams = '?tz=utc'; - } - {% endif %} - var new_url = 'week-view.html' + queryparams; - if (wv_iframe.src && wv_window.history && wv_window.history.replaceState) { - wv_window.history.replaceState({}, '', new_url); - wv_window.redraw_weekview(); - } else { - // either have not yet loaded the iframe or we do not support history replacement - wv_iframe.src = new_url; - } - } - + function update_weekview(filter_params) { + var weekview = $("#weekview"); + if (agenda_filter.filtering_is_enabled(filter_params)) { + weekview.removeClass("hidden"); + } else { + weekview.addClass("hidden"); + } + update_weekview_display(); + } + + function update_weekview_display() { + var weekview = $("#weekview"); + if (!weekview.hasClass('hidden')) { + var queryparams = window.location.search; + if (queryparams) { + queryparams += '&tz=' + current_timezone.toLowerCase(); + } else { + queryparams = '?tz=' + current_timezone.toLowerCase(); + } + var new_url = 'week-view.html' + queryparams; + var wv_iframe = document.getElementById('weekview'); + var wv_window = wv_iframe.contentWindow; + if (wv_iframe.src && wv_window.history && wv_window.history.replaceState) { + wv_window.history.replaceState({}, '', new_url); + wv_window.redraw_weekview(); + } else { + // either have not yet loaded the iframe or we do not support history replacement + wv_iframe.src = new_url; + } + } + } + function update_view(filter_params) { update_agenda_display(filter_params); update_weekview(filter_params) update_ical_links(filter_params) } - agenda_filter.set_update_callback(update_view); - agenda_filter.enable(); - /** * Retrieve and display materials for a session * @@ -519,7 +519,6 @@ // Get meeting and local times, initialize timezone system meeting_timezone = "{{timezone}}"; local_timezone = moment.tz.guess(); - current_timezone = 'UTC'; {% if "-utc" in request.path %} timezone_init('UTC'); {% else %} @@ -528,5 +527,9 @@ init_timers(); + set_tz_change_callback(update_weekview_display); + agenda_filter.set_update_callback(update_view); + agenda_filter.enable(); + </script> {% endblock %} diff --git a/ietf/templates/meeting/week-view.html b/ietf/templates/meeting/week-view.html index c91fa8eda..dfadb64d5 100644 --- a/ietf/templates/meeting/week-view.html +++ b/ietf/templates/meeting/week-view.html @@ -601,8 +601,8 @@ // Set up events for drawing the calendar function redraw_weekview() { var query_params = agenda_filter.parse_query_params(window.location.search); - var timezone_name = query_params.tz || '{{ timezone }}'; - + var timezone_name = query_params.tz || 'utc'; + items = prepare_items(all_items, timezone_name); draw_calendar(items, agenda_filter.get_filter_params(query_params)); }