diff --git a/ietf/nomcom/management/commands/send_reminders.py b/ietf/nomcom/management/commands/send_reminders.py index 3dce0a361..bc1042543 100644 --- a/ietf/nomcom/management/commands/send_reminders.py +++ b/ietf/nomcom/management/commands/send_reminders.py @@ -2,13 +2,14 @@ # -*- coding: utf-8 -*- -import datetime import syslog from django.core.management.base import BaseCommand from ietf.nomcom.models import NomCom, NomineePosition from ietf.nomcom.utils import send_accept_reminder_to_nominee,send_questionnaire_reminder_to_nominee +from ietf.utils.timezone import date_today + def log(message): syslog.syslog(message) @@ -27,10 +28,10 @@ class Command(BaseCommand): for nomcom in NomCom.objects.filter(group__state__slug='active'): nps = NomineePosition.objects.filter(nominee__nomcom=nomcom,nominee__duplicated__isnull=True) for nominee_position in nps.pending(): - if is_time_to_send(nomcom, datetime.date.today(), nominee_position.time.date()): + if is_time_to_send(nomcom, date_today(), nominee_position.time.date()): send_accept_reminder_to_nominee(nominee_position) log('Sent accept reminder to %s' % nominee_position.nominee.email.address) for nominee_position in nps.accepted().without_questionnaire_response(): - if is_time_to_send(nomcom, datetime.date.today(), nominee_position.time.date()): + if is_time_to_send(nomcom, date_today(), nominee_position.time.date()): send_questionnaire_reminder_to_nominee(nominee_position) log('Sent questionnaire reminder to %s' % nominee_position.nominee.email.address) diff --git a/ietf/nomcom/tests.py b/ietf/nomcom/tests.py index 5c52fb465..86e8c6efe 100644 --- a/ietf/nomcom/tests.py +++ b/ietf/nomcom/tests.py @@ -50,7 +50,7 @@ from ietf.stats.models import MeetingRegistration from ietf.stats.factories import MeetingRegistrationFactory from ietf.utils.mail import outbox, empty_outbox, get_payload_text from ietf.utils.test_utils import login_testing_unauthorized, TestCase, unicontent -from ietf.utils.timezone import datetime_today, datetime_from_date, DEADLINE_TZINFO +from ietf.utils.timezone import date_today, datetime_today, datetime_from_date, DEADLINE_TZINFO client_test_cert_files = None @@ -1130,7 +1130,7 @@ class ReminderTest(TestCase): def test_is_time_to_send(self): self.nomcom.reminder_interval = 4 - today = datetime.date.today() + today = date_today() self.assertTrue(is_time_to_send(self.nomcom,today+datetime.timedelta(days=4),today)) for delta in range(4): self.assertFalse(is_time_to_send(self.nomcom,today+datetime.timedelta(days=delta),today)) @@ -1236,7 +1236,7 @@ class InactiveNomcomTests(TestCase): self.assertIn( 'closed', q('.alert-warning').text()) def test_acceptance_closed(self): - today = datetime.date.today().strftime('%Y%m%d') + today = date_today().strftime('%Y%m%d') pid = self.nc.position_set.first().nomineeposition_set.order_by('pk').first().id url = reverse('ietf.nomcom.views.process_nomination_status', kwargs = { 'year' : self.nc.year(), @@ -1892,7 +1892,7 @@ Junk body for testing assert year >= 1990 return (year-1985)*3+2 # Create meetings to ensure we have the 'last 5' - meeting_start = first_meeting_of_year(datetime.date.today().year-2) + meeting_start = first_meeting_of_year(date_today().year-2) # Populate the meeting registration records for number in range(meeting_start, meeting_start+10): meeting = MeetingFactory.create(type_id='ietf', number=number) diff --git a/ietf/nomcom/utils.py b/ietf/nomcom/utils.py index 64afe2946..eec4fc5ee 100644 --- a/ietf/nomcom/utils.py +++ b/ietf/nomcom/utils.py @@ -33,7 +33,7 @@ from ietf.utils.pipe import pipe from ietf.utils.mail import send_mail_text, send_mail, get_payload_text from ietf.utils.log import log from ietf.person.name import unidecode_name -from ietf.utils.timezone import datetime_from_date, datetime_today, DEADLINE_TZINFO +from ietf.utils.timezone import date_today, datetime_from_date, datetime_today, DEADLINE_TZINFO import debug # pyflakes:ignore @@ -240,7 +240,7 @@ def validate_public_key(public_key): def send_accept_reminder_to_nominee(nominee_position): - today = datetime.date.today().strftime('%Y%m%d') + today = date_today().strftime('%Y%m%d') subject = 'Reminder: please accept (or decline) your nomination.' domain = Site.objects.get_current().domain position = nominee_position.position @@ -332,7 +332,7 @@ def make_nomineeposition(nomcom, candidate, position, author): from_email = settings.NOMCOM_FROM_EMAIL.format(year=nomcom.year()) (to_email, cc) = gather_address_lists('nomination_new_nominee',nominee=nominee.email.address) domain = Site.objects.get_current().domain - today = datetime.date.today().strftime('%Y%m%d') + today = date_today().strftime('%Y%m%d') hash = get_hash_nominee_position(today, nominee_position.id) accept_url = reverse('ietf.nomcom.views.process_nomination_status', None, diff --git a/ietf/nomcom/views.py b/ietf/nomcom/views.py index cbdd6eba9..6f02b16e2 100644 --- a/ietf/nomcom/views.py +++ b/ietf/nomcom/views.py @@ -45,6 +45,8 @@ from ietf.nomcom.utils import (get_nomcom_by_year, store_nomcom_private_key, sug from ietf.ietfauth.utils import role_required from ietf.person.models import Person from ietf.utils.response import permission_denied +from ietf.utils.timezone import date_today + import debug # pyflakes:ignore @@ -702,7 +704,7 @@ def process_nomination_status(request, year, nominee_position_id, state, date, h expiration_days = getattr(settings, 'DAYS_TO_EXPIRE_NOMINATION_LINK', None) if expiration_days: request_date = datetime.date(int(date[:4]), int(date[4:6]), int(date[6:])) - if datetime.date.today() > (request_date + datetime.timedelta(days=settings.DAYS_TO_EXPIRE_NOMINATION_LINK)): + if date_today() > (request_date + datetime.timedelta(days=expiration_days)): permission_denied(request, "Link expired.") need_confirmation = True diff --git a/ietf/person/templatetags/person_filters.py b/ietf/person/templatetags/person_filters.py index 96696456f..4907565f6 100644 --- a/ietf/person/templatetags/person_filters.py +++ b/ietf/person/templatetags/person_filters.py @@ -8,6 +8,7 @@ import debug # pyflakes:ignore from ietf.nomcom.utils import is_eligible from ietf.person.models import Alias +from ietf.utils.timezone import date_today register = template.Library() @@ -15,7 +16,7 @@ register = template.Library() @register.filter def is_nomcom_eligible(person, date=None): if date is None: - date = datetime.date.today() + date = date_today() return is_eligible(person=person, date=date) diff --git a/ietf/person/views.py b/ietf/person/views.py index 1cebd34e5..4150495a2 100644 --- a/ietf/person/views.py +++ b/ietf/person/views.py @@ -10,6 +10,7 @@ from django.contrib import messages from django.db.models import Q from django.http import HttpResponse, Http404 from django.shortcuts import render, get_object_or_404, redirect +from django.utils import timezone import debug # pyflakes:ignore @@ -76,7 +77,7 @@ def profile(request, email_or_name): persons = [ p for p in persons if p and p.id ] if not persons: raise Http404 - return render(request, 'person/profile.html', {'persons': persons, 'today':datetime.date.today()}) + return render(request, 'person/profile.html', {'persons': persons, 'today': timezone.now()}) def photo(request, email_or_name): diff --git a/ietf/review/mailarch.py b/ietf/review/mailarch.py index c21bc1fc8..6ef5909a1 100644 --- a/ietf/review/mailarch.py +++ b/ietf/review/mailarch.py @@ -25,6 +25,8 @@ from django.conf import settings from django.utils.encoding import force_bytes, force_str from ietf.utils.mail import get_payload_text +from ietf.utils.timezone import date_today + def list_name_from_email(list_email): if not list_email.endswith("@ietf.org"): @@ -51,7 +53,7 @@ def construct_query_urls(doc, team, query=None): encoded_query = "?" + urlencode({ "qdr": "c", # custom time frame - "start_date": (datetime.date.today() - datetime.timedelta(days=180)).isoformat(), + "start_date": (date_today() - datetime.timedelta(days=180)).isoformat(), "email_list": list_name, "q": "subject:({})".format(query), "as": "1", # this is an advanced search diff --git a/ietf/review/models.py b/ietf/review/models.py index 0ec367819..f0ec78094 100644 --- a/ietf/review/models.py +++ b/ietf/review/models.py @@ -2,8 +2,6 @@ # -*- coding: utf-8 -*- -import datetime - from simple_history.models import HistoricalRecords from django.db import models @@ -18,6 +16,8 @@ from ietf.name.models import ReviewTypeName, ReviewRequestStateName, ReviewResul ReviewAssignmentStateName, ReviewerQueuePolicyName from ietf.utils.validators import validate_regular_expression_string from ietf.utils.models import ForeignKey, OneToOneField +from ietf.utils.timezone import date_today + class ReviewerSettings(models.Model): """Keeps track of admin data associated with a reviewer in a team.""" @@ -67,7 +67,7 @@ class UnavailablePeriod(models.Model): history = HistoricalRecords(history_change_reason_field=models.TextField(null=True)) team = ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None)) person = ForeignKey(Person) - start_date = models.DateField(default=datetime.date.today, null=True, help_text="Choose the start date so that you can still do a review if it's assigned just before the start date - this usually means you should mark yourself unavailable for assignment some time before you are actually away. The default is today.") + start_date = models.DateField(default=date_today, null=True, help_text="Choose the start date so that you can still do a review if it's assigned just before the start date - this usually means you should mark yourself unavailable for assignment some time before you are actually away. The default is today.") end_date = models.DateField(blank=True, null=True, help_text="Leaving the end date blank means that the period continues indefinitely. You can end it later.") AVAILABILITY_CHOICES = [ ("canfinish", "Can do follow-ups"), @@ -81,8 +81,7 @@ class UnavailablePeriod(models.Model): reason = models.TextField(verbose_name="Reason why reviewer is unavailable (Optional)", max_length=2048, blank=True, help_text="Provide (for the secretary's benefit) the reason why the review is unavailable", default='') def state(self): - import datetime - today = datetime.date.today() + today = date_today() if self.start_date is None or self.start_date <= today: if not self.end_date or today <= self.end_date: return "active" diff --git a/ietf/review/utils.py b/ietf/review/utils.py index e8ed632f8..35ef1b5fc 100644 --- a/ietf/review/utils.py +++ b/ietf/review/utils.py @@ -32,7 +32,7 @@ from ietf.review.models import (ReviewRequest, ReviewAssignment, ReviewRequestSt from ietf.utils.mail import send_mail from ietf.doc.utils import extract_complete_replaces_ancestor_mapping_for_docs from ietf.utils import log -from ietf.utils.timezone import datetime_today, DEADLINE_TZINFO +from ietf.utils.timezone import date_today, datetime_today, DEADLINE_TZINFO # The origin date is used to have a single reference date for "every X days". @@ -93,12 +93,12 @@ def no_review_from_teams_on_doc(doc, rev): def unavailable_periods_to_list(past_days=14): return UnavailablePeriod.objects.filter( - Q(end_date=None) | Q(end_date__gte=datetime.date.today() - datetime.timedelta(days=past_days)), + Q(end_date=None) | Q(end_date__gte=date_today() - datetime.timedelta(days=past_days)), ).order_by("start_date") def current_unavailable_periods_for_reviewers(team): """Return dict with currently active unavailable periods for reviewers.""" - today = datetime.date.today() + today = date_today() unavailable_period_qs = UnavailablePeriod.objects.filter( Q(end_date__gte=today) | Q(end_date=None), @@ -877,7 +877,7 @@ def email_reviewer_reminder(assignment): review_request = assignment.review_request team = review_request.team - deadline_days = (review_request.deadline - datetime.date.today()).days + deadline_days = (review_request.deadline - date_today(DEADLINE_TZINFO)).days subject = "Reminder: deadline for review of {} in {} is {}".format(review_request.doc.name, team.acronym, review_request.deadline.isoformat()) @@ -943,7 +943,7 @@ def email_secretary_reminder(assignment, secretary_role): review_request = assignment.review_request team = review_request.team - deadline_days = (review_request.deadline - datetime.date.today()).days + deadline_days = (review_request.deadline - date_today(DEADLINE_TZINFO)).days subject = "Reminder: deadline for review of {} in {} is {}".format(review_request.doc.name, team.acronym, review_request.deadline.isoformat()) diff --git a/ietf/secr/meetings/views.py b/ietf/secr/meetings/views.py index cb1971eea..bd0c8efa1 100644 --- a/ietf/secr/meetings/views.py +++ b/ietf/secr/meetings/views.py @@ -31,7 +31,7 @@ from ietf.secr.meetings.forms import ( BaseMeetingRoomFormSet, MeetingModelForm, from ietf.secr.sreq.views import get_initial_session from ietf.secr.utils.meeting import get_session, get_timeslot from ietf.mailtrigger.utils import gather_address_lists -from ietf.utils.timezone import make_aware +from ietf.utils.timezone import date_today, make_aware # prep for agenda changes @@ -314,7 +314,7 @@ def blue_sheet_redirect(request): This is the generic blue sheet URL. It gets the next IETF meeting and redirects to the meeting specific URL. ''' - today = datetime.date.today() + today = date_today() qs = Meeting.objects.filter(date__gt=today,type='ietf').order_by('date') if qs: meeting = qs[0] diff --git a/ietf/secr/proceedings/views.py b/ietf/secr/proceedings/views.py index 8189519e9..e88a20196 100644 --- a/ietf/secr/proceedings/views.py +++ b/ietf/secr/proceedings/views.py @@ -27,6 +27,7 @@ from ietf.meeting.utils import add_event_info_to_session_qs from ietf.secr.proceedings.forms import RecordingForm, RecordingEditForm from ietf.secr.proceedings.proc_utils import (create_recording) +from ietf.utils.timezone import date_today # ------------------------------------------------- # Globals @@ -154,7 +155,7 @@ def main(request): meetings = Meeting.objects.filter(type='ietf').order_by('-number') else: # select meetings still within the cutoff period - today = datetime.date.today() + today = date_today() meetings = [m for m in Meeting.objects.filter(type='ietf').order_by('-number') if m.get_submission_correction_date()>=today] groups = get_my_groups(request.user) @@ -165,7 +166,7 @@ def main(request): m.group = m.session_set.first().group # we today's date to see if we're past the submissio cutoff - today = datetime.date.today() + today = date_today() return render(request, 'proceedings/main.html',{ 'meetings': meetings, diff --git a/ietf/secr/sreq/tests.py b/ietf/secr/sreq/tests.py index fabbc0807..dd945beaf 100644 --- a/ietf/secr/sreq/tests.py +++ b/ietf/secr/sreq/tests.py @@ -16,6 +16,8 @@ from ietf.name.models import ConstraintName, TimerangeName from ietf.person.models import Person from ietf.secr.sreq.forms import SessionForm from ietf.utils.mail import outbox, empty_outbox, get_payload_text +from ietf.utils.timezone import date_today + from pyquery import PyQuery @@ -23,7 +25,7 @@ SECR_USER='secretary' class SreqUrlTests(TestCase): def test_urls(self): - MeetingFactory(type_id='ietf',date=datetime.date.today()) + MeetingFactory(type_id='ietf',date=date_today()) self.client.login(username="secretary", password="secretary+password") @@ -39,7 +41,7 @@ class SreqUrlTests(TestCase): class SessionRequestTestCase(TestCase): def test_main(self): - meeting = MeetingFactory(type_id='ietf', date=datetime.date.today()) + meeting = MeetingFactory(type_id='ietf', date=date_today()) SessionFactory.create_batch(2, meeting=meeting, status_id='sched') SessionFactory.create_batch(2, meeting=meeting, status_id='disappr') # An additional unscheduled group comes from make_immutable_base_data @@ -53,7 +55,7 @@ class SessionRequestTestCase(TestCase): self.assertEqual(len(unsched), 11) def test_approve(self): - meeting = MeetingFactory(type_id='ietf', date=datetime.date.today()) + meeting = MeetingFactory(type_id='ietf', date=date_today()) ad = Person.objects.get(user__username='ad') area = RoleFactory(name_id='ad', person=ad, group__type_id='area').group mars = GroupFactory(parent=area, acronym='mars') @@ -66,7 +68,7 @@ class SessionRequestTestCase(TestCase): self.assertEqual(SchedulingEvent.objects.filter(session=session).order_by('-id')[0].status_id, 'appr') def test_cancel(self): - meeting = MeetingFactory(type_id='ietf', date=datetime.date.today()) + meeting = MeetingFactory(type_id='ietf', date=date_today()) ad = Person.objects.get(user__username='ad') area = RoleFactory(name_id='ad', person=ad, group__type_id='area').group session = SessionFactory(meeting=meeting, group__parent=area, group__acronym='mars', status_id='sched') @@ -77,7 +79,7 @@ class SessionRequestTestCase(TestCase): self.assertEqual(SchedulingEvent.objects.filter(session=session).order_by('-id')[0].status_id, 'deleted') def test_edit(self): - meeting = MeetingFactory(type_id='ietf', date=datetime.date.today()) + meeting = MeetingFactory(type_id='ietf', date=date_today()) mars = RoleFactory(name_id='chair', person__user__username='marschairman', group__acronym='mars').group group2 = GroupFactory() group3 = GroupFactory() @@ -367,7 +369,7 @@ class SessionRequestTestCase(TestCase): self.assertEqual(len(mars.constraint_source_set.filter(name_id='conflict')), 0) def test_tool_status(self): - MeetingFactory(type_id='ietf', date=datetime.date.today()) + MeetingFactory(type_id='ietf', date=date_today()) url = reverse('ietf.secr.sreq.views.tool_status') self.client.login(username="secretary", password="secretary+password") r = self.client.get(url) @@ -438,7 +440,7 @@ class SubmitRequestCase(TestCase): MeetingFactory.reset_sequence(0) def test_submit_request(self): - meeting = MeetingFactory(type_id='ietf', date=datetime.date.today()) + meeting = MeetingFactory(type_id='ietf', date=date_today()) ad = Person.objects.get(user__username='ad') area = RoleFactory(name_id='ad', person=ad, group__type_id='area').group group = GroupFactory(parent=area) @@ -506,7 +508,7 @@ class SubmitRequestCase(TestCase): self.assertEqual(list(session.joint_with_groups.all()), [group3, group4]) def test_submit_request_invalid(self): - MeetingFactory(type_id='ietf', date=datetime.date.today()) + MeetingFactory(type_id='ietf', date=date_today()) ad = Person.objects.get(user__username='ad') area = RoleFactory(name_id='ad', person=ad, group__type_id='area').group group = GroupFactory(parent=area) @@ -542,8 +544,8 @@ class SubmitRequestCase(TestCase): self.assertContains(r, 'Must provide data for all sessions') def test_submit_request_check_constraints(self): - m1 = MeetingFactory(type_id='ietf', date=datetime.date.today() - datetime.timedelta(days=100)) - MeetingFactory(type_id='ietf', date=datetime.date.today(), + m1 = MeetingFactory(type_id='ietf', date=date_today() - datetime.timedelta(days=100)) + MeetingFactory(type_id='ietf', date=date_today(), group_conflicts=['chair_conflict', 'conflic2', 'conflic3']) ad = Person.objects.get(user__username='ad') area = RoleFactory(name_id='ad', person=ad, group__type_id='area').group @@ -604,7 +606,7 @@ class SubmitRequestCase(TestCase): self.assertContains(r, "Cannot declare a conflict with the same group") def test_request_notification(self): - meeting = MeetingFactory(type_id='ietf', date=datetime.date.today()) + meeting = MeetingFactory(type_id='ietf', date=date_today()) ad = Person.objects.get(user__username='ad') area = GroupFactory(type_id='area') RoleFactory(name_id='ad', person=ad, group=area) @@ -807,7 +809,7 @@ class SubmitRequestCase(TestCase): class LockAppTestCase(TestCase): def setUp(self): super().setUp() - self.meeting = MeetingFactory(type_id='ietf', date=datetime.date.today(),session_request_lock_message='locked') + self.meeting = MeetingFactory(type_id='ietf', date=date_today(),session_request_lock_message='locked') self.group = GroupFactory(acronym='mars') RoleFactory(name_id='chair', group=self.group, person__user__username='marschairman') SessionFactory(group=self.group,meeting=self.meeting) @@ -853,7 +855,7 @@ class LockAppTestCase(TestCase): class NotMeetingCase(TestCase): def test_not_meeting(self): - MeetingFactory(type_id='ietf',date=datetime.date.today()) + MeetingFactory(type_id='ietf',date=date_today()) group = GroupFactory(acronym='mars') url = reverse('ietf.secr.sreq.views.no_session',kwargs={'acronym':group.acronym}) self.client.login(username="secretary", password="secretary+password") diff --git a/ietf/secr/telechat/tests.py b/ietf/secr/telechat/tests.py index cc989c6fc..e4661b767 100644 --- a/ietf/secr/telechat/tests.py +++ b/ietf/secr/telechat/tests.py @@ -8,14 +8,13 @@ from pyquery import PyQuery import debug # pyflakes:ignore from django.urls import reverse -from django.utils import timezone from ietf.doc.factories import (WgDraftFactory, IndividualRfcFactory, CharterFactory, IndividualDraftFactory, ConflictReviewFactory) from ietf.doc.models import BallotDocEvent, BallotType, BallotPositionDocEvent, State, Document from ietf.doc.utils import update_telechat, create_ballot_if_not_open from ietf.utils.test_utils import TestCase -from ietf.utils.timezone import datetime_today +from ietf.utils.timezone import date_today, datetime_today from ietf.iesg.models import TelechatDate from ietf.person.models import Person from ietf.person.factories import PersonFactory @@ -24,7 +23,7 @@ from ietf.secr.telechat.views import get_next_telechat_date SECR_USER='secretary' def augment_data(): - TelechatDate.objects.create(date=timezone.now()) + TelechatDate.objects.create(date=date_today()) class SecrTelechatTestCase(TestCase): def test_main(self): @@ -140,7 +139,7 @@ class SecrTelechatTestCase(TestCase): self.assertEqual(q("#telechat-positions-table").find("th:contains('No Record')").length,1) def test_bash(self): - today = timezone.now() + today = date_today() TelechatDate.objects.create(date=today) url = reverse('ietf.secr.telechat.views.bash',kwargs={'date':today.strftime('%Y-%m-%d')}) self.client.login(username="secretary", password="secretary+password") diff --git a/ietf/secr/telechat/views.py b/ietf/secr/telechat/views.py index b3f064fa1..4dd4fba4e 100644 --- a/ietf/secr/telechat/views.py +++ b/ietf/secr/telechat/views.py @@ -20,6 +20,8 @@ from ietf.iesg.models import TelechatDate, TelechatAgendaItem, Telechat from ietf.iesg.agenda import agenda_data, get_doc_section from ietf.ietfauth.utils import role_required from ietf.secr.telechat.forms import BallotForm, ChangeStateForm, DateSelectForm, TELECHAT_TAGS +from ietf.utils.timezone import date_today + ''' EXPECTED CHANGES: @@ -80,14 +82,14 @@ def get_last_telechat_date(): This function returns the date of the last telechat Tried TelechatDocEvent.objects.latest but that will return today's telechat ''' - return TelechatDate.objects.filter(date__lt=datetime.date.today()).order_by('-date')[0].date + return TelechatDate.objects.filter(date__lt=date_today()).order_by('-date')[0].date #return '2011-11-01' # uncomment for testing def get_next_telechat_date(): ''' This function returns the date of the next telechat ''' - return TelechatDate.objects.filter(date__gte=datetime.date.today()).order_by('date')[0].date + return TelechatDate.objects.filter(date__gte=date_today()).order_by('date')[0].date def get_section_header(doc, agenda): ''' diff --git a/ietf/stats/tests.py b/ietf/stats/tests.py index 13b81d934..94026dc56 100644 --- a/ietf/stats/tests.py +++ b/ietf/stats/tests.py @@ -29,6 +29,7 @@ from ietf.name.models import FormalLanguageName, DocRelationshipName, CountryNam from ietf.review.factories import ReviewRequestFactory, ReviewerSettingsFactory, ReviewAssignmentFactory from ietf.stats.models import MeetingRegistration, CountryAlias from ietf.stats.utils import get_meeting_registration_data +from ietf.utils.timezone import date_today class StatisticsTests(TestCase): @@ -122,7 +123,7 @@ class StatisticsTests(TestCase): def test_meeting_stats(self): # create some data for the statistics - meeting = MeetingFactory(type_id='ietf', date=datetime.date.today(), number="96") + meeting = MeetingFactory(type_id='ietf', date=date_today(), number="96") MeetingRegistration.objects.create(first_name='John', last_name='Smith', country_code='US', email="john.smith@example.us", meeting=meeting, attended=True) CountryAlias.objects.get_or_create(alias="US", country=CountryName.objects.get(slug="US")) MeetingRegistration.objects.create(first_name='Jaume', last_name='Guillaume', country_code='FR', email="jaume.guillaume@example.fr", meeting=meeting, attended=True) @@ -198,7 +199,7 @@ class StatisticsTests(TestCase): self.assertTrue(q('.review-stats td:contains("1")')) # check stacked chart - expected_date = datetime.date.today().replace(day=1) + expected_date = date_today().replace(day=1) expected_js_timestamp = calendar.timegm(expected_date.timetuple()) * 1000 url = urlreverse(ietf.stats.views.review_stats, kwargs={ "stats_type": "time" }) url += "?team={}".format(review_req.team.acronym) diff --git a/ietf/stats/views.py b/ietf/stats/views.py index 784b7312c..6be66289b 100644 --- a/ietf/stats/views.py +++ b/ietf/stats/views.py @@ -641,7 +641,7 @@ def document_stats(request, stats_type=None): template_name = "yearly" years_from = from_time.year if from_time else 1 - years_to = datetime.date.today().year - 1 + years_to = timezone.now().year - 1 if stats_type == "yearly/affiliation": @@ -904,7 +904,7 @@ def meeting_stats(request, num=None, stats_type=None): continents = {} - meetings = Meeting.objects.filter(type='ietf', date__lte=datetime.date.today()).order_by('number') + meetings = Meeting.objects.filter(type='ietf', date__lte=date_today()).order_by('number') for m in meetings: country = CountryName.objects.get(slug=m.country) continents[country.continent.name] = country.continent.name diff --git a/ietf/submit/forms.py b/ietf/submit/forms.py index 857e6879c..828387280 100644 --- a/ietf/submit/forms.py +++ b/ietf/submit/forms.py @@ -7,7 +7,6 @@ import os import re import datetime import email -import pytz import sys import tempfile import xml2rfc @@ -43,6 +42,7 @@ from ietf.submit.parsers.xml_parser import XMLParser from ietf.utils import log from ietf.utils.draft import PlaintextDraft from ietf.utils.text import normalize_text +from ietf.utils.timezone import date_today from ietf.utils.xmldraft import XMLDraft, XMLParseError @@ -80,7 +80,7 @@ class SubmissionBaseUploadForm(forms.Form): self.base_formats = None # None will raise an exception in clean() if this isn't changed in a subclass def set_cutoff_warnings(self): - now = timezone.now().astimezone(pytz.utc) + now = timezone.now() meeting = Meeting.get_current_meeting() if not meeting: return @@ -573,7 +573,7 @@ class DeprecatedSubmissionBaseUploadForm(SubmissionBaseUploadForm): raise forms.ValidationError(mark_safe(self.cutoff_warning)) # check thresholds - today = datetime.date.today() + today = date_today() self.check_submissions_thresholds( "for the draft %s" % self.filename, diff --git a/ietf/submit/mail.py b/ietf/submit/mail.py index 16d1f0973..5a2892b37 100644 --- a/ietf/submit/mail.py +++ b/ietf/submit/mail.py @@ -28,6 +28,8 @@ from ietf.utils.accesstoken import generate_access_token from ietf.mailtrigger.utils import gather_address_lists, get_base_submission_message_address from ietf.submit.models import SubmissionEmailEvent, Submission from ietf.submit.checkers import DraftIdnitsChecker +from ietf.utils.timezone import date_today + def send_submission_confirmation(request, submission, chair_notice=False): subject = 'Confirm submission of I-D %s' % submission.name @@ -299,7 +301,7 @@ def add_submission_email(request, remote_ip, name, rev, submission_pk, message, rev=rev, title=name, note="", - submission_date=datetime.date.today(), + submission_date=date_today(), replaces="", ) from ietf.submit.utils import create_submission_event, docevent_from_submission diff --git a/ietf/submit/parsers/base.py b/ietf/submit/parsers/base.py index 5c5d0d6fc..679798cc4 100644 --- a/ietf/submit/parsers/base.py +++ b/ietf/submit/parsers/base.py @@ -3,7 +3,6 @@ import re -import datetime import debug # pyflakes:ignore from typing import List, Optional # pyflakes:ignore @@ -12,6 +11,8 @@ from django.conf import settings from django.template.defaultfilters import filesizeformat from ietf.utils.mime import get_mime_type +from ietf.utils.timezone import date_today + class MetaData(object): rev = None @@ -60,7 +61,7 @@ class FileParser(object): self.parse_max_size(); self.parse_filename_extension() self.parse_file_type() - self.parsed_info.metadata.submission_date = datetime.date.today() + self.parsed_info.metadata.submission_date = date_today() return self.parsed_info def parse_invalid_chars_in_filename(self): diff --git a/ietf/submit/tests.py b/ietf/submit/tests.py index 86815f59f..9f6087d9b 100644 --- a/ietf/submit/tests.py +++ b/ietf/submit/tests.py @@ -52,6 +52,7 @@ from ietf.utils.accesstoken import generate_access_token from ietf.utils.mail import outbox, empty_outbox, get_payload_text from ietf.utils.models import VersionInfo from ietf.utils.test_utils import login_testing_unauthorized, TestCase +from ietf.utils.timezone import date_today from ietf.utils.draft import PlaintextDraft @@ -91,7 +92,7 @@ class BaseSubmitTestCase(TestCase): return settings.INTERNET_DRAFT_ARCHIVE_DIR def submission_file(name_in_doc, name_in_post, group, templatename, author=None, email=None, title=None, year=None, ascii=True): - _today = datetime.date.today() + _today = date_today() # construct appropriate text draft f = io.open(os.path.join(settings.BASE_DIR, "submit", templatename)) template = f.read() @@ -146,7 +147,7 @@ def create_draft_submission_with_rev_mismatch(rev='01'): sub = Submission.objects.create( name=draft_name, group=None, - submission_date=datetime.date.today() - datetime.timedelta(days=1), + submission_date=date_today() - datetime.timedelta(days=1), rev=rev, state_id='posted', ) @@ -164,7 +165,7 @@ class SubmitTests(BaseSubmitTestCase): def setUp(self): super().setUp() # Submit views assume there is a "next" IETF to look for cutoff dates against - MeetingFactory(type_id='ietf', date=datetime.date.today()+datetime.timedelta(days=180)) + MeetingFactory(type_id='ietf', date=date_today()+datetime.timedelta(days=180)) def create_and_post_submission(self, name, rev, author, group=None, formats=("txt",), base_filename=None): """Helper to create and post a submission @@ -1355,7 +1356,7 @@ class SubmitTests(BaseSubmitTestCase): # edit mailbox_before = len(outbox) # FIXME If this test is started before midnight, and ends after, it will fail - document_date = datetime.date.today() - datetime.timedelta(days=-3) + document_date = date_today() - datetime.timedelta(days=-3) r = self.client.post(edit_url, { "edit-title": "some title", "edit-rev": "00", @@ -1523,7 +1524,7 @@ class SubmitTests(BaseSubmitTestCase): def test_expire_submissions(self): s = Submission.objects.create(name="draft-ietf-mars-foo", group=None, - submission_date=datetime.date.today() - datetime.timedelta(days=10), + submission_date=date_today() - datetime.timedelta(days=10), rev="00", state_id="uploaded") @@ -1557,7 +1558,7 @@ class SubmitTests(BaseSubmitTestCase): # Put today in the blackout period meeting = Meeting.get_current_meeting() - meeting.importantdate_set.create(name_id='idcutoff',date=datetime.date.today()-datetime.timedelta(days=2)) + meeting.importantdate_set.create(name_id='idcutoff',date=date_today()-datetime.timedelta(days=2)) # regular user, no access r = self.client.get(url) @@ -1576,30 +1577,30 @@ class SubmitTests(BaseSubmitTestCase): url = urlreverse('ietf.submit.views.upload_submission') meeting = Meeting.get_current_meeting() - meeting.date = datetime.date.today()+datetime.timedelta(days=7) + meeting.date = date_today()+datetime.timedelta(days=7) meeting.save() meeting.importantdate_set.filter(name_id='idcutoff').delete() - meeting.importantdate_set.create(name_id='idcutoff', date=datetime.date.today()+datetime.timedelta(days=7)) + meeting.importantdate_set.create(name_id='idcutoff', date=date_today()+datetime.timedelta(days=7)) r = self.client.get(url) self.assertEqual(r.status_code,200) q = PyQuery(r.content) self.assertEqual(len(q('input[type=file][name=txt]')), 1) meeting = Meeting.get_current_meeting() - meeting.date = datetime.date.today() + meeting.date = date_today() meeting.save() meeting.importantdate_set.filter(name_id='idcutoff').delete() - meeting.importantdate_set.create(name_id='idcutoff', date=datetime.date.today()) + meeting.importantdate_set.create(name_id='idcutoff', date=date_today()) r = self.client.get(url) self.assertEqual(r.status_code,200) q = PyQuery(r.content) self.assertEqual(len(q('input[type=file][name=txt]')), 1) meeting = Meeting.get_current_meeting() - meeting.date = datetime.date.today()-datetime.timedelta(days=1) + meeting.date = date_today()-datetime.timedelta(days=1) meeting.save() meeting.importantdate_set.filter(name_id='idcutoff').delete() - meeting.importantdate_set.create(name_id='idcutoff', date=datetime.date.today()-datetime.timedelta(days=1)) + meeting.importantdate_set.create(name_id='idcutoff', date=date_today()-datetime.timedelta(days=1)) r = self.client.get(url) self.assertEqual(r.status_code,200) q = PyQuery(r.content) @@ -1864,7 +1865,7 @@ class SubmitTests(BaseSubmitTestCase): self.index += 1 sub = Submission.objects.create(name="draft-ietf-mars-bar-%d" % self.index, group=Group.objects.get(acronym="mars"), - submission_date=datetime.date.today(), + submission_date=date_today(), authors=[dict(name=self.author.name, email=self.author.user.email, affiliation='affiliation', @@ -2136,17 +2137,17 @@ class ApprovalsTestCase(BaseSubmitTestCase): Submission.objects.create(name="draft-ietf-mars-foo", group=Group.objects.get(acronym="mars"), - submission_date=datetime.date.today(), + submission_date=date_today(), rev="00", state_id="posted") Submission.objects.create(name="draft-ietf-mars-bar", group=Group.objects.get(acronym="mars"), - submission_date=datetime.date.today(), + submission_date=date_today(), rev="00", state_id="grp-appr") Submission.objects.create(name="draft-ietf-mars-quux", group=Group.objects.get(acronym="mars"), - submission_date=datetime.date.today(), + submission_date=date_today(), rev="00", state_id="ad-appr") @@ -2295,11 +2296,11 @@ class ManualPostsTestCase(BaseSubmitTestCase): Submission.objects.create(name="draft-ietf-mars-foo", group=Group.objects.get(acronym="mars"), - submission_date=datetime.date.today(), + submission_date=date_today(), state_id="manual") Submission.objects.create(name="draft-ietf-mars-bar", group=Group.objects.get(acronym="mars"), - submission_date=datetime.date.today(), + submission_date=date_today(), rev="00", state_id="grp-appr") @@ -2885,7 +2886,7 @@ class ApiSubmissionTests(BaseSubmitTestCase): class SubmissionUploadFormTests(BaseSubmitTestCase): def test_check_submission_thresholds(self): - today = datetime.date.today() + today = date_today() yesterday = today - datetime.timedelta(days=1) (this_group, that_group) = GroupFactory.create_batch(2, type_id='wg') this_ip = '10.0.0.1' @@ -3101,7 +3102,7 @@ class AsyncSubmissionTests(BaseSubmitTestCase): """Tests of async submission-related tasks""" def test_process_uploaded_submission(self): """process_uploaded_submission should properly process a submission""" - _today = datetime.date.today() + _today = date_today() xml, author = submission_file('draft-somebody-test-00', 'draft-somebody-test-00.xml', None, 'test_submission.xml') xml_data = xml.read() xml.close() @@ -3389,7 +3390,7 @@ class ApiSubmitTests(BaseSubmitTestCase): super().setUp() # break early in case of missing configuration self.assertTrue(os.path.exists(settings.IDSUBMIT_IDNITS_BINARY)) - MeetingFactory(type_id='ietf', date=datetime.date.today()+datetime.timedelta(days=60)) + MeetingFactory(type_id='ietf', date=date_today()+datetime.timedelta(days=60)) def do_post_submission(self, rev, author=None, name=None, group=None, email=None, title=None, year=None): url = urlreverse('ietf.submit.views.api_submit') diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index e1d383418..6fb0a36b6 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -48,6 +48,7 @@ from ietf.utils.accesstoken import generate_random_key from ietf.utils.draft import PlaintextDraft from ietf.utils.mail import is_valid_email from ietf.utils.text import parse_unicode, normalize_text +from ietf.utils.timezone import date_today from ietf.utils.xmldraft import XMLDraft from ietf.person.name import unidecode_name @@ -726,7 +727,7 @@ def recently_approved_by_user(user, since): ) def expirable_submissions(older_than_days): - cutoff = datetime.date.today() - datetime.timedelta(days=older_than_days) + cutoff = date_today() - datetime.timedelta(days=older_than_days) return Submission.objects.exclude(state__in=("cancel", "posted")).filter(submission_date__lt=cutoff) def expire_submission(submission, by): @@ -849,7 +850,7 @@ def fill_in_submission(form, submission, authors, abstract, file_size): submission.file_size = file_size submission.file_types = ','.join(form.file_types) submission.xml_version = form.xml_version - submission.submission_date = datetime.date.today() + submission.submission_date = date_today() submission.replaces = "" if form.parsed_draft is not None: submission.pages = form.parsed_draft.get_pagecount() diff --git a/ietf/submit/views.py b/ietf/submit/views.py index bab859702..80137eba4 100644 --- a/ietf/submit/views.py +++ b/ietf/submit/views.py @@ -48,6 +48,8 @@ from ietf.utils.accesstoken import generate_access_token from ietf.utils.log import log from ietf.utils.mail import parseaddr, send_mail_message from ietf.utils.response import permission_denied +from ietf.utils.timezone import date_today + def upload_submission(request): if request.method == 'POST': @@ -723,7 +725,7 @@ def approvals(request): preapprovals = preapprovals_for_user(request.user) days = 30 - recently_approved = recently_approved_by_user(request.user, datetime.date.today() - datetime.timedelta(days=days)) + recently_approved = recently_approved_by_user(request.user, date_today() - datetime.timedelta(days=days)) return render(request, 'submit/approvals.html', {'selected': 'approvals', diff --git a/ietf/templates/person/profile.html b/ietf/templates/person/profile.html index 6732804aa..3d0b1e067 100644 --- a/ietf/templates/person/profile.html +++ b/ietf/templates/person/profile.html @@ -62,7 +62,7 @@ {% else %} -

{{ person.first_name }} has no active roles as of {{ today }}.

+

{{ person.first_name }} has no active roles as of {{ today|date:"Y-m-d" }}.

{% endif %} {% endif %} {% if person.personextresource_set.exists %} @@ -123,7 +123,7 @@ {% else %} - {{ person.first_name }} has no RFCs as of {{ today }}. + {{ person.first_name }} has no RFCs as of {{ today|date:"Y-m-d" }}. {% endif %}

Active Drafts ({{ person.active_drafts|length }}) @@ -137,7 +137,7 @@ {% endfor %} {% else %} - {{ person.first_name }} has no active drafts as of {{ today }}. + {{ person.first_name }} has no active drafts as of {{ today|date:"Y-m-d" }}. {% endif %}

Expired Drafts ({{ person.expired_drafts|length }}) @@ -156,7 +156,7 @@ (Excluding replaced drafts.) {% else %} - {{ person.first_name }} has no expired drafts as of {{ today }}. + {{ person.first_name }} has no expired drafts as of {{ today|date:"Y-m-d" }}. {% endif %} {% if person.has_drafts %}

diff --git a/ietf/utils/test_data.py b/ietf/utils/test_data.py index cd5a06e83..2c6f048a5 100644 --- a/ietf/utils/test_data.py +++ b/ietf/utils/test_data.py @@ -21,6 +21,7 @@ from ietf.person.models import Person, Email from ietf.group.utils import setup_default_community_list_for_group from ietf.review.models import (ReviewRequest, ReviewerSettings, ReviewResultName, ReviewTypeName, ReviewTeamSettings ) from ietf.person.name import unidecode_name +from ietf.utils.timezone import date_today def create_person(group, role_name, name=None, username=None, email_address=None, password=None, is_staff=False, is_superuser=False): @@ -52,7 +53,7 @@ def make_immutable_base_data(): all tests in a run.""" # telechat dates - t = datetime.date.today() + datetime.timedelta(days=1) + t = date_today() + datetime.timedelta(days=1) old = TelechatDate.objects.create(date=t - datetime.timedelta(days=14)).date # pyflakes:ignore date1 = TelechatDate.objects.create(date=t).date # pyflakes:ignore date2 = TelechatDate.objects.create(date=t + datetime.timedelta(days=14)).date # pyflakes:ignore @@ -365,7 +366,7 @@ def make_test_data(): ietf72 = Meeting.objects.create( number="72", type_id="ietf", - date=datetime.date.today() + datetime.timedelta(days=180), + date=date_today() + datetime.timedelta(days=180), city="New York", country="US", time_zone="US/Eastern", diff --git a/ietf/utils/test_runner.py b/ietf/utils/test_runner.py index 0cc1d2b24..2841c343b 100644 --- a/ietf/utils/test_runner.py +++ b/ietf/utils/test_runner.py @@ -40,7 +40,6 @@ import os import sys import time import json -import pytz import importlib import socket import gzip @@ -754,7 +753,7 @@ class IetfTestRunner(DiscoverRunner): with io.open(self.coverage_file, encoding='utf-8') as file: self.coverage_master = json.load(file) self.coverage_data = { - "time": timezone.now().astimezone(pytz.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), + "time": timezone.now().strftime("%Y-%m-%dT%H:%M:%SZ"), "template": { "coverage": 0.0, "covered": {},