* refactor: replace datetime.now with timezone.now * refactor: migrate model fields to use timezone.now as default * refactor: replace datetime.today with timezone.now datetime.datetime.today() is equivalent to datetime.datetime.now(); both return a naive datetime with the current local time. * refactor: rephrase datetime.now(tz) as timezone.now().astimezone(tz) This is effectively the same, but is less likely to encourage accidental use of naive datetimes. * refactor: revert datetime.today() change to old migrations * refactor: change a missed datetime.now to timezone.now * chore: renumber timezone_now migration * chore: add migration to change timestamps to UTC * refactor: move tz instantiation/caching from TimeSlot to Meeting * fix: assume utc if meeting.time_zone is blank * chore: make datetime.combine() calls tz aware in the meeting app * ci: correctly use meeting.tz in TimeSlotFactory * chore: compute TimeSlot utc / local times assuming tz-aware times * chore: use tzaware math for agenda editor timeslot layout * chore: fill in Meeting.time_zone where it is blank Nearly all interim meetings on or before 2016-07-01 have blank time_zone values. This migration fills these in with PST8PDT. * chore: disallow blank Meeting.time_zone value * refactor: no need to handle blank time_zone case in TZ migration * refactor: remove now-unnecessary checks that meeting has time_zone * chore: fix timezone handling in agenda.ics and Meeting.updated() * chore: fix tz handling in interim_request_details, exercise in tests * chore: fix timezone handling for test_interim_send_announcement * chore: fix timezone handling in agenda_json() * chore: fix timezone handling in old agenda * chore: fix timezone handling for EditTimeslotsTests * refactor: refactor a few fixes for more consistent timezone handling * chore: add timezone info to timestamps in fixtures * chore: remove naive datetime warnings found in meetings.tests_views * chore: fix a few more test failures in meetings.tests_views All tests in meetings.tests_views now passing * chore: remove unused import * chore: fix timezone handling in test_schedule_generator.py * chore: fix timezone handling affecting meeting.tests_js * chore: fix timeslot test bug when local date != UTC date * test: fix a few failing tests, all meetings tests now pass (for me, anyway) * chore: renumber migrations * chore: update timestamp conversion migration The django-celery-beat package introduces tables with timestamp columns. These columns are stored in CELERY_TIMEZONE. Because we run with this set to UTC, the migration ignores these columns. * chore: fix pytz-related change in migration * chore: remove duplicate migrations * chore: remove CELERY_BEAT_TZ_AWARE setting now that USE_TZ is True * test: avoid failure in test with bogus timezone
79 lines
3.8 KiB
Python
79 lines
3.8 KiB
Python
# Copyright The IETF Trust 2021, All Rights Reserved
|
|
# -*- coding: utf-8 -*-
|
|
"""Tests of models in the Meeting application"""
|
|
import datetime
|
|
|
|
from mock import patch
|
|
|
|
from ietf.meeting.factories import MeetingFactory, SessionFactory
|
|
from ietf.stats.factories import MeetingRegistrationFactory
|
|
from ietf.utils.test_utils import TestCase
|
|
|
|
|
|
class MeetingTests(TestCase):
|
|
def test_get_attendance_pre110(self):
|
|
"""Pre-110 meetings do not calculate attendance"""
|
|
meeting = MeetingFactory(type_id='ietf', number='109')
|
|
MeetingRegistrationFactory.create_batch(3, meeting=meeting, reg_type='')
|
|
MeetingRegistrationFactory.create_batch(4, meeting=meeting, reg_type='remote')
|
|
MeetingRegistrationFactory.create_batch(5, meeting=meeting, reg_type='in_person')
|
|
self.assertIsNone(meeting.get_attendance())
|
|
|
|
def test_get_attendance(self):
|
|
"""Post-110 meetings do calculate attendance"""
|
|
meeting = MeetingFactory(type_id='ietf', number='110')
|
|
|
|
# start with attendees that should be ignored
|
|
MeetingRegistrationFactory.create_batch(3, meeting=meeting, reg_type='')
|
|
MeetingRegistrationFactory(meeting=meeting, reg_type='', attended=False)
|
|
attendance = meeting.get_attendance()
|
|
self.assertIsNotNone(attendance)
|
|
self.assertEqual(attendance.online, 0)
|
|
self.assertEqual(attendance.onsite, 0)
|
|
|
|
# add online attendees with at least one who registered but did not attend
|
|
MeetingRegistrationFactory.create_batch(4, meeting=meeting, reg_type='remote')
|
|
MeetingRegistrationFactory(meeting=meeting, reg_type='remote', attended=False)
|
|
attendance = meeting.get_attendance()
|
|
self.assertIsNotNone(attendance)
|
|
self.assertEqual(attendance.online, 4)
|
|
self.assertEqual(attendance.onsite, 0)
|
|
|
|
# and the same for onsite attendees
|
|
MeetingRegistrationFactory.create_batch(5, meeting=meeting, reg_type='in_person')
|
|
MeetingRegistrationFactory(meeting=meeting, reg_type='in_person', attended=False)
|
|
attendance = meeting.get_attendance()
|
|
self.assertIsNotNone(attendance)
|
|
self.assertEqual(attendance.online, 4)
|
|
self.assertEqual(attendance.onsite, 5)
|
|
|
|
# and once more after removing all the online attendees
|
|
meeting.meetingregistration_set.filter(reg_type='remote').delete()
|
|
attendance = meeting.get_attendance()
|
|
self.assertIsNotNone(attendance)
|
|
self.assertEqual(attendance.online, 0)
|
|
self.assertEqual(attendance.onsite, 5)
|
|
|
|
def test_vtimezone(self):
|
|
# normal time zone that should have a zoneinfo file
|
|
meeting = MeetingFactory(type_id='ietf', time_zone='America/Los_Angeles', populate_schedule=False)
|
|
vtz = meeting.vtimezone()
|
|
self.assertIsNotNone(vtz)
|
|
self.assertGreater(len(vtz), 0)
|
|
# time zone that does not have a zoneinfo file should return None
|
|
meeting = MeetingFactory(type_id='ietf', time_zone='Fake/Time_Zone', populate_schedule=False)
|
|
vtz = meeting.vtimezone()
|
|
self.assertIsNone(vtz)
|
|
# ioerror trying to read zoneinfo should return None
|
|
meeting = MeetingFactory(type_id='ietf', time_zone='America/Los_Angeles', populate_schedule=False)
|
|
with patch('ietf.meeting.models.io.open', side_effect=IOError):
|
|
vtz = meeting.vtimezone()
|
|
self.assertIsNone(vtz)
|
|
|
|
|
|
class SessionTests(TestCase):
|
|
def test_chat_archive_url_with_jabber(self):
|
|
# datatracker 8.8.0 rolled out on 2022-07-15. Before that, chat logs were jabber logs hosted at www.ietf.org.
|
|
session_with_jabber = SessionFactory(group__acronym='fakeacronym', meeting__date=datetime.date(2022,7,14))
|
|
self.assertEqual(session_with_jabber.chat_archive_url(), 'https://www.ietf.org/jabber/logs/fakeacronym?C=M;O=D')
|