refactor: replace datetime.now and datetime.today with timezone.now (#4211)

* 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: renumber migrations
This commit is contained in:
Jennifer Richards 2022-08-25 13:45:16 -03:00 committed by GitHub
parent a94a87f336
commit ebebdbed3e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
88 changed files with 547 additions and 270 deletions

View file

@ -3,7 +3,6 @@
import os import os
import datetime
import collections import collections
import io import io
@ -14,6 +13,7 @@ import debug # pyflakes:ignore
from django.core.management.base import AppCommand from django.core.management.base import AppCommand
from django.db import models from django.db import models
from django.template import Template, Context from django.template import Template, Context
from django.utils import timezone
from tastypie.resources import ModelResource from tastypie.resources import ModelResource
@ -89,7 +89,7 @@ class Command(AppCommand):
info = dict( info = dict(
app=app.name, app=app.name,
app_label=app.label, app_label=app.label,
date=datetime.datetime.now() date=timezone.now()
) )
new_models = {} new_models = {}
for model, rclass_name in missing_resources: for model, rclass_name in missing_resources:

View file

@ -3,7 +3,7 @@
# This script requires that the proper virtual python environment has been # This script requires that the proper virtual python environment has been
# invoked before start # invoked before start
import datetime, os, sys import os, sys
import syslog import syslog
# boilerplate # boilerplate
@ -16,6 +16,7 @@ syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_USER)
import django import django
django.setup() django.setup()
from django.utils import timezone
from ietf.utils.mail import log_smtp_exception, send_error_email from ietf.utils.mail import log_smtp_exception, send_error_email
from smtplib import SMTPException from smtplib import SMTPException
@ -32,7 +33,7 @@ from ietf.message.models import SendQueue
mode = sys.argv[1] mode = sys.argv[1]
now = datetime.datetime.now() now = timezone.now()
needs_sending = SendQueue.objects.filter(sent_at=None).select_related("message") needs_sending = SendQueue.objects.filter(sent_at=None).select_related("message")
if mode == "specific": if mode == "specific":

View file

@ -10,6 +10,7 @@ import uuid
from django.http import HttpResponse, HttpResponseRedirect, Http404 from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.utils import timezone
from django.utils.html import strip_tags from django.utils.html import strip_tags
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -218,7 +219,7 @@ def feed(request, username=None, acronym=None, group_type=None):
significant = request.GET.get('significant', '') == '1' significant = request.GET.get('significant', '') == '1'
documents = docs_tracked_by_community_list(clist).values_list('pk', flat=True) documents = docs_tracked_by_community_list(clist).values_list('pk', flat=True)
since = datetime.datetime.now() - datetime.timedelta(days=14) since = timezone.now() - datetime.timedelta(days=14)
events = DocEvent.objects.filter( events = DocEvent.objects.filter(
doc__id__in=documents, doc__id__in=documents,
@ -243,7 +244,7 @@ def feed(request, username=None, acronym=None, group_type=None):
'title': title, 'title': title,
'subtitle': subtitle, 'subtitle': subtitle,
'id': feed_id.urn, 'id': feed_id.urn,
'updated': datetime.datetime.now(), 'updated': timezone.now(),
}, content_type='text/xml') }, content_type='text/xml')

View file

@ -4,6 +4,7 @@
from django.conf import settings from django.conf import settings
from django.utils import timezone
import datetime, os, shutil, glob, re import datetime, os, shutil, glob, re
from pathlib import Path from pathlib import Path
@ -62,7 +63,7 @@ def get_expired_drafts():
def in_draft_expire_freeze(when=None): def in_draft_expire_freeze(when=None):
if when == None: if when == None:
when = datetime.datetime.now() when = timezone.now()
meeting = Meeting.objects.filter(type='ietf', date__gte=when-datetime.timedelta(days=7)).order_by('date').first() meeting = Meeting.objects.filter(type='ietf', date__gte=when-datetime.timedelta(days=7)).order_by('date').first()

View file

@ -10,6 +10,7 @@ import datetime
from typing import Optional # pyflakes:ignore from typing import Optional # pyflakes:ignore
from django.conf import settings from django.conf import settings
from django.utils import timezone
from ietf.doc.models import ( Document, DocEvent, NewRevisionDocEvent, DocAlias, State, DocumentAuthor, from ietf.doc.models import ( Document, DocEvent, NewRevisionDocEvent, DocAlias, State, DocumentAuthor,
StateDocEvent, BallotPositionDocEvent, BallotDocEvent, BallotType, IRSGBallotDocEvent, TelechatDocEvent, StateDocEvent, BallotPositionDocEvent, BallotDocEvent, BallotType, IRSGBallotDocEvent, TelechatDocEvent,
@ -38,7 +39,7 @@ class BaseDocumentFactory(factory.django.DjangoModelFactory):
rev = '00' rev = '00'
std_level_id = None # type: Optional[str] std_level_id = None # type: Optional[str]
intended_std_level_id = None intended_std_level_id = None
time = datetime.datetime.now() time = timezone.now()
expires = factory.LazyAttribute(lambda o: o.time+datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE)) expires = factory.LazyAttribute(lambda o: o.time+datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE))
pages = factory.fuzzy.FuzzyInteger(2,400) pages = factory.fuzzy.FuzzyInteger(2,400)
@ -357,7 +358,8 @@ class TelechatDocEventFactory(DocEventFactory):
class Meta: class Meta:
model = TelechatDocEvent model = TelechatDocEvent
telechat_date = datetime.datetime.today()+datetime.timedelta(days=14) # note: this is evaluated at import time and not updated - all events will have the same telechat_date
telechat_date = timezone.now()+datetime.timedelta(days=14)
type = 'scheduled_for_telechat' type = 'scheduled_for_telechat'
class NewRevisionDocEventFactory(DocEventFactory): class NewRevisionDocEventFactory(DocEventFactory):
@ -410,7 +412,7 @@ class IRSGBallotDocEventFactory(BallotDocEventFactory):
class Meta: class Meta:
model = IRSGBallotDocEvent model = IRSGBallotDocEvent
duedate = datetime.datetime.now() + datetime.timedelta(days=14) duedate = timezone.now() + datetime.timedelta(days=14)
ballot_type = factory.SubFactory(BallotTypeFactory, slug='irsg-approve') ballot_type = factory.SubFactory(BallotTypeFactory, slug='irsg-approve')
class BallotPositionDocEventFactory(DocEventFactory): class BallotPositionDocEventFactory(DocEventFactory):

View file

@ -10,6 +10,7 @@ from django.utils.feedgenerator import Atom1Feed, Rss201rev2Feed
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.template.defaultfilters import truncatewords, truncatewords_html, date as datefilter from django.template.defaultfilters import truncatewords, truncatewords_html, date as datefilter
from django.template.defaultfilters import linebreaks # type: ignore from django.template.defaultfilters import linebreaks # type: ignore
from django.utils import timezone
from django.utils.html import strip_tags from django.utils.html import strip_tags
from ietf.doc.models import Document, State, LastCallDocEvent, DocEvent from ietf.doc.models import Document, State, LastCallDocEvent, DocEvent
@ -135,7 +136,7 @@ class RfcFeed(Feed):
if self.year: if self.year:
rfc_events = DocEvent.objects.filter(type='published_rfc',time__year=self.year).order_by('-time') rfc_events = DocEvent.objects.filter(type='published_rfc',time__year=self.year).order_by('-time')
else: else:
cutoff = datetime.datetime.now() - datetime.timedelta(days=8) cutoff = timezone.now() - datetime.timedelta(days=8)
rfc_events = DocEvent.objects.filter(type='published_rfc',time__gte=cutoff).order_by('-time') rfc_events = DocEvent.objects.filter(type='published_rfc',time__gte=cutoff).order_by('-time')
results = [(e.doc, e.time) for e in rfc_events] results = [(e.doc, e.time) for e in rfc_events]
for doc,time in results: for doc,time in results:

View file

@ -10,6 +10,7 @@ from django.template.loader import render_to_string
from django.utils.html import strip_tags from django.utils.html import strip_tags
from django.conf import settings from django.conf import settings
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
from django.utils.encoding import force_text from django.utils.encoding import force_text
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -418,7 +419,7 @@ def generate_issue_ballot_mail(request, doc, ballot):
e = doc.latest_event(LastCallDocEvent, type="sent_last_call") e = doc.latest_event(LastCallDocEvent, type="sent_last_call")
last_call_expires = e.expires if e else None last_call_expires = e.expires if e else None
last_call_has_expired = last_call_expires and last_call_expires < datetime.datetime.now() last_call_has_expired = last_call_expires and last_call_expires < timezone.now()
return render_to_string("doc/mail/issue_iesg_ballot_mail.txt", return render_to_string("doc/mail/issue_iesg_ballot_mail.txt",
dict(doc=doc, dict(doc=doc,
@ -437,7 +438,7 @@ def _send_irsg_ballot_email(request, doc, ballot, subject, template):
(to, cc) = gather_address_lists('irsg_ballot_issued', doc=doc) (to, cc) = gather_address_lists('irsg_ballot_issued', doc=doc)
sender = 'IESG Secretary <iesg-secretary@ietf.org>' sender = 'IESG Secretary <iesg-secretary@ietf.org>'
ballot_expired = ballot.duedate < datetime.datetime.now() ballot_expired = ballot.duedate < timezone.now()
active_ballot = doc.active_ballot() active_ballot = doc.active_ballot()
if active_ballot is None: if active_ballot is None:
needed_bps = '' needed_bps = ''

View file

@ -16,6 +16,7 @@ from tempfile import mkstemp
from django.conf import settings from django.conf import settings
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -101,7 +102,7 @@ class Command(BaseCommand):
'that have seen activity in the last %s years.' % (DEFAULT_YEARS)) 'that have seen activity in the last %s years.' % (DEFAULT_YEARS))
def handle(self, *args, **options): def handle(self, *args, **options):
show_since = datetime.datetime.now() - datetime.timedelta(DEFAULT_YEARS*365) show_since = timezone.now() - datetime.timedelta(DEFAULT_YEARS*365)
date = time.strftime("%Y-%m-%d_%H:%M:%S") date = time.strftime("%Y-%m-%d_%H:%M:%S")
signature = '# Generated by %s at %s\n' % (os.path.abspath(__file__), date) signature = '# Generated by %s at %s\n' % (os.path.abspath(__file__), date)

View file

@ -11,6 +11,7 @@ import sys
from django.conf import settings from django.conf import settings
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -68,7 +69,7 @@ class Command(BaseCommand):
if process_all: if process_all:
doc_events = NewRevisionDocEvent.objects.filter(type='new_revision', doc__type_id='draft') doc_events = NewRevisionDocEvent.objects.filter(type='new_revision', doc__type_id='draft')
else: else:
start = datetime.datetime.now() - datetime.timedelta(days=days) start = timezone.now() - datetime.timedelta(days=days)
doc_events = NewRevisionDocEvent.objects.filter(type='new_revision', doc__type_id='draft', time__gte=start) doc_events = NewRevisionDocEvent.objects.filter(type='new_revision', doc__type_id='draft', time__gte=start)
doc_events = doc_events.order_by('time') doc_events = doc_events.order_by('time')

View file

@ -0,0 +1,39 @@
# Generated by Django 2.2.28 on 2022-07-12 11:24
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('doc', '0044_procmaterials_states'),
]
operations = [
migrations.AlterField(
model_name='deletedevent',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='docevent',
name='time',
field=models.DateTimeField(db_index=True, default=django.utils.timezone.now, help_text='When the event happened'),
),
migrations.AlterField(
model_name='dochistory',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='document',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='documentactionholder',
name='time_added',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

View file

@ -18,6 +18,7 @@ from django.core.validators import URLValidator, RegexValidator
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.conf import settings from django.conf import settings
from django.utils import timezone
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.html import mark_safe # type:ignore from django.utils.html import mark_safe # type:ignore
@ -85,7 +86,7 @@ IESG_SUBSTATE_TAGS = ('ad-f-up', 'need-rev', 'extpty')
class DocumentInfo(models.Model): class DocumentInfo(models.Model):
"""Any kind of document. Draft, RFC, Charter, IPR Statement, Liaison Statement""" """Any kind of document. Draft, RFC, Charter, IPR Statement, Liaison Statement"""
time = models.DateTimeField(default=datetime.datetime.now) # should probably have auto_now=True time = models.DateTimeField(default=timezone.now) # should probably have auto_now=True
type = ForeignKey(DocTypeName, blank=True, null=True) # Draft, Agenda, Minutes, Charter, Discuss, Guideline, Email, Review, Issue, Wiki, External ... type = ForeignKey(DocTypeName, blank=True, null=True) # Draft, Agenda, Minutes, Charter, Discuss, Guideline, Email, Review, Issue, Wiki, External ...
title = models.CharField(max_length=255, validators=[validate_no_control_chars, ]) title = models.CharField(max_length=255, validators=[validate_no_control_chars, ])
@ -682,7 +683,7 @@ class DocumentActionHolder(models.Model):
"""Action holder for a document""" """Action holder for a document"""
document = ForeignKey('Document') document = ForeignKey('Document')
person = ForeignKey(Person) person = ForeignKey(Person)
time_added = models.DateTimeField(default=datetime.datetime.now) time_added = models.DateTimeField(default=timezone.now)
CLEAR_ACTION_HOLDERS_STATES = ['approved', 'ann', 'rfcqueue', 'pub', 'dead'] # draft-iesg state slugs CLEAR_ACTION_HOLDERS_STATES = ['approved', 'ann', 'rfcqueue', 'pub', 'dead'] # draft-iesg state slugs
GROUP_ROLES_OF_INTEREST = ['chair', 'techadv', 'editor', 'secr'] GROUP_ROLES_OF_INTEREST = ['chair', 'techadv', 'editor', 'secr']
@ -838,7 +839,7 @@ class Document(DocumentInfo):
def previous_telechat_date(self): def previous_telechat_date(self):
"Return the most recent telechat date in the past, if any (even if there's another in the future)" "Return the most recent telechat date in the past, if any (even if there's another in the future)"
e = self.latest_event(TelechatDocEvent, type="scheduled_for_telechat", telechat_date__lt=datetime.datetime.now()) e = self.latest_event(TelechatDocEvent, type="scheduled_for_telechat", telechat_date__lt=timezone.now())
return e.telechat_date if e else None return e.telechat_date if e else None
def request_closed_time(self, review_req): def request_closed_time(self, review_req):
@ -1208,7 +1209,7 @@ EVENT_TYPES = [
class DocEvent(models.Model): class DocEvent(models.Model):
"""An occurrence for a document, used for tracking who, when and what.""" """An occurrence for a document, used for tracking who, when and what."""
time = models.DateTimeField(default=datetime.datetime.now, help_text="When the event happened", db_index=True) time = models.DateTimeField(default=timezone.now, help_text="When the event happened", db_index=True)
type = models.CharField(max_length=50, choices=EVENT_TYPES) type = models.CharField(max_length=50, choices=EVENT_TYPES)
by = ForeignKey(Person) by = ForeignKey(Person)
doc = ForeignKey(Document) doc = ForeignKey(Document)
@ -1388,7 +1389,7 @@ class DeletedEvent(models.Model):
content_type = ForeignKey(ContentType) content_type = ForeignKey(ContentType)
json = models.TextField(help_text="Deleted object in JSON format, with attribute names chosen to be suitable for passing into the relevant create method.") json = models.TextField(help_text="Deleted object in JSON format, with attribute names chosen to be suitable for passing into the relevant create method.")
by = ForeignKey(Person) by = ForeignKey(Person)
time = models.DateTimeField(default=datetime.datetime.now) time = models.DateTimeField(default=timezone.now)
def __str__(self): def __str__(self):
return u"%s by %s %s" % (self.content_type, self.by, self.time) return u"%s by %s %s" % (self.content_type, self.by, self.time)

View file

@ -18,6 +18,7 @@ from django.urls import reverse as urlreverse
from django.core.cache import cache from django.core.cache import cache
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.urls import NoReverseMatch from django.urls import NoReverseMatch
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -318,7 +319,7 @@ def timesince_days(date):
"""Returns the number of days since 'date' (relative to now)""" """Returns the number of days since 'date' (relative to now)"""
if date.__class__ is not datetime.datetime: if date.__class__ is not datetime.datetime:
date = datetime.datetime(date.year, date.month, date.day) date = datetime.datetime(date.year, date.month, date.day)
delta = datetime.datetime.now() - date delta = timezone.now() - date
return delta.days return delta.days
@register.filter @register.filter
@ -637,19 +638,19 @@ def action_holder_badge(action_holder):
>>> action_holder_badge(DocumentActionHolderFactory()) >>> action_holder_badge(DocumentActionHolderFactory())
'' ''
>>> action_holder_badge(DocumentActionHolderFactory(time_added=datetime.datetime.now() - datetime.timedelta(days=15))) >>> action_holder_badge(DocumentActionHolderFactory(time_added=timezone.now() - datetime.timedelta(days=15)))
'' ''
>>> action_holder_badge(DocumentActionHolderFactory(time_added=datetime.datetime.now() - datetime.timedelta(days=16))) >>> action_holder_badge(DocumentActionHolderFactory(time_added=timezone.now() - datetime.timedelta(days=16)))
'<span class="badge bg-danger" title="In state for 16 days; goal is &lt;15 days."><i class="bi bi-clock-fill"></i> 16</span>' '<span class="badge bg-danger" title="In state for 16 days; goal is &lt;15 days."><i class="bi bi-clock-fill"></i> 16</span>'
>>> action_holder_badge(DocumentActionHolderFactory(time_added=datetime.datetime.now() - datetime.timedelta(days=30))) >>> action_holder_badge(DocumentActionHolderFactory(time_added=timezone.now() - datetime.timedelta(days=30)))
'<span class="badge bg-danger" title="In state for 30 days; goal is &lt;15 days."><i class="bi bi-clock-fill"></i> 30</span>' '<span class="badge bg-danger" title="In state for 30 days; goal is &lt;15 days."><i class="bi bi-clock-fill"></i> 30</span>'
>>> settings.DOC_ACTION_HOLDER_AGE_LIMIT_DAYS = old_limit >>> settings.DOC_ACTION_HOLDER_AGE_LIMIT_DAYS = old_limit
""" """
age_limit = settings.DOC_ACTION_HOLDER_AGE_LIMIT_DAYS age_limit = settings.DOC_ACTION_HOLDER_AGE_LIMIT_DAYS
age = (datetime.datetime.now() - action_holder.time_added).days age = (timezone.now() - action_holder.time_added).days
if age > age_limit: if age > age_limit:
return mark_safe( return mark_safe(
'<span class="badge bg-danger" title="In state for %d day%s; goal is &lt;%d days."><i class="bi bi-clock-fill"></i> %d</span>' '<span class="badge bg-danger" title="In state for %d day%s; goal is &lt;%d days."><i class="bi bi-clock-fill"></i> %d</span>'

View file

@ -25,6 +25,7 @@ from django.conf import settings
from django.forms import Form from django.forms import Form
from django.utils.html import escape from django.utils.html import escape
from django.test import override_settings from django.test import override_settings
from django.utils import timezone
from django.utils.text import slugify from django.utils.text import slugify
from tastypie.test import ResourceTestCaseMixin from tastypie.test import ResourceTestCaseMixin
@ -385,13 +386,13 @@ class SearchTests(TestCase):
# Three drafts to show with various warnings # Three drafts to show with various warnings
drafts = WgDraftFactory.create_batch(3,states=[('draft','active'),('draft-iesg','ad-eval')]) drafts = WgDraftFactory.create_batch(3,states=[('draft','active'),('draft-iesg','ad-eval')])
for index, draft in enumerate(drafts): for index, draft in enumerate(drafts):
StateDocEventFactory(doc=draft, state=('draft-iesg','ad-eval'), time=datetime.datetime.now()-datetime.timedelta(days=[1,15,29][index])) StateDocEventFactory(doc=draft, state=('draft-iesg','ad-eval'), time=timezone.now()-datetime.timedelta(days=[1,15,29][index]))
draft.action_holders.set([PersonFactory()]) draft.action_holders.set([PersonFactory()])
# And one draft that should not show (with the default of 7 days to view) # And one draft that should not show (with the default of 7 days to view)
old = WgDraftFactory() old = WgDraftFactory()
old.docevent_set.filter(newrevisiondocevent__isnull=False).update(time=datetime.datetime.now()-datetime.timedelta(days=8)) old.docevent_set.filter(newrevisiondocevent__isnull=False).update(time=timezone.now()-datetime.timedelta(days=8))
StateDocEventFactory(doc=old, time=datetime.datetime.now()-datetime.timedelta(days=8)) StateDocEventFactory(doc=old, time=timezone.now()-datetime.timedelta(days=8))
url = urlreverse('ietf.doc.views_search.recent_drafts') url = urlreverse('ietf.doc.views_search.recent_drafts')
r = self.client.get(url) r = self.client.get(url)
@ -764,7 +765,7 @@ Man Expires September 22, 2015 [Page 3]
replacement = WgDraftFactory( replacement = WgDraftFactory(
name="draft-ietf-replacement", name="draft-ietf-replacement",
time=datetime.datetime.now(), time=timezone.now(),
title="Replacement Draft", title="Replacement Draft",
stream_id=draft.stream_id, group_id=draft.group_id, abstract=draft.abstract,stream=draft.stream, rev=draft.rev, stream_id=draft.stream_id, group_id=draft.group_id, abstract=draft.abstract,stream=draft.stream, rev=draft.rev,
pages=draft.pages, intended_std_level_id=draft.intended_std_level_id, pages=draft.pages, intended_std_level_id=draft.intended_std_level_id,
@ -1580,7 +1581,7 @@ class DocTestCase(TestCase):
name = "session-72-mars-1", name = "session-72-mars-1",
meeting = Meeting.objects.get(number='72'), meeting = Meeting.objects.get(number='72'),
group = Group.objects.get(acronym='mars'), group = Group.objects.get(acronym='mars'),
modified = datetime.datetime.now(), modified = timezone.now(),
add_to_schedule=False, add_to_schedule=False,
) )
SchedulingEvent.objects.create( SchedulingEvent.objects.create(
@ -1610,7 +1611,7 @@ class DocTestCase(TestCase):
type="changed_ballot_position", type="changed_ballot_position",
pos_id="yes", pos_id="yes",
comment="Looks fine to me", comment="Looks fine to me",
comment_time=datetime.datetime.now(), comment_time=timezone.now(),
balloter=Person.objects.get(user__username="ad"), balloter=Person.objects.get(user__username="ad"),
by=Person.objects.get(name="(System)")) by=Person.objects.get(name="(System)"))
@ -1644,7 +1645,7 @@ class DocTestCase(TestCase):
type="changed_ballot_position", type="changed_ballot_position",
pos_id="noobj", pos_id="noobj",
comment="Still looks okay to me", comment="Still looks okay to me",
comment_time=datetime.datetime.now(), comment_time=timezone.now(),
balloter=Person.objects.get(user__username="ad"), balloter=Person.objects.get(user__username="ad"),
by=Person.objects.get(name="(System)")) by=Person.objects.get(name="(System)"))
@ -1666,7 +1667,7 @@ class DocTestCase(TestCase):
type="changed_ballot_position", type="changed_ballot_position",
pos_id="yes", pos_id="yes",
comment="Looks fine to me", comment="Looks fine to me",
comment_time=datetime.datetime.now(), comment_time=timezone.now(),
balloter=Person.objects.get(user__username="ad"), balloter=Person.objects.get(user__username="ad"),
by=Person.objects.get(name="(System)")) by=Person.objects.get(name="(System)"))
@ -2043,7 +2044,7 @@ class GenerateDraftAliasesTests(TestCase):
super().tearDown() super().tearDown()
def testManagementCommand(self): def testManagementCommand(self):
a_month_ago = datetime.datetime.now() - datetime.timedelta(30) a_month_ago = timezone.now() - datetime.timedelta(30)
ad = RoleFactory(name_id='ad', group__type_id='area', group__state_id='active').person ad = RoleFactory(name_id='ad', group__type_id='area', group__state_id='active').person
shepherd = PersonFactory() shepherd = PersonFactory()
author1 = PersonFactory() author1 = PersonFactory()

View file

@ -12,6 +12,7 @@ import debug # pyflakes:ignore
from django.test import RequestFactory from django.test import RequestFactory
from django.utils.text import slugify from django.utils.text import slugify
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
from ietf.doc.models import (Document, State, DocEvent, from ietf.doc.models import (Document, State, DocEvent,
BallotPositionDocEvent, LastCallDocEvent, WriteupDocEvent, TelechatDocEvent) BallotPositionDocEvent, LastCallDocEvent, WriteupDocEvent, TelechatDocEvent)
@ -105,7 +106,7 @@ class EditPositionTests(TestCase):
draft = WgDraftFactory(ad=ad) draft = WgDraftFactory(ad=ad)
url = urlreverse('ietf.doc.views_ballot.api_set_position') url = urlreverse('ietf.doc.views_ballot.api_set_position')
create_ballot_if_not_open(None, draft, ad, 'approve') create_ballot_if_not_open(None, draft, ad, 'approve')
ad.user.last_login = datetime.datetime.now() ad.user.last_login = timezone.now()
ad.user.save() ad.user.save()
apikey = PersonalApiKey.objects.create(endpoint=url, person=ad) apikey = PersonalApiKey.objects.create(endpoint=url, person=ad)
@ -238,9 +239,9 @@ class EditPositionTests(TestCase):
doc=draft, rev=draft.rev, type="changed_ballot_position", doc=draft, rev=draft.rev, type="changed_ballot_position",
by=ad, balloter=ad, ballot=ballot, pos=BallotPositionName.objects.get(slug="discuss"), by=ad, balloter=ad, ballot=ballot, pos=BallotPositionName.objects.get(slug="discuss"),
discuss="This draft seems to be lacking a clearer title?", discuss="This draft seems to be lacking a clearer title?",
discuss_time=datetime.datetime.now(), discuss_time=timezone.now(),
comment="Test!", comment="Test!",
comment_time=datetime.datetime.now()) comment_time=timezone.now())
url = urlreverse('ietf.doc.views_ballot.send_ballot_comment', kwargs=dict(name=draft.name, url = urlreverse('ietf.doc.views_ballot.send_ballot_comment', kwargs=dict(name=draft.name,
ballot_id=ballot.pk)) ballot_id=ballot.pk))
@ -466,7 +467,7 @@ class BallotWriteupsTests(TestCase):
doc=draft, doc=draft,
rev=draft.rev, rev=draft.rev,
desc='issued last call', desc='issued last call',
expires = datetime.datetime.now()+datetime.timedelta(days = 1 if case=='future' else -1) expires = timezone.now()+datetime.timedelta(days = 1 if case=='future' else -1)
) )
url = urlreverse('ietf.doc.views_ballot.ballot_writeupnotes', kwargs=dict(name=draft.name)) url = urlreverse('ietf.doc.views_ballot.ballot_writeupnotes', kwargs=dict(name=draft.name))
login_testing_unauthorized(self, "ad", url) login_testing_unauthorized(self, "ad", url)
@ -791,7 +792,7 @@ class ApproveBallotTests(TestCase):
doc=draft, doc=draft,
rev=draft.rev, rev=draft.rev,
desc='issued last call', desc='issued last call',
expires = datetime.datetime.now()-datetime.timedelta(days=14) ) expires = timezone.now()-datetime.timedelta(days=14) )
WriteupDocEvent.objects.create( WriteupDocEvent.objects.create(
by=Person.objects.get(name='(System)'), by=Person.objects.get(name='(System)'),
doc=draft, doc=draft,
@ -1117,7 +1118,7 @@ class RegenerateLastCallTestCase(TestCase):
class BallotContentTests(TestCase): class BallotContentTests(TestCase):
def test_ballotpositiondocevent_any_email_sent(self): def test_ballotpositiondocevent_any_email_sent(self):
now = datetime.datetime.now() # be sure event timestamps are at distinct times now = timezone.now() # be sure event timestamps are at distinct times
bpde_with_null_send_email = BallotPositionDocEventFactory( bpde_with_null_send_email = BallotPositionDocEventFactory(
time=now - datetime.timedelta(minutes=30), time=now - datetime.timedelta(minutes=30),
send_email=None, send_email=None,
@ -1219,7 +1220,7 @@ class BallotContentTests(TestCase):
balloter=balloters[0], balloter=balloters[0],
pos_id='discuss', pos_id='discuss',
discuss='Discussion text', discuss='Discussion text',
discuss_time=datetime.datetime.now(), discuss_time=timezone.now(),
send_email=True, send_email=True,
) )
BallotPositionDocEventFactory( BallotPositionDocEventFactory(
@ -1227,7 +1228,7 @@ class BallotContentTests(TestCase):
balloter=balloters[1], balloter=balloters[1],
pos_id='noobj', pos_id='noobj',
comment='Commentary', comment='Commentary',
comment_time=datetime.datetime.now(), comment_time=timezone.now(),
send_email=True, send_email=True,
) )
@ -1237,7 +1238,7 @@ class BallotContentTests(TestCase):
balloter=balloters[2], balloter=balloters[2],
pos_id='discuss', pos_id='discuss',
discuss='Discussion text', discuss='Discussion text',
discuss_time=datetime.datetime.now(), discuss_time=timezone.now(),
send_email=False, send_email=False,
) )
BallotPositionDocEventFactory( BallotPositionDocEventFactory(
@ -1245,7 +1246,7 @@ class BallotContentTests(TestCase):
balloter=balloters[3], balloter=balloters[3],
pos_id='noobj', pos_id='noobj',
comment='Commentary', comment='Commentary',
comment_time=datetime.datetime.now(), comment_time=timezone.now(),
send_email=False, send_email=False,
) )
@ -1255,7 +1256,7 @@ class BallotContentTests(TestCase):
balloter=balloters[4], balloter=balloters[4],
pos_id='discuss', pos_id='discuss',
discuss='Discussion text', discuss='Discussion text',
discuss_time=datetime.datetime.now() - datetime.timedelta(days=1), discuss_time=timezone.now() - datetime.timedelta(days=1),
send_email=True, send_email=True,
) )
BallotPositionDocEventFactory( BallotPositionDocEventFactory(
@ -1263,7 +1264,7 @@ class BallotContentTests(TestCase):
balloter=balloters[4], balloter=balloters[4],
pos_id='discuss', pos_id='discuss',
discuss='Discussion text', discuss='Discussion text',
discuss_time=datetime.datetime.now(), discuss_time=timezone.now(),
send_email=False, send_email=False,
) )
BallotPositionDocEventFactory( BallotPositionDocEventFactory(
@ -1271,7 +1272,7 @@ class BallotContentTests(TestCase):
balloter=balloters[5], balloter=balloters[5],
pos_id='noobj', pos_id='noobj',
comment='Commentary', comment='Commentary',
comment_time=datetime.datetime.now() - datetime.timedelta(days=1), comment_time=timezone.now() - datetime.timedelta(days=1),
send_email=True, send_email=True,
) )
BallotPositionDocEventFactory( BallotPositionDocEventFactory(
@ -1279,7 +1280,7 @@ class BallotContentTests(TestCase):
balloter=balloters[5], balloter=balloters[5],
pos_id='noobj', pos_id='noobj',
comment='Commentary', comment='Commentary',
comment_time=datetime.datetime.now(), comment_time=timezone.now(),
send_email=False, send_email=False,
) )
@ -1296,7 +1297,7 @@ class BallotContentTests(TestCase):
balloter__plain='plain name1', balloter__plain='plain name1',
pos_id='discuss', pos_id='discuss',
discuss='Discussion text', discuss='Discussion text',
discuss_time=datetime.datetime.now(), discuss_time=timezone.now(),
send_email=False, send_email=False,
).balloter ).balloter
send_email_balloter = BallotPositionDocEventFactory( send_email_balloter = BallotPositionDocEventFactory(
@ -1304,7 +1305,7 @@ class BallotContentTests(TestCase):
balloter__plain='plain name2', balloter__plain='plain name2',
pos_id='discuss', pos_id='discuss',
discuss='Discussion text', discuss='Discussion text',
discuss_time=datetime.datetime.now(), discuss_time=timezone.now(),
send_email=True, send_email=True,
).balloter ).balloter
prev_send_email_balloter = BallotPositionDocEventFactory( prev_send_email_balloter = BallotPositionDocEventFactory(
@ -1312,7 +1313,7 @@ class BallotContentTests(TestCase):
balloter__plain='plain name3', balloter__plain='plain name3',
pos_id='discuss', pos_id='discuss',
discuss='Discussion text', discuss='Discussion text',
discuss_time=datetime.datetime.now() - datetime.timedelta(days=1), discuss_time=timezone.now() - datetime.timedelta(days=1),
send_email=True, send_email=True,
).balloter ).balloter
BallotPositionDocEventFactory( BallotPositionDocEventFactory(
@ -1320,7 +1321,7 @@ class BallotContentTests(TestCase):
balloter=prev_send_email_balloter, balloter=prev_send_email_balloter,
pos_id='discuss', pos_id='discuss',
discuss='Discussion text', discuss='Discussion text',
discuss_time=datetime.datetime.now(), discuss_time=timezone.now(),
send_email=False, send_email=False,
) )
@ -1351,7 +1352,7 @@ class BallotContentTests(TestCase):
balloter=balloters[0], balloter=balloters[0],
pos_id='discuss', pos_id='discuss',
discuss='Discussion text', discuss='Discussion text',
discuss_time=datetime.datetime.now(), discuss_time=timezone.now(),
send_email=None, send_email=None,
) )
BallotPositionDocEventFactory( BallotPositionDocEventFactory(
@ -1359,7 +1360,7 @@ class BallotContentTests(TestCase):
balloter=balloters[1], balloter=balloters[1],
pos_id='noobj', pos_id='noobj',
comment='Commentary', comment='Commentary',
comment_time=datetime.datetime.now(), comment_time=timezone.now(),
send_email=None, send_email=None,
) )
old_balloter = BallotPositionDocEventFactory( old_balloter = BallotPositionDocEventFactory(
@ -1367,7 +1368,7 @@ class BallotContentTests(TestCase):
balloter__plain='plain name', # ensure plain name is slugifiable balloter__plain='plain name', # ensure plain name is slugifiable
pos_id='discuss', pos_id='discuss',
discuss='Discussion text', discuss='Discussion text',
discuss_time=datetime.datetime.now(), discuss_time=timezone.now(),
send_email=None, send_email=None,
).balloter ).balloter

View file

@ -14,6 +14,7 @@ from html import unescape
from django.conf import settings from django.conf import settings
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone
from ietf.group.factories import RoleFactory from ietf.group.factories import RoleFactory
from ietf.doc.factories import BofreqFactory, NewRevisionDocEventFactory from ietf.doc.factories import BofreqFactory, NewRevisionDocEventFactory
@ -48,7 +49,7 @@ This test section has some text.
states = State.objects.filter(type_id='bofreq') states = State.objects.filter(type_id='bofreq')
self.assertTrue(states.count()>0) self.assertTrue(states.count()>0)
for i in range(3*len(states)): for i in range(3*len(states)):
BofreqFactory(states=[('bofreq',states[i%len(states)].slug)],newrevisiondocevent__time=datetime.datetime.today()-datetime.timedelta(days=randint(0,20))) BofreqFactory(states=[('bofreq',states[i%len(states)].slug)],newrevisiondocevent__time=timezone.now()-datetime.timedelta(days=randint(0,20)))
r = self.client.get(url) r = self.client.get(url)
self.assertEqual(r.status_code, 200) self.assertEqual(r.status_code, 200)
q = PyQuery(r.content) q = PyQuery(r.content)

View file

@ -13,6 +13,7 @@ from pyquery import PyQuery
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.conf import settings from django.conf import settings
from django.utils import timezone
from django.utils.html import escape from django.utils.html import escape
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -618,7 +619,7 @@ class ResurrectTests(DraftFileMixin, TestCase):
self.assertEqual(draft.docevent_set.count(), events_before + 1) self.assertEqual(draft.docevent_set.count(), events_before + 1)
self.assertEqual(draft.latest_event().type, "completed_resurrect") self.assertEqual(draft.latest_event().type, "completed_resurrect")
self.assertEqual(draft.get_state_slug(), "active") self.assertEqual(draft.get_state_slug(), "active")
self.assertTrue(draft.expires >= datetime.datetime.now() + datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE - 1)) self.assertTrue(draft.expires >= timezone.now() + datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE - 1))
self.assertEqual(len(outbox), mailbox_before + 1) self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue('Resurrection Completed' in outbox[-1]['Subject']) self.assertTrue('Resurrection Completed' in outbox[-1]['Subject'])
self.assertTrue('iesg-secretary' in outbox[-1]['To']) self.assertTrue('iesg-secretary' in outbox[-1]['To'])
@ -659,7 +660,7 @@ class ExpireIDsTests(DraftFileMixin, TestCase):
# hack into expirable state # hack into expirable state
draft.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) draft.set_state(State.objects.get(type_id='draft-iesg',slug='idexists'))
draft.expires = datetime.datetime.now() + datetime.timedelta(days=10) draft.expires = timezone.now() + datetime.timedelta(days=10)
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")]) draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
self.assertEqual(len(list(get_soon_to_expire_drafts(14))), 1) self.assertEqual(len(list(get_soon_to_expire_drafts(14))), 1)
@ -698,7 +699,7 @@ class ExpireIDsTests(DraftFileMixin, TestCase):
# hack into expirable state # hack into expirable state
draft.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) draft.set_state(State.objects.get(type_id='draft-iesg',slug='idexists'))
draft.expires = datetime.datetime.now() draft.expires = timezone.now()
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")]) draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
self.assertEqual(len(list(get_expired_drafts())), 1) self.assertEqual(len(list(get_expired_drafts())), 1)
@ -741,7 +742,7 @@ class ExpireIDsTests(DraftFileMixin, TestCase):
draft.delete() draft.delete()
rgdraft = RgDraftFactory(expires=datetime.datetime.now()) rgdraft = RgDraftFactory(expires=timezone.now())
self.assertEqual(len(list(get_expired_drafts())), 1) self.assertEqual(len(list(get_expired_drafts())), 1)
for slug in ('iesg-rev','irsgpoll'): for slug in ('iesg-rev','irsgpoll'):
rgdraft.set_state(State.objects.get(type_id='draft-stream-irtf',slug=slug)) rgdraft.set_state(State.objects.get(type_id='draft-stream-irtf',slug=slug))
@ -791,7 +792,7 @@ class ExpireIDsTests(DraftFileMixin, TestCase):
# expire draft # expire draft
draft.set_state(State.objects.get(used=True, type="draft", slug="expired")) draft.set_state(State.objects.get(used=True, type="draft", slug="expired"))
draft.expires = datetime.datetime.now() - datetime.timedelta(days=1) draft.expires = timezone.now() - datetime.timedelta(days=1)
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")]) draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
e = DocEvent(doc=draft, rev=draft.rev, type= "expired_document", time=draft.expires, e = DocEvent(doc=draft, rev=draft.rev, type= "expired_document", time=draft.expires,
@ -824,7 +825,7 @@ class ExpireLastCallTests(TestCase):
e = LastCallDocEvent(doc=draft, rev=draft.rev, type="sent_last_call", by=secretary) e = LastCallDocEvent(doc=draft, rev=draft.rev, type="sent_last_call", by=secretary)
e.text = "Last call sent" e.text = "Last call sent"
e.expires = datetime.datetime.now() + datetime.timedelta(days=14) e.expires = timezone.now() + datetime.timedelta(days=14)
e.save() e.save()
self.assertEqual(len(list(get_expired_last_calls())), 0) self.assertEqual(len(list(get_expired_last_calls())), 0)
@ -832,7 +833,7 @@ class ExpireLastCallTests(TestCase):
# test expired # test expired
e = LastCallDocEvent(doc=draft, rev=draft.rev, type="sent_last_call", by=secretary) e = LastCallDocEvent(doc=draft, rev=draft.rev, type="sent_last_call", by=secretary)
e.text = "Last call sent" e.text = "Last call sent"
e.expires = datetime.datetime.now() e.expires = timezone.now()
e.save() e.save()
drafts = list(get_expired_last_calls()) drafts = list(get_expired_last_calls())
@ -866,7 +867,7 @@ class ExpireLastCallTests(TestCase):
e = LastCallDocEvent(doc=draft, rev=draft.rev, type="sent_last_call", by=secretary) e = LastCallDocEvent(doc=draft, rev=draft.rev, type="sent_last_call", by=secretary)
e.text = "Last call sent" e.text = "Last call sent"
e.desc = "Blah, blah, blah.\n\nThis document makes the following downward references (downrefs):\n ** Downref: Normative reference to an Experimental RFC: RFC 4764" e.desc = "Blah, blah, blah.\n\nThis document makes the following downward references (downrefs):\n ** Downref: Normative reference to an Experimental RFC: RFC 4764"
e.expires = datetime.datetime.now() e.expires = timezone.now()
e.save() e.save()
drafts = list(get_expired_last_calls()) drafts = list(get_expired_last_calls())
@ -1730,7 +1731,7 @@ class ChangeStreamStateTests(TestCase):
self.assertEqual(draft.docevent_set.count() - events_before, 2) self.assertEqual(draft.docevent_set.count() - events_before, 2)
reminder = DocReminder.objects.filter(event__doc=draft, type="stream-s") reminder = DocReminder.objects.filter(event__doc=draft, type="stream-s")
self.assertEqual(len(reminder), 1) self.assertEqual(len(reminder), 1)
due = datetime.datetime.now() + datetime.timedelta(weeks=10) due = timezone.now() + datetime.timedelta(weeks=10)
self.assertTrue(due - datetime.timedelta(days=1) <= reminder[0].due <= due + datetime.timedelta(days=1)) self.assertTrue(due - datetime.timedelta(days=1) <= reminder[0].due <= due + datetime.timedelta(days=1))
self.assertEqual(len(outbox), 1) self.assertEqual(len(outbox), 1)
self.assertTrue("state changed" in outbox[0]["Subject"].lower()) self.assertTrue("state changed" in outbox[0]["Subject"].lower())
@ -1775,7 +1776,7 @@ class ChangeStreamStateTests(TestCase):
self.assertEqual(draft.docevent_set.count() - events_before, 2) self.assertEqual(draft.docevent_set.count() - events_before, 2)
reminder = DocReminder.objects.filter(event__doc=draft, type="stream-s") reminder = DocReminder.objects.filter(event__doc=draft, type="stream-s")
self.assertEqual(len(reminder), 1) self.assertEqual(len(reminder), 1)
due = datetime.datetime.now() + datetime.timedelta(weeks=10) due = timezone.now() + datetime.timedelta(weeks=10)
self.assertTrue(due - datetime.timedelta(days=1) <= reminder[0].due <= due + datetime.timedelta(days=1)) self.assertTrue(due - datetime.timedelta(days=1) <= reminder[0].due <= due + datetime.timedelta(days=1))
self.assertEqual(len(outbox), 1) self.assertEqual(len(outbox), 1)
self.assertTrue("state changed" in outbox[0]["Subject"].lower()) self.assertTrue("state changed" in outbox[0]["Subject"].lower())
@ -1826,7 +1827,7 @@ class ChangeReplacesTests(TestCase):
name="draft-test-base-b", name="draft-test-base-b",
title="Base B", title="Base B",
group=mars_wg, group=mars_wg,
expires = datetime.datetime.now() - datetime.timedelta(days = 365 - settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), expires = timezone.now() - datetime.timedelta(days = 365 - settings.INTERNET_DRAFT_DAYS_TO_EXPIRE),
) )
p = PersonFactory(name="baseb_author") p = PersonFactory(name="baseb_author")
e = Email.objects.create(address="baseb_author@example.com", person=p, origin=p.user.username) e = Email.objects.create(address="baseb_author@example.com", person=p, origin=p.user.username)

View file

@ -4,7 +4,6 @@
import os import os
import shutil import shutil
import datetime
import io import io
from pathlib import Path from pathlib import Path
@ -14,6 +13,7 @@ import debug # pyflakes:ignore
from django.conf import settings from django.conf import settings
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
from ietf.doc.models import Document, State, DocAlias, NewRevisionDocEvent from ietf.doc.models import Document, State, DocAlias, NewRevisionDocEvent
from ietf.group.factories import RoleFactory from ietf.group.factories import RoleFactory
@ -155,7 +155,7 @@ class GroupMaterialTests(TestCase):
name = "session-42-mars-1", name = "session-42-mars-1",
meeting = Meeting.objects.get(number='42'), meeting = Meeting.objects.get(number='42'),
group = Group.objects.get(acronym='mars'), group = Group.objects.get(acronym='mars'),
modified = datetime.datetime.now(), modified = timezone.now(),
) )
SchedulingEvent.objects.create( SchedulingEvent.objects.create(
session=session, session=session,

View file

@ -14,6 +14,7 @@ from requests import Response
from django.apps import apps from django.apps import apps
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.conf import settings from django.conf import settings
from django.utils import timezone
from pyquery import PyQuery from pyquery import PyQuery
@ -67,7 +68,7 @@ class ReviewTests(TestCase):
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr') RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
RoleFactory(group=review_team3,person__user__username='reviewsecretary3',person__user__email='reviewsecretary3@example.com',name_id='secr') RoleFactory(group=review_team3,person__user__username='reviewsecretary3',person__user__email='reviewsecretary3@example.com',name_id='secr')
req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20)) req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=timezone.now()+datetime.timedelta(days=20))
ReviewAssignmentFactory(review_request = req, reviewer = rev_role.person.email_set.first(), state_id='accepted') ReviewAssignmentFactory(review_request = req, reviewer = rev_role.person.email_set.first(), state_id='accepted')
url = urlreverse('ietf.doc.views_review.request_review', kwargs={ "name": doc.name }) url = urlreverse('ietf.doc.views_review.request_review', kwargs={ "name": doc.name })
@ -145,7 +146,7 @@ class ReviewTests(TestCase):
doc = WgDraftFactory(group__acronym='mars',rev='01') doc = WgDraftFactory(group__acronym='mars',rev='01')
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut")) review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer') rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20)) review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=timezone.now()+datetime.timedelta(days=20))
ReviewAssignmentFactory(review_request=review_req, reviewer=rev_role.person.email_set.first(), state_id='accepted') ReviewAssignmentFactory(review_request=review_req, reviewer=rev_role.person.email_set.first(), state_id='accepted')
# move the review request to a doubly-replaced document to # move the review request to a doubly-replaced document to
@ -166,7 +167,7 @@ class ReviewTests(TestCase):
doc = WgDraftFactory(group__acronym='mars',rev='01', authors=[author]) doc = WgDraftFactory(group__acronym='mars',rev='01', authors=[author])
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut")) review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer') rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20)) review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=timezone.now()+datetime.timedelta(days=20))
ReviewAssignmentFactory(review_request = review_req, reviewer = rev_role.person.email_set.first(), state_id='accepted') ReviewAssignmentFactory(review_request = review_req, reviewer = rev_role.person.email_set.first(), state_id='accepted')
url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": review_req.pk }) url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": review_req.pk })
@ -195,7 +196,7 @@ class ReviewTests(TestCase):
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer') rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr') RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
RoleFactory(group=review_team,person__user__username='reviewsecretary2',person__user__email='reviewsecretary2@example.com',name_id='secr') RoleFactory(group=review_team,person__user__username='reviewsecretary2',person__user__email='reviewsecretary2@example.com',name_id='secr')
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20)) review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=timezone.now()+datetime.timedelta(days=20))
ReviewAssignmentFactory(review_request=review_req, state_id='accepted', reviewer=rev_role.person.email_set.first()) ReviewAssignmentFactory(review_request=review_req, state_id='accepted', reviewer=rev_role.person.email_set.first())
close_url = urlreverse('ietf.doc.views_review.close_request', kwargs={ "name": doc.name, "request_id": review_req.pk }) close_url = urlreverse('ietf.doc.views_review.close_request', kwargs={ "name": doc.name, "request_id": review_req.pk })
@ -260,7 +261,7 @@ class ReviewTests(TestCase):
# previous review # previous review
req = ReviewRequestFactory( req = ReviewRequestFactory(
time=datetime.datetime.now() - datetime.timedelta(days=100), time=timezone.now() - datetime.timedelta(days=100),
requested_by=Person.objects.get(name="(System)"), requested_by=Person.objects.get(name="(System)"),
doc=doc, doc=doc,
type_id='early', type_id='early',
@ -372,7 +373,7 @@ class ReviewTests(TestCase):
doc = WgDraftFactory(group__acronym='mars',rev='01') doc = WgDraftFactory(group__acronym='mars',rev='01')
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut")) review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer') rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20)) review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=timezone.now()+datetime.timedelta(days=20))
assignment = ReviewAssignmentFactory(review_request=review_req, state_id='assigned', reviewer=rev_role.person.email_set.first()) assignment = ReviewAssignmentFactory(review_request=review_req, state_id='assigned', reviewer=rev_role.person.email_set.first())
url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": review_req.pk }) url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": review_req.pk })
@ -395,7 +396,7 @@ class ReviewTests(TestCase):
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut")) review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer') rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr') RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20)) review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=timezone.now()+datetime.timedelta(days=20))
assignment = ReviewAssignmentFactory(review_request = review_req, reviewer=rev_role.person.email_set.first(), state_id='accepted') assignment = ReviewAssignmentFactory(review_request = review_req, reviewer=rev_role.person.email_set.first(), state_id='accepted')
reject_url = urlreverse('ietf.doc.views_review.reject_reviewer_assignment', kwargs={ "name": doc.name, "assignment_id": assignment.pk }) reject_url = urlreverse('ietf.doc.views_review.reject_reviewer_assignment', kwargs={ "name": doc.name, "assignment_id": assignment.pk })
@ -495,7 +496,7 @@ class ReviewTests(TestCase):
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut")) review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer') rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr') RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20)) review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=timezone.now()+datetime.timedelta(days=20))
assignment = ReviewAssignmentFactory(review_request=review_req, reviewer=rev_role.person.email_set.first(), state_id='accepted') assignment = ReviewAssignmentFactory(review_request=review_req, reviewer=rev_role.person.email_set.first(), state_id='accepted')
# test URL construction # test URL construction
@ -587,7 +588,7 @@ class ReviewTests(TestCase):
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut")) review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer') rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr') RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20)) review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=timezone.now()+datetime.timedelta(days=20))
assignment = ReviewAssignmentFactory(review_request=review_req, state_id='accepted', reviewer=rev_role.person.email_set.first()) assignment = ReviewAssignmentFactory(review_request=review_req, state_id='accepted', reviewer=rev_role.person.email_set.first())
for r in ReviewResultName.objects.filter(slug__in=("issues", "ready")): for r in ReviewResultName.objects.filter(slug__in=("issues", "ready")):
review_req.team.reviewteamsettings.review_results.add(r) review_req.team.reviewteamsettings.review_results.add(r)
@ -699,7 +700,7 @@ class ReviewTests(TestCase):
assignment = reload_db_objects(assignment) assignment = reload_db_objects(assignment)
self.assertEqual(assignment.state_id, "completed") self.assertEqual(assignment.state_id, "completed")
# Completed time should be close to now, but will not be exactly, so check within 10s margin # Completed time should be close to now, but will not be exactly, so check within 10s margin
completed_time_diff = datetime.datetime.now() - assignment.completed_on completed_time_diff = timezone.now() - assignment.completed_on
self.assertLess(completed_time_diff, datetime.timedelta(seconds=10)) self.assertLess(completed_time_diff, datetime.timedelta(seconds=10))
with io.open(os.path.join(self.review_subdir, assignment.review.name + ".txt")) as f: with io.open(os.path.join(self.review_subdir, assignment.review.name + ".txt")) as f:
@ -739,7 +740,7 @@ class ReviewTests(TestCase):
# - the event logging when the change when it was entered, i.e. very close to now. # - the event logging when the change when it was entered, i.e. very close to now.
# - the completion of the review, set to the provided date/time # - the completion of the review, set to the provided date/time
events = ReviewAssignmentDocEvent.objects.filter(doc=assignment.review_request.doc).order_by('-time') events = ReviewAssignmentDocEvent.objects.filter(doc=assignment.review_request.doc).order_by('-time')
event0_time_diff = datetime.datetime.now() - events[0].time event0_time_diff = timezone.now() - events[0].time
self.assertLess(event0_time_diff, datetime.timedelta(seconds=10)) self.assertLess(event0_time_diff, datetime.timedelta(seconds=10))
self.assertEqual(events[1].time, datetime.datetime(2012, 12, 24, 12, 13, 14)) self.assertEqual(events[1].time, datetime.datetime(2012, 12, 24, 12, 13, 14))
@ -985,7 +986,7 @@ class ReviewTests(TestCase):
self.assertEqual(assignment.state_id, "completed") self.assertEqual(assignment.state_id, "completed")
# The revision event time should be the date the revision was submitted, i.e. not backdated # The revision event time should be the date the revision was submitted, i.e. not backdated
event1 = assignment.review_request.doc.latest_event(ReviewAssignmentDocEvent) event1 = assignment.review_request.doc.latest_event(ReviewAssignmentDocEvent)
event_time_diff = datetime.datetime.now() - event1.time event_time_diff = timezone.now() - event1.time
self.assertLess(event_time_diff, datetime.timedelta(seconds=10)) self.assertLess(event_time_diff, datetime.timedelta(seconds=10))
self.assertTrue('revised' in event1.desc.lower()) self.assertTrue('revised' in event1.desc.lower())
@ -1012,7 +1013,7 @@ class ReviewTests(TestCase):
assignment = reload_db_objects(assignment) assignment = reload_db_objects(assignment)
self.assertEqual(assignment.review.rev, "01") self.assertEqual(assignment.review.rev, "01")
event2 = assignment.review_request.doc.latest_event(ReviewAssignmentDocEvent) event2 = assignment.review_request.doc.latest_event(ReviewAssignmentDocEvent)
event_time_diff = datetime.datetime.now() - event2.time event_time_diff = timezone.now() - event2.time
self.assertLess(event_time_diff, datetime.timedelta(seconds=10)) self.assertLess(event_time_diff, datetime.timedelta(seconds=10))
# Ensure that a new event was created for the new revision (#2590) # Ensure that a new event was created for the new revision (#2590)
self.assertNotEqual(event1.id, event2.id) self.assertNotEqual(event1.id, event2.id)
@ -1024,7 +1025,7 @@ class ReviewTests(TestCase):
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut")) review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer') rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr') RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20)) review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=timezone.now()+datetime.timedelta(days=20))
ReviewAssignmentFactory(review_request = review_req, reviewer = rev_role.person.email_set.first(), state_id='accepted') ReviewAssignmentFactory(review_request = review_req, reviewer = rev_role.person.email_set.first(), state_id='accepted')
url = urlreverse('ietf.doc.views_review.edit_comment', kwargs={ "name": doc.name, "request_id": review_req.pk }) url = urlreverse('ietf.doc.views_review.edit_comment', kwargs={ "name": doc.name, "request_id": review_req.pk })
@ -1046,7 +1047,7 @@ class ReviewTests(TestCase):
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut")) review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer') rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr') RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20)) review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,deadline=timezone.now()+datetime.timedelta(days=20))
ReviewAssignmentFactory(review_request = review_req, reviewer = rev_role.person.email_set.first(), state_id='accepted') ReviewAssignmentFactory(review_request = review_req, reviewer = rev_role.person.email_set.first(), state_id='accepted')
url = urlreverse('ietf.doc.views_review.edit_deadline', kwargs={ "name": doc.name, "request_id": review_req.pk }) url = urlreverse('ietf.doc.views_review.edit_deadline', kwargs={ "name": doc.name, "request_id": review_req.pk })

View file

@ -18,6 +18,7 @@ from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.forms import ValidationError from django.forms import ValidationError
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone
from django.utils.html import escape from django.utils.html import escape
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
@ -807,7 +808,7 @@ def set_replaces_for_document(request, doc, new_replaces, by, email_subject, com
cc.update(other_addrs.cc) cc.update(other_addrs.cc)
RelatedDocument.objects.filter(source=doc, target=d, relationship=relationship).delete() RelatedDocument.objects.filter(source=doc, target=d, relationship=relationship).delete()
if not RelatedDocument.objects.filter(target=d, relationship=relationship): if not RelatedDocument.objects.filter(target=d, relationship=relationship):
s = 'active' if d.document.expires > datetime.datetime.now() else 'expired' s = 'active' if d.document.expires > timezone.now() else 'expired'
d.document.set_state(State.objects.get(type='draft', slug=s)) d.document.set_state(State.objects.get(type='draft', slug=s))
for d in new_replaces: for d in new_replaces:
@ -1118,7 +1119,7 @@ def build_doc_meta_block(doc, path):
lines[i] = line lines[i] = line
return lines return lines
# #
now = datetime.datetime.now() now = timezone.now()
draft_state = doc.get_state('draft') draft_state = doc.get_state('draft')
block = '' block = ''
meta = {} meta = {}

View file

@ -11,6 +11,7 @@ import shutil
from django.conf import settings from django.conf import settings
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone
from django.utils.encoding import smart_text, force_text from django.utils.encoding import smart_text, force_text
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -73,7 +74,7 @@ def change_group_state_after_charter_approval(group, by):
save_group_in_history(group) save_group_in_history(group)
group.state = new_state group.state = new_state
group.time = datetime.datetime.now() group.time = timezone.now()
group.save() group.save()
# create an event for the group state change, too # create an event for the group state change, too
@ -132,7 +133,7 @@ def historic_milestones_for_charter(charter, rev):
# revision (when approving a charter) # revision (when approving a charter)
just_before_next_rev = e[0].time - datetime.timedelta(seconds=5) just_before_next_rev = e[0].time - datetime.timedelta(seconds=5)
else: else:
just_before_next_rev = datetime.datetime.now() just_before_next_rev = timezone.now()
res = [] res = []
if hasattr(charter, 'chartered_group'): if hasattr(charter, 'chartered_group'):
@ -197,7 +198,7 @@ def derive_new_work_text(review_text,group):
return smart_text(m.as_string()) return smart_text(m.as_string())
def default_review_text(group, charter, by): def default_review_text(group, charter, by):
now = datetime.datetime.now() now = timezone.now()
addrs = gather_address_lists('charter_external_review',group=group).as_strings(compact=False) addrs = gather_address_lists('charter_external_review',group=group).as_strings(compact=False)
e1 = WriteupDocEvent(doc=charter, rev=charter.rev, by=by) e1 = WriteupDocEvent(doc=charter, rev=charter.rev, by=by)

View file

@ -16,6 +16,7 @@ from django.utils.safestring import mark_safe
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.utils import timezone
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.html import escape from django.utils.html import escape
@ -77,7 +78,7 @@ def change_state(request, name, option=None):
chartering_type = get_chartering_type(charter) chartering_type = get_chartering_type(charter)
initial_review = charter.latest_event(InitialReviewDocEvent, type="initial_review") initial_review = charter.latest_event(InitialReviewDocEvent, type="initial_review")
if charter.get_state_slug() != "infrev" or (initial_review and initial_review.expires < datetime.datetime.now()) or chartering_type == "rechartering": if charter.get_state_slug() != "infrev" or (initial_review and initial_review.expires < timezone.now()) or chartering_type == "rechartering":
initial_review = None initial_review = None
by = request.user.person by = request.user.person
@ -183,7 +184,7 @@ def change_state(request, name, option=None):
if charter_state.slug == "infrev" and clean["initial_time"] and clean["initial_time"] != 0: if charter_state.slug == "infrev" and clean["initial_time"] and clean["initial_time"] != 0:
e = InitialReviewDocEvent(type="initial_review", by=by, doc=charter, rev=charter.rev) e = InitialReviewDocEvent(type="initial_review", by=by, doc=charter, rev=charter.rev)
e.expires = datetime.datetime.now() + datetime.timedelta(weeks=clean["initial_time"]) e.expires = timezone.now() + datetime.timedelta(weeks=clean["initial_time"])
e.desc = "Initial review time expires %s" % e.expires.strftime("%Y-%m-%d") e.desc = "Initial review time expires %s" % e.expires.strftime("%Y-%m-%d")
e.save() e.save()
@ -506,7 +507,7 @@ def review_announcement_text(request, name):
existing_new_work.type = "changed_new_work_text" existing_new_work.type = "changed_new_work_text"
existing_new_work.desc = "%s review text was changed" % group.type.name existing_new_work.desc = "%s review text was changed" % group.type.name
existing_new_work.text = derive_new_work_text(existing.text,group) existing_new_work.text = derive_new_work_text(existing.text,group)
existing_new_work.time = datetime.datetime.now() existing_new_work.time = timezone.now()
form = ReviewAnnouncementTextForm(initial=dict(announcement_text=escape(existing.text),new_work_text=escape(existing_new_work.text))) form = ReviewAnnouncementTextForm(initial=dict(announcement_text=escape(existing.text),new_work_text=escape(existing_new_work.text)))
@ -514,7 +515,7 @@ def review_announcement_text(request, name):
form = ReviewAnnouncementTextForm(request.POST) form = ReviewAnnouncementTextForm(request.POST)
if "save_text" in request.POST and form.is_valid(): if "save_text" in request.POST and form.is_valid():
now = datetime.datetime.now() now = timezone.now()
events = [] events = []
t = form.cleaned_data['announcement_text'] t = form.cleaned_data['announcement_text']

View file

@ -19,6 +19,7 @@ from django.shortcuts import render, get_object_or_404, redirect
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.forms.utils import ErrorList from django.forms.utils import ErrorList
from django.template.defaultfilters import pluralize from django.template.defaultfilters import pluralize
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -857,7 +858,7 @@ def resurrect(request, name):
events.append(e) events.append(e)
doc.set_state(State.objects.get(used=True, type="draft", slug="active")) doc.set_state(State.objects.get(used=True, type="draft", slug="active"))
doc.expires = datetime.datetime.now() + datetime.timedelta(settings.INTERNET_DRAFT_DAYS_TO_EXPIRE) doc.expires = timezone.now() + datetime.timedelta(settings.INTERNET_DRAFT_DAYS_TO_EXPIRE)
doc.save_with_history(events) doc.save_with_history(events)
restore_draft_file(request, doc) restore_draft_file(request, doc)

View file

@ -10,7 +10,9 @@ import datetime
import requests import requests
import email.utils import email.utils
from django.utils import timezone
from django.utils.http import is_safe_url from django.utils.http import is_safe_url
from simple_history.utils import update_change_reason from simple_history.utils import update_change_reason
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -117,7 +119,7 @@ def request_review(request, name):
if not can_request_review_of_doc(request.user, doc): if not can_request_review_of_doc(request.user, doc):
permission_denied(request, "You do not have permission to perform this action") permission_denied(request, "You do not have permission to perform this action")
now = datetime.datetime.now() now = timezone.now()
lc_ends = None lc_ends = None
e = doc.latest_event(LastCallDocEvent, type="sent_last_call") e = doc.latest_event(LastCallDocEvent, type="sent_last_call")
@ -364,7 +366,7 @@ def reject_reviewer_assignment(request, name, assignment_id):
if form.is_valid(): if form.is_valid():
# reject the assignment # reject the assignment
review_assignment.state = ReviewAssignmentStateName.objects.get(slug="rejected") review_assignment.state = ReviewAssignmentStateName.objects.get(slug="rejected")
review_assignment.completed_on = datetime.datetime.now() review_assignment.completed_on = timezone.now()
review_assignment.save() review_assignment.save()
descr = "Assignment of request for {} review by {} to {} was rejected".format( descr = "Assignment of request for {} review by {} to {} was rejected".format(
@ -731,13 +733,13 @@ def complete_review(request, name, assignment_id=None, acronym=None):
review_request=review_request, review_request=review_request,
state_id='assigned', state_id='assigned',
reviewer=form.cleaned_data['reviewer'].role_email('reviewer', group=team), reviewer=form.cleaned_data['reviewer'].role_email('reviewer', group=team),
assigned_on=datetime.datetime.now(), assigned_on=timezone.now(),
review = review, review = review,
) )
review.rev = "00" if not review.rev else "{:02}".format(int(review.rev) + 1) review.rev = "00" if not review.rev else "{:02}".format(int(review.rev) + 1)
review.title = "{} Review of {}-{}".format(assignment.review_request.type.name, assignment.review_request.doc.name, form.cleaned_data["reviewed_rev"]) review.title = "{} Review of {}-{}".format(assignment.review_request.type.name, assignment.review_request.doc.name, form.cleaned_data["reviewed_rev"])
review.time = datetime.datetime.now() review.time = timezone.now()
if review_submission == "link": if review_submission == "link":
review.external_url = form.cleaned_data['review_url'] review.external_url = form.cleaned_data['review_url']
@ -764,7 +766,7 @@ def complete_review(request, name, assignment_id=None, acronym=None):
with io.open(filename, 'w', encoding='utf-8') as destination: with io.open(filename, 'w', encoding='utf-8') as destination:
destination.write(content) destination.write(content)
completion_datetime = datetime.datetime.now() completion_datetime = timezone.now()
if "completion_date" in form.cleaned_data: if "completion_date" in form.cleaned_data:
completion_datetime = datetime.datetime.combine(form.cleaned_data["completion_date"], form.cleaned_data.get("completion_time") or datetime.time.min) completion_datetime = datetime.datetime.combine(form.cleaned_data["completion_date"], form.cleaned_data.get("completion_time") or datetime.time.min)
@ -799,7 +801,7 @@ def complete_review(request, name, assignment_id=None, acronym=None):
close_event.by = request.user.person close_event.by = request.user.person
close_event.desc = desc close_event.desc = desc
close_event.state = assignment.state close_event.state = assignment.state
close_event.time = datetime.datetime.now() close_event.time = timezone.now()
close_event.save() close_event.save()
# If the completion date is different, record when the initial review was made too. # If the completion date is different, record when the initial review was made too.

View file

@ -44,6 +44,7 @@ from django.urls import reverse as urlreverse
from django.db.models import Q from django.db.models import Q
from django.http import Http404, HttpResponseBadRequest, HttpResponse, HttpResponseRedirect, QueryDict from django.http import Http404, HttpResponseBadRequest, HttpResponse, HttpResponseRedirect, QueryDict
from django.shortcuts import render from django.shortcuts import render
from django.utils import timezone
from django.utils.cache import _generate_cache_key # type: ignore from django.utils.cache import _generate_cache_key # type: ignore
@ -419,7 +420,7 @@ def ad_dashboard_sort_key(doc):
ageseconds = 0 ageseconds = 0
changetime= doc.latest_event(type='changed_document') changetime= doc.latest_event(type='changed_document')
if changetime: if changetime:
ad = (datetime.datetime.now()-doc.latest_event(type='changed_document').time) ad = (timezone.now()-doc.latest_event(type='changed_document').time)
ageseconds = (ad.microseconds + (ad.seconds + ad.days * 24 * 3600) * 10**6) / 10**6 ageseconds = (ad.microseconds + (ad.seconds + ad.days * 24 * 3600) * 10**6) / 10**6
return "1%d%s%s%010d" % (state[0].order,seed,doc.type.slug,ageseconds) return "1%d%s%s%010d" % (state[0].order,seed,doc.type.slug,ageseconds)
@ -627,7 +628,7 @@ def recent_drafts(request, days=7):
cache_key = f'recentdraftsview{days}' cache_key = f'recentdraftsview{days}'
cached_val = slowcache.get(cache_key) cached_val = slowcache.get(cache_key)
if not cached_val: if not cached_val:
since = datetime.datetime.now()-datetime.timedelta(days=days) since = timezone.now()-datetime.timedelta(days=days)
state = State.objects.get(type='draft', slug='active') state = State.objects.get(type='draft', slug='active')
events = NewRevisionDocEvent.objects.filter(time__gt=since) events = NewRevisionDocEvent.objects.filter(time__gt=since)
names = [ e.doc.name for e in events ] names = [ e.doc.name for e in events ]

View file

@ -5,6 +5,8 @@ import factory
from typing import List # pyflakes:ignore from typing import List # pyflakes:ignore
from django.utils import timezone
from ietf.group.models import Group, Role, GroupEvent, GroupMilestone, \ from ietf.group.models import Group, Role, GroupEvent, GroupMilestone, \
GroupHistory, RoleHistory GroupHistory, RoleHistory
from ietf.review.factories import ReviewTeamSettingsFactory from ietf.review.factories import ReviewTeamSettingsFactory
@ -66,7 +68,7 @@ class BaseGroupMilestoneFactory(factory.django.DjangoModelFactory):
class DatedGroupMilestoneFactory(BaseGroupMilestoneFactory): class DatedGroupMilestoneFactory(BaseGroupMilestoneFactory):
group = factory.SubFactory(GroupFactory, uses_milestone_dates=True) group = factory.SubFactory(GroupFactory, uses_milestone_dates=True)
due = datetime.datetime.today()+datetime.timedelta(days=180) due = timezone.now()+datetime.timedelta(days=180)
class DatelessGroupMilestoneFactory(BaseGroupMilestoneFactory): class DatelessGroupMilestoneFactory(BaseGroupMilestoneFactory):
group = factory.SubFactory(GroupFactory, uses_milestone_dates=False) group = factory.SubFactory(GroupFactory, uses_milestone_dates=False)

View file

@ -15,6 +15,7 @@ from tempfile import mkstemp
from django.conf import settings from django.conf import settings
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -39,7 +40,7 @@ class Command(BaseCommand):
'have seen activity in the last %s years.' % (DEFAULT_YEARS)) 'have seen activity in the last %s years.' % (DEFAULT_YEARS))
def handle(self, *args, **options): def handle(self, *args, **options):
show_since = datetime.datetime.now() - datetime.timedelta(DEFAULT_YEARS*365) show_since = timezone.now() - datetime.timedelta(DEFAULT_YEARS*365)
date = time.strftime("%Y-%m-%d_%H:%M:%S") date = time.strftime("%Y-%m-%d_%H:%M:%S")
signature = '# Generated by %s at %s\n' % (os.path.abspath(__file__), date) signature = '# Generated by %s at %s\n' % (os.path.abspath(__file__), date)

View file

@ -0,0 +1,29 @@
# Generated by Django 2.2.28 on 2022-07-12 11:24
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('group', '0058_alter_has_default_chat'),
]
operations = [
migrations.AlterField(
model_name='group',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='groupevent',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now, help_text='When the event happened'),
),
migrations.AlterField(
model_name='grouphistory',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

View file

@ -13,6 +13,7 @@ from django.core.validators import RegexValidator
from django.db import models from django.db import models
from django.db.models.deletion import CASCADE, PROTECT from django.db.models.deletion import CASCADE, PROTECT
from django.dispatch import receiver from django.dispatch import receiver
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -27,7 +28,7 @@ from ietf.utils.validators import JSONForeignKeyListValidator
class GroupInfo(models.Model): class GroupInfo(models.Model):
time = models.DateTimeField(default=datetime.datetime.now) time = models.DateTimeField(default=timezone.now)
name = models.CharField(max_length=80) name = models.CharField(max_length=80)
state = ForeignKey(GroupStateName, null=True) state = ForeignKey(GroupStateName, null=True)
type = ForeignKey(GroupTypeName, null=True) type = ForeignKey(GroupTypeName, null=True)
@ -353,7 +354,7 @@ GROUP_EVENT_CHOICES = [
class GroupEvent(models.Model): class GroupEvent(models.Model):
"""An occurrence for a group, used for tracking who, when and what.""" """An occurrence for a group, used for tracking who, when and what."""
group = ForeignKey(Group) group = ForeignKey(Group)
time = models.DateTimeField(default=datetime.datetime.now, help_text="When the event happened") time = models.DateTimeField(default=timezone.now, help_text="When the event happened")
type = models.CharField(max_length=50, choices=GROUP_EVENT_CHOICES) type = models.CharField(max_length=50, choices=GROUP_EVENT_CHOICES)
by = ForeignKey(Person) by = ForeignKey(Person)
desc = models.TextField() desc = models.TextField()

View file

@ -13,6 +13,7 @@ from django.conf import settings
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.db.models import Q from django.db.models import Q
from django.test import Client from django.test import Client
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -115,8 +116,8 @@ class GenerateGroupAliasesTests(TestCase):
super().tearDown() super().tearDown()
def testManagementCommand(self): def testManagementCommand(self):
a_month_ago = datetime.datetime.now() - datetime.timedelta(30) a_month_ago = timezone.now() - datetime.timedelta(30)
a_decade_ago = datetime.datetime.now() - datetime.timedelta(3650) a_decade_ago = timezone.now() - datetime.timedelta(3650)
role1 = RoleFactory(name_id='ad', group__type_id='area', group__acronym='myth', group__state_id='active') role1 = RoleFactory(name_id='ad', group__type_id='area', group__acronym='myth', group__state_id='active')
area = role1.group area = role1.group
ad = role1.person ad = role1.person

View file

@ -1900,7 +1900,7 @@ class StatusUpdateTests(TestCase):
def test_view_status_update_for_meeting(self): def test_view_status_update_for_meeting(self):
chair = RoleFactory(name_id='chair',group__type_id='wg') chair = RoleFactory(name_id='chair',group__type_id='wg')
GroupEventFactory(type='status_update',group=chair.group) GroupEventFactory(type='status_update',group=chair.group)
sess = SessionFactory.create(meeting__type_id='ietf',group=chair.group,meeting__date=datetime.datetime.today()-datetime.timedelta(days=1)) sess = SessionFactory.create(meeting__type_id='ietf',group=chair.group,meeting__date=timezone.now()-datetime.timedelta(days=1))
url = urlreverse('ietf.group.views.group_about_status_meeting',kwargs={'acronym':chair.group.acronym,'num':sess.meeting.number}) url = urlreverse('ietf.group.views.group_about_status_meeting',kwargs={'acronym':chair.group.acronym,'num':sess.meeting.number})
response = self.client.get(url) response = self.client.get(url)
self.assertEqual(response.status_code,200) self.assertEqual(response.status_code,200)

View file

@ -8,6 +8,7 @@ import debug # pyflakes:ignore
from pyquery import PyQuery from pyquery import PyQuery
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
from ietf.review.policies import get_reviewer_queue_policy from ietf.review.policies import get_reviewer_queue_policy
from ietf.utils.test_utils import login_testing_unauthorized, TestCase, reload_db_objects from ietf.utils.test_utils import login_testing_unauthorized, TestCase, reload_db_objects
@ -131,7 +132,7 @@ class ReviewTests(TestCase):
doc.states.add(State.objects.get(type="draft-iesg", slug="lc", used=True)) doc.states.add(State.objects.get(type="draft-iesg", slug="lc", used=True))
LastCallDocEvent.objects.create( LastCallDocEvent.objects.create(
doc=doc, doc=doc,
expires=datetime.datetime.now() + datetime.timedelta(days=365), expires=timezone.now() + datetime.timedelta(days=365),
by=Person.objects.get(name="(System)"), by=Person.objects.get(name="(System)"),
rev=doc.rev rev=doc.rev
) )
@ -429,7 +430,7 @@ class ReviewTests(TestCase):
doc.states.add(State.objects.get(type="draft-iesg", slug="lc", used=True)) doc.states.add(State.objects.get(type="draft-iesg", slug="lc", used=True))
LastCallDocEvent.objects.create( LastCallDocEvent.objects.create(
doc=doc, doc=doc,
expires=datetime.datetime.now() + datetime.timedelta(days=365), expires=timezone.now() + datetime.timedelta(days=365),
by=Person.objects.get(name="(System)"), by=Person.objects.get(name="(System)"),
rev=doc.rev rev=doc.rev
) )

View file

@ -53,6 +53,7 @@ from django.http import HttpResponse, HttpResponseRedirect, Http404, JsonRespons
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
from django.utils.html import escape from django.utils.html import escape
from django.views.decorators.cache import cache_page, cache_control from django.views.decorators.cache import cache_page, cache_control
@ -566,7 +567,7 @@ def all_status(request):
if e: if e:
wg_reports.append(e) wg_reports.append(e)
wg_reports.sort(key=lambda x: (x.group.parent.acronym,datetime.datetime.now()-x.time)) wg_reports.sort(key=lambda x: (x.group.parent.acronym,timezone.now()-x.time))
rg_reports = [] rg_reports = []
for rg in rgs: for rg in rgs:
@ -808,7 +809,7 @@ def email_aliases(request, acronym=None, group_type=None):
def meetings(request, acronym=None, group_type=None): def meetings(request, acronym=None, group_type=None):
group = get_group_or_404(acronym,group_type) if acronym else None group = get_group_or_404(acronym,group_type) if acronym else None
four_years_ago = datetime.datetime.now()-datetime.timedelta(days=4*365) four_years_ago = timezone.now()-datetime.timedelta(days=4*365)
sessions = add_event_info_to_session_qs( sessions = add_event_info_to_session_qs(
group.session_set.filter( group.session_set.filter(
@ -972,7 +973,7 @@ def edit(request, group_type=None, acronym=None, action="edit", field=None):
try: try:
group = Group.objects.get(acronym=clean["acronym"]) group = Group.objects.get(acronym=clean["acronym"])
save_group_in_history(group) save_group_in_history(group)
group.time = datetime.datetime.now() group.time = timezone.now()
group.save() group.save()
except Group.DoesNotExist: except Group.DoesNotExist:
group = Group.objects.create(name=clean["name"], group = Group.objects.create(name=clean["name"],
@ -1071,7 +1072,7 @@ def edit(request, group_type=None, acronym=None, action="edit", field=None):
) )
)) ))
group.time = datetime.datetime.now() group.time = timezone.now()
if changes and not new_group: if changes and not new_group:
for attr, new, desc in changes: for attr, new, desc in changes:
@ -1509,7 +1510,7 @@ def reviewer_overview(request, acronym, group_type=None):
int(math.ceil(d.assignment_to_closure_days)) if d.assignment_to_closure_days is not None else None)) int(math.ceil(d.assignment_to_closure_days)) if d.assignment_to_closure_days is not None else None))
if d.state in ["completed", "completed_in_time", "completed_late"]: if d.state in ["completed", "completed_in_time", "completed_late"]:
if d.assigned_time is not None: if d.assigned_time is not None:
delta = datetime.datetime.now() - d.assigned_time delta = timezone.now() - d.assigned_time
if d.assignment_to_closure_days is not None: if d.assignment_to_closure_days is not None:
days = int(delta.days - d.assignment_to_closure_days) days = int(delta.days - d.assignment_to_closure_days)
if days_since > days: days_since = days if days_since > days: days_since = days

View file

@ -11,6 +11,7 @@ import pytz
from django.conf import settings from django.conf import settings
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -296,6 +297,6 @@ def id_index_txt(with_abstracts=False):
return render_to_string("idindex/id_index.txt", { return render_to_string("idindex/id_index.txt", {
'groups': groups, 'groups': groups,
'time': datetime.datetime.now(pytz.UTC).strftime("%Y-%m-%d %H:%M:%S %Z"), 'time': timezone.now().astimezone(pytz.utc).strftime("%Y-%m-%d %H:%M:%S %Z"),
'with_abstracts': with_abstracts, 'with_abstracts': with_abstracts,
}) })

View file

@ -7,6 +7,7 @@ import datetime
from pathlib import Path from pathlib import Path
from django.conf import settings from django.conf import settings
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -120,7 +121,7 @@ class IndexTests(TestCase):
draft.set_state(State.objects.get(type="draft", slug="active")) draft.set_state(State.objects.get(type="draft", slug="active"))
draft.set_state(State.objects.get(type="draft-iesg", slug="lc")) draft.set_state(State.objects.get(type="draft-iesg", slug="lc"))
e = LastCallDocEvent.objects.create(doc=draft, rev=draft.rev, type="sent_last_call", expires=datetime.datetime.now() + datetime.timedelta(days=14), by=draft.ad) e = LastCallDocEvent.objects.create(doc=draft, rev=draft.rev, type="sent_last_call", expires=timezone.now() + datetime.timedelta(days=14), by=draft.ad)
t = get_fields(all_id2_txt()) t = get_fields(all_id2_txt())
self.assertEqual(t[11], e.expires.strftime("%Y-%m-%d")) self.assertEqual(t[11], e.expires.strftime("%Y-%m-%d"))

View file

@ -8,6 +8,7 @@ from textwrap import dedent
from django.conf import settings from django.conf import settings
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -37,7 +38,7 @@ class Command(BaseCommand):
keys = PersonalApiKey.objects.filter(valid=True) keys = PersonalApiKey.objects.filter(valid=True)
for key in keys: for key in keys:
earliest = datetime.datetime.now() - datetime.timedelta(days=days) earliest = timezone.now() - datetime.timedelta(days=days)
events = PersonApiKeyEvent.objects.filter(key=key, time__gt=earliest) events = PersonApiKeyEvent.objects.filter(key=key, time__gt=earliest)
count = events.count() count = events.count()
events = events[:32] events = events[:32]

View file

@ -28,6 +28,7 @@ from django.urls import reverse as urlreverse
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.conf import settings from django.conf import settings
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -750,11 +751,11 @@ class IetfAuthTests(TestCase):
self.assertContains(r, 'Invalid apikey', status_code=403) self.assertContains(r, 'Invalid apikey', status_code=403)
# too long since regular login # too long since regular login
person.user.last_login = datetime.datetime.now() - datetime.timedelta(days=settings.UTILS_APIKEY_GUI_LOGIN_LIMIT_DAYS+1) person.user.last_login = timezone.now() - datetime.timedelta(days=settings.UTILS_APIKEY_GUI_LOGIN_LIMIT_DAYS+1)
person.user.save() person.user.save()
r = self.client.post(key.endpoint, {'apikey':key.hash(), 'dummy':'dummy',}) r = self.client.post(key.endpoint, {'apikey':key.hash(), 'dummy':'dummy',})
self.assertContains(r, 'Too long since last regular login', status_code=400) self.assertContains(r, 'Too long since last regular login', status_code=400)
person.user.last_login = datetime.datetime.now() person.user.last_login = timezone.now()
person.user.save() person.user.save()
# endpoint mismatch # endpoint mismatch
@ -783,7 +784,7 @@ class IetfAuthTests(TestCase):
# apikey usage will be registered) # apikey usage will be registered)
count = 2 count = 2
# avoid usage across dates # avoid usage across dates
if datetime.datetime.now().time() > datetime.time(hour=23, minute=59, second=58): if timezone.now().time() > datetime.time(hour=23, minute=59, second=58):
time.sleep(2) time.sleep(2)
for i in range(count): for i in range(count):
for key in person.apikeys.all(): for key in person.apikeys.all():

View file

@ -5,6 +5,7 @@
import datetime import datetime
import factory import factory
from django.utils import timezone
from ietf.ipr.models import ( from ietf.ipr.models import (
IprDisclosureBase, HolderIprDisclosure, ThirdPartyIprDisclosure, NonDocSpecificIprDisclosure, IprDisclosureBase, HolderIprDisclosure, ThirdPartyIprDisclosure, NonDocSpecificIprDisclosure,
@ -13,7 +14,7 @@ from ietf.ipr.models import (
def _fake_patent_info(): def _fake_patent_info():
return "Date: %s\nNotes: %s\nTitle: %s\nNumber: %s\nInventor: %s\n" % ( return "Date: %s\nNotes: %s\nTitle: %s\nNumber: %s\nInventor: %s\n" % (
(datetime.datetime.today()-datetime.timedelta(days=365)).strftime("%Y-%m-%d"), (timezone.now()-datetime.timedelta(days=365)).strftime("%Y-%m-%d"),
factory.Faker('paragraph'), factory.Faker('paragraph'),
factory.Faker('sentence', nb_words=8), factory.Faker('sentence', nb_words=8),
'US9999999', 'US9999999',

View file

@ -2,11 +2,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import datetime
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.urls import reverse from django.urls import reverse
from django.utils import timezone
from ietf.doc.models import DocAlias, DocEvent from ietf.doc.models import DocAlias, DocEvent
from ietf.name.models import DocRelationshipName,IprDisclosureStateName,IprLicenseTypeName,IprEventTypeName from ietf.name.models import DocRelationshipName,IprDisclosureStateName,IprLicenseTypeName,IprEventTypeName
@ -220,7 +219,7 @@ class IprEvent(models.Model):
"""Returns true if it's beyond the response_due date and no response has been """Returns true if it's beyond the response_due date and no response has been
received""" received"""
qs = IprEvent.objects.filter(disclosure=self.disclosure,in_reply_to=self.message) qs = IprEvent.objects.filter(disclosure=self.disclosure,in_reply_to=self.message)
if not qs and datetime.datetime.now().date() > self.response_due.date(): if not qs and timezone.now().date() > self.response_due.date():
return True return True
else: else:
return False return False

View file

@ -9,6 +9,7 @@ from pyquery import PyQuery
from urllib.parse import quote, urlparse from urllib.parse import quote, urlparse
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -636,7 +637,7 @@ I would like to revoke this declaration.
message_string.format( message_string.format(
to=addrs.to, to=addrs.to,
cc=addrs.cc, cc=addrs.cc,
date=datetime.datetime.now().ctime() date=timezone.now().ctime()
) )
) )
self.assertIsNone(result) self.assertIsNone(result)
@ -646,7 +647,7 @@ I would like to revoke this declaration.
From: joe@test.com From: joe@test.com
Date: {} Date: {}
Subject: test Subject: test
""".format(reply_to, datetime.datetime.now().ctime()) """.format(reply_to, timezone.now().ctime())
result = process_response_email(message_string) result = process_response_email(message_string)
self.assertIsInstance(result, Message) self.assertIsInstance(result, Message)
@ -660,7 +661,7 @@ Subject: test
From: joe@test.com From: joe@test.com
Date: {} Date: {}
Subject: test Subject: test
""".format(reply_to, datetime.datetime.now().ctime()) """.format(reply_to, timezone.now().ctime())
message_bytes = message_string.encode('utf8') + b'\nInvalid stuff: \xfe\xff\n' message_bytes = message_string.encode('utf8') + b'\nInvalid stuff: \xfe\xff\n'
result = process_response_email(message_bytes) result = process_response_email(message_bytes)
self.assertIsInstance(result, Message) self.assertIsInstance(result, Message)
@ -676,7 +677,7 @@ Subject: test
message_bytes = message_string.format( message_bytes = message_string.format(
to=addrs.to, to=addrs.to,
cc=addrs.cc, cc=addrs.cc,
date=datetime.datetime.now().ctime(), date=timezone.now().ctime(),
).encode('utf8') + b'\nInvalid stuff: \xfe\xff\n' ).encode('utf8') + b'\nInvalid stuff: \xfe\xff\n'
result = process_response_email(message_bytes) result = process_response_email(message_bytes)
self.assertIsNone(result) self.assertIsNone(result)

View file

@ -14,6 +14,7 @@ from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
from django.utils.html import escape from django.utils.html import escape
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -587,7 +588,7 @@ def notify(request, id, type):
type_id = form.cleaned_data['type'], type_id = form.cleaned_data['type'],
by = request.user.person, by = request.user.person,
disclosure = ipr, disclosure = ipr,
response_due = datetime.datetime.now().date() + datetime.timedelta(days=30), response_due = timezone.now().date() + datetime.timedelta(days=30),
message = message, message = message,
) )
messages.success(request,'Notifications sent') messages.success(request,'Notifications sent')

View file

@ -14,6 +14,8 @@ from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.db.models import Q from django.db.models import Q
from django.utils import timezone
from io import StringIO from io import StringIO
from pyquery import PyQuery from pyquery import PyQuery
@ -50,7 +52,7 @@ def get_liaison_post_data(type='incoming'):
to_contacts='to_contacts@example.com', to_contacts='to_contacts@example.com',
purpose="info", purpose="info",
title="title", title="title",
submitted_date=datetime.datetime.today().strftime("%Y-%m-%d"), submitted_date=timezone.now().strftime("%Y-%m-%d"),
body="body", body="body",
send="1" ) send="1" )
@ -385,7 +387,7 @@ class LiaisonManagementTests(TestCase):
def test_edit_liaison(self): def test_edit_liaison(self):
liaison = LiaisonStatementFactory(deadline=datetime.date.today()+datetime.timedelta(days=1)) liaison = LiaisonStatementFactory(deadline=datetime.date.today()+datetime.timedelta(days=1))
LiaisonStatementEventFactory(statement=liaison,type_id='submitted', time=datetime.datetime.now()-datetime.timedelta(days=1)) LiaisonStatementEventFactory(statement=liaison,type_id='submitted', time=timezone.now()-datetime.timedelta(days=1))
LiaisonStatementEventFactory(statement=liaison,type_id='posted') LiaisonStatementEventFactory(statement=liaison,type_id='posted')
from_group = liaison.from_groups.first() from_group = liaison.from_groups.first()
to_group = liaison.to_groups.first() to_group = liaison.to_groups.first()

View file

@ -17,6 +17,7 @@ from django.contrib.auth.models import AnonymousUser
from django.urls import reverse from django.urls import reverse
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -42,7 +43,7 @@ def get_meeting(num=None,type_in=['ietf',],days=28):
if type_in: if type_in:
meetings = meetings.filter(type__in=type_in) meetings = meetings.filter(type__in=type_in)
if num == None: if num == None:
meetings = meetings.filter(date__gte=datetime.datetime.today()-datetime.timedelta(days=days)).order_by('date') meetings = meetings.filter(date__gte=timezone.now()-datetime.timedelta(days=days)).order_by('date')
else: else:
meetings = meetings.filter(number=num) meetings = meetings.filter(number=num)
if meetings.exists(): if meetings.exists():
@ -51,7 +52,7 @@ def get_meeting(num=None,type_in=['ietf',],days=28):
raise Http404("No such meeting found: %s" % num) raise Http404("No such meeting found: %s" % num)
def get_current_ietf_meeting(): def get_current_ietf_meeting():
meetings = Meeting.objects.filter(type='ietf',date__gte=datetime.datetime.today()-datetime.timedelta(days=31)).order_by('date') meetings = Meeting.objects.filter(type='ietf',date__gte=timezone.now()-datetime.timedelta(days=31)).order_by('date')
return meetings.first() return meetings.first()
def get_current_ietf_meeting_num(): def get_current_ietf_meeting_num():

View file

@ -0,0 +1,19 @@
# Generated by Django 2.2.28 on 2022-07-12 11:24
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('meeting', '0055_pytz_2022_2_1'),
]
operations = [
migrations.AlterField(
model_name='schedulingevent',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now, help_text='When the event happened'),
),
]

View file

@ -24,6 +24,7 @@ from django.db.models import Max, Subquery, OuterRef, TextField, Value, Q
from django.db.models.functions import Coalesce from django.db.models.functions import Coalesce
from django.conf import settings from django.conf import settings
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
@ -176,7 +177,7 @@ class Meeting(models.Model):
@classmethod @classmethod
def get_current_meeting(cls, type="ietf"): def get_current_meeting(cls, type="ietf"):
return cls.objects.filter(type=type, date__gte=datetime.datetime.today()-datetime.timedelta(days=7) ).order_by('date').first() return cls.objects.filter(type=type, date__gte=timezone.now()-datetime.timedelta(days=7) ).order_by('date').first()
def get_first_cut_off(self): def get_first_cut_off(self):
return self.get_00_cutoff() return self.get_00_cutoff()
@ -1280,7 +1281,7 @@ class Session(models.Model):
class SchedulingEvent(models.Model): class SchedulingEvent(models.Model):
session = ForeignKey(Session) session = ForeignKey(Session)
time = models.DateTimeField(default=datetime.datetime.now, help_text="When the event happened") time = models.DateTimeField(default=timezone.now, help_text="When the event happened")
status = ForeignKey(SessionStatusName) status = ForeignKey(SessionStatusName)
by = ForeignKey(Person) by = ForeignKey(Person)

View file

@ -11,8 +11,8 @@ from unittest import skipIf
import urllib.parse import urllib.parse
import django import django
from django.utils import timezone
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.timezone import now
from django.db.models import F from django.db.models import F
import pytz import pytz
@ -307,7 +307,7 @@ class EditMeetingScheduleTests(IetfSeleniumTestCase):
room = RoomFactory(meeting=meeting) room = RoomFactory(meeting=meeting)
# get current time in meeting time zone # get current time in meeting time zone
right_now = now().astimezone( right_now = timezone.now().astimezone(
pytz.timezone(meeting.time_zone) pytz.timezone(meeting.time_zone)
) )
if not settings.USE_TZ: if not settings.USE_TZ:
@ -394,11 +394,11 @@ class EditMeetingScheduleTests(IetfSeleniumTestCase):
def test_past_swap_days_buttons(self): def test_past_swap_days_buttons(self):
"""Swap days buttons should be hidden for past items""" """Swap days buttons should be hidden for past items"""
wait = WebDriverWait(self.driver, 2) wait = WebDriverWait(self.driver, 2)
meeting = MeetingFactory(type_id='ietf', date=datetime.datetime.today() - datetime.timedelta(days=3), days=7) meeting = MeetingFactory(type_id='ietf', date=timezone.now() - datetime.timedelta(days=3), days=7)
room = RoomFactory(meeting=meeting) room = RoomFactory(meeting=meeting)
# get current time in meeting time zone # get current time in meeting time zone
right_now = now().astimezone( right_now = timezone.now().astimezone(
pytz.timezone(meeting.time_zone) pytz.timezone(meeting.time_zone)
) )
if not settings.USE_TZ: if not settings.USE_TZ:
@ -518,11 +518,11 @@ class EditMeetingScheduleTests(IetfSeleniumTestCase):
def test_past_swap_timeslot_col_buttons(self): def test_past_swap_timeslot_col_buttons(self):
"""Swap timeslot column buttons should be hidden for past items""" """Swap timeslot column buttons should be hidden for past items"""
wait = WebDriverWait(self.driver, 2) wait = WebDriverWait(self.driver, 2)
meeting = MeetingFactory(type_id='ietf', date=datetime.datetime.today() - datetime.timedelta(days=3), days=7) meeting = MeetingFactory(type_id='ietf', date=timezone.now() - datetime.timedelta(days=3), days=7)
room = RoomFactory(meeting=meeting) room = RoomFactory(meeting=meeting)
# get current time in meeting time zone # get current time in meeting time zone
right_now = now().astimezone( right_now = timezone.now().astimezone(
pytz.timezone(meeting.time_zone) pytz.timezone(meeting.time_zone)
) )
if not settings.USE_TZ: if not settings.USE_TZ:
@ -2048,7 +2048,7 @@ class InterimTests(IetfSeleniumTestCase):
Session.objects.filter( Session.objects.filter(
meeting__type_id='interim', meeting__type_id='interim',
timeslotassignments__schedule=F('meeting__schedule'), timeslotassignments__schedule=F('meeting__schedule'),
timeslotassignments__timeslot__time__gte=datetime.datetime.today() timeslotassignments__timeslot__time__gte=timezone.now()
) )
).filter(current_status__in=('sched','canceled')) ).filter(current_status__in=('sched','canceled'))
meetings = [] meetings = []
@ -2061,7 +2061,7 @@ class InterimTests(IetfSeleniumTestCase):
def all_ietf_meetings(self): def all_ietf_meetings(self):
meetings = Meeting.objects.filter( meetings = Meeting.objects.filter(
type_id='ietf', type_id='ietf',
date__gte=datetime.datetime.today()-datetime.timedelta(days=7) date__gte=timezone.now()-datetime.timedelta(days=7)
) )
for m in meetings: for m in meetings:
m.calendar_label = 'IETF %s' % m.number m.calendar_label = 'IETF %s' % m.number
@ -2609,7 +2609,7 @@ class EditTimeslotsTests(IetfSeleniumTestCase):
self.meeting: Meeting = MeetingFactory( self.meeting: Meeting = MeetingFactory(
type_id='ietf', type_id='ietf',
number=120, number=120,
date=datetime.datetime.today() + datetime.timedelta(days=10), date=timezone.now() + datetime.timedelta(days=10),
populate_schedule=False, populate_schedule=False,
) )
self.edit_timeslot_url = self.absreverse( self.edit_timeslot_url = self.absreverse(

View file

@ -29,8 +29,8 @@ from django.test import Client, override_settings
from django.db.models import F, Max from django.db.models import F, Max
from django.http import QueryDict, FileResponse from django.http import QueryDict, FileResponse
from django.template import Context, Template from django.template import Context, Template
from django.utils import timezone
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.timezone import now
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -604,7 +604,7 @@ class MeetingTests(BaseMeetingTestCase):
def test_interim_materials(self): def test_interim_materials(self):
make_meeting_test_data() make_meeting_test_data()
group = Group.objects.get(acronym='mars') group = Group.objects.get(acronym='mars')
date = datetime.datetime.today() - datetime.timedelta(days=10) date = timezone.now() - datetime.timedelta(days=10)
meeting = make_interim_meeting(group=group, date=date, status='sched') meeting = make_interim_meeting(group=group, date=date, status='sched')
session = meeting.session_set.first() session = meeting.session_set.first()
@ -1529,7 +1529,7 @@ class EditMeetingScheduleTests(TestCase):
@staticmethod @staticmethod
def _right_now_in(tzname): def _right_now_in(tzname):
right_now = now().astimezone(pytz.timezone(tzname)) right_now = timezone.now().astimezone(pytz.timezone(tzname))
if not settings.USE_TZ: if not settings.USE_TZ:
right_now = right_now.replace(tzinfo=None) right_now = right_now.replace(tzinfo=None)
return right_now return right_now
@ -1538,7 +1538,7 @@ class EditMeetingScheduleTests(TestCase):
"""Allow assignment to future timeslots only for official schedule""" """Allow assignment to future timeslots only for official schedule"""
meeting = MeetingFactory( meeting = MeetingFactory(
type_id='ietf', type_id='ietf',
date=(datetime.datetime.today() - datetime.timedelta(days=1)).date(), date=(timezone.now() - datetime.timedelta(days=1)).date(),
days=3, days=3,
) )
right_now = self._right_now_in(meeting.time_zone) right_now = self._right_now_in(meeting.time_zone)
@ -1598,7 +1598,7 @@ class EditMeetingScheduleTests(TestCase):
"""Do not allow assignment of past sessions for official schedule""" """Do not allow assignment of past sessions for official schedule"""
meeting = MeetingFactory( meeting = MeetingFactory(
type_id='ietf', type_id='ietf',
date=(datetime.datetime.today() - datetime.timedelta(days=1)).date(), date=(timezone.now() - datetime.timedelta(days=1)).date(),
days=3, days=3,
) )
right_now = self._right_now_in(meeting.time_zone) right_now = self._right_now_in(meeting.time_zone)
@ -1733,7 +1733,7 @@ class EditMeetingScheduleTests(TestCase):
"""Allow unassignment only of future timeslots for official schedule""" """Allow unassignment only of future timeslots for official schedule"""
meeting = MeetingFactory( meeting = MeetingFactory(
type_id='ietf', type_id='ietf',
date=(datetime.datetime.today() - datetime.timedelta(days=1)).date(), date=(timezone.now() - datetime.timedelta(days=1)).date(),
days=3, days=3,
) )
right_now = self._right_now_in(meeting.time_zone) right_now = self._right_now_in(meeting.time_zone)
@ -1857,7 +1857,7 @@ class EditTimeslotsTests(TestCase):
return MeetingFactory( return MeetingFactory(
type_id='ietf', type_id='ietf',
number=number, number=number,
date=datetime.datetime.today() + datetime.timedelta(days=10), date=timezone.now() + datetime.timedelta(days=10),
populate_schedule=False, populate_schedule=False,
) )
@ -4680,7 +4680,7 @@ class InterimTests(TestCase):
make_meeting_test_data() make_meeting_test_data()
group = Group.objects.get(acronym='mars') group = Group.objects.get(acronym='mars')
date = datetime.date.today() + datetime.timedelta(days=30) date = datetime.date.today() + datetime.timedelta(days=30)
time = datetime.datetime.now().time().replace(microsecond=0,second=0) time = timezone.now().time().replace(microsecond=0,second=0)
dt = datetime.datetime.combine(date, time) dt = datetime.datetime.combine(date, time)
duration = datetime.timedelta(hours=3) duration = datetime.timedelta(hours=3)
remote_instructions = 'Use webex' remote_instructions = 'Use webex'
@ -4751,7 +4751,7 @@ class InterimTests(TestCase):
make_meeting_test_data() make_meeting_test_data()
group = Group.objects.get(acronym='mars') group = Group.objects.get(acronym='mars')
date = datetime.date.today() + datetime.timedelta(days=30) date = datetime.date.today() + datetime.timedelta(days=30)
time = datetime.datetime.now().time().replace(microsecond=0,second=0) time = timezone.now().time().replace(microsecond=0,second=0)
dt = datetime.datetime.combine(date, time) dt = datetime.datetime.combine(date, time)
duration = datetime.timedelta(hours=3) duration = datetime.timedelta(hours=3)
city = 'San Francisco' city = 'San Francisco'
@ -4799,7 +4799,7 @@ class InterimTests(TestCase):
make_meeting_test_data() make_meeting_test_data()
date = datetime.date.today() + datetime.timedelta(days=30) date = datetime.date.today() + datetime.timedelta(days=30)
date2 = date + datetime.timedelta(days=1) date2 = date + datetime.timedelta(days=1)
time = datetime.datetime.now().time().replace(microsecond=0,second=0) time = timezone.now().time().replace(microsecond=0,second=0)
dt = datetime.datetime.combine(date, time) dt = datetime.datetime.combine(date, time)
dt2 = datetime.datetime.combine(date2, time) dt2 = datetime.datetime.combine(date2, time)
duration = datetime.timedelta(hours=3) duration = datetime.timedelta(hours=3)
@ -4865,7 +4865,7 @@ class InterimTests(TestCase):
make_meeting_test_data() make_meeting_test_data()
date = datetime.date.today() + datetime.timedelta(days=30) date = datetime.date.today() + datetime.timedelta(days=30)
date2 = date + datetime.timedelta(days=2) date2 = date + datetime.timedelta(days=2)
time = datetime.datetime.now().time().replace(microsecond=0,second=0) time = timezone.now().time().replace(microsecond=0,second=0)
group = Group.objects.get(acronym='mars') group = Group.objects.get(acronym='mars')
city = 'San Francisco' city = 'San Francisco'
country = 'US' country = 'US'
@ -4933,7 +4933,7 @@ class InterimTests(TestCase):
if date.year != date2.year: if date.year != date2.year:
date += datetime.timedelta(days=1) date += datetime.timedelta(days=1)
date2 += datetime.timedelta(days=1) date2 += datetime.timedelta(days=1)
time = datetime.datetime.now().time().replace(microsecond=0,second=0) time = timezone.now().time().replace(microsecond=0,second=0)
dt = datetime.datetime.combine(date, time) dt = datetime.datetime.combine(date, time)
dt2 = datetime.datetime.combine(date2, time) dt2 = datetime.datetime.combine(date2, time)
duration = datetime.timedelta(hours=3) duration = datetime.timedelta(hours=3)
@ -5615,7 +5615,7 @@ class InterimTests(TestCase):
def test_send_interim_minutes_reminder(self): def test_send_interim_minutes_reminder(self):
make_meeting_test_data() make_meeting_test_data()
group = Group.objects.get(acronym='mars') group = Group.objects.get(acronym='mars')
date = datetime.datetime.today() - datetime.timedelta(days=10) date = timezone.now() - datetime.timedelta(days=10)
meeting = make_interim_meeting(group=group, date=date, status='sched') meeting = make_interim_meeting(group=group, date=date, status='sched')
length_before = len(outbox) length_before = len(outbox)
send_interim_minutes_reminder(meeting=meeting) send_interim_minutes_reminder(meeting=meeting)
@ -6563,7 +6563,7 @@ class HasMeetingsTests(TestCase):
q = PyQuery(r.content) q = PyQuery(r.content)
self.assertTrue(q('#id_group option[value="%d"]'%group.pk)) self.assertTrue(q('#id_group option[value="%d"]'%group.pk))
date = datetime.date.today() + datetime.timedelta(days=30+meeting_count) date = datetime.date.today() + datetime.timedelta(days=30+meeting_count)
time = datetime.datetime.now().time().replace(microsecond=0,second=0) time = timezone.now().time().replace(microsecond=0,second=0)
remote_instructions = 'Use webex' remote_instructions = 'Use webex'
agenda = 'Intro. Slides. Discuss.' agenda = 'Intro. Slides. Discuss.'
agenda_note = 'On second level' agenda_note = 'On second level'
@ -6659,7 +6659,7 @@ class HasMeetingsTests(TestCase):
session = SessionFactory( session = SessionFactory(
group__type_id = gf.type_id, group__type_id = gf.type_id,
meeting__type_id='interim', meeting__type_id='interim',
meeting__date = datetime.datetime.today()+datetime.timedelta(days=30), meeting__date = timezone.now()+datetime.timedelta(days=30),
status_id='sched', status_id='sched',
) )
sessions.append(session) sessions.append(session)
@ -6675,7 +6675,7 @@ class HasMeetingsTests(TestCase):
sessions=[] sessions=[]
for gf in GroupFeatures.objects.filter(has_meetings=True): for gf in GroupFeatures.objects.filter(has_meetings=True):
group = GroupFactory(type_id=gf.type_id) group = GroupFactory(type_id=gf.type_id)
meeting_date = datetime.datetime.today() + datetime.timedelta(days=30) meeting_date = timezone.now() + datetime.timedelta(days=30)
session = SessionFactory( session = SessionFactory(
group=group, group=group,
meeting__type_id='interim', meeting__type_id='interim',
@ -6696,7 +6696,7 @@ class HasMeetingsTests(TestCase):
sessions=[] sessions=[]
for gf in GroupFeatures.objects.filter(has_meetings=True): for gf in GroupFeatures.objects.filter(has_meetings=True):
group = GroupFactory(type_id=gf.type_id) group = GroupFactory(type_id=gf.type_id)
meeting_date = datetime.datetime.today() + datetime.timedelta(days=30) meeting_date = timezone.now() + datetime.timedelta(days=30)
session = SessionFactory( session = SessionFactory(
group=group, group=group,
meeting__type_id='interim', meeting__type_id='interim',

View file

@ -12,6 +12,7 @@ from urllib.error import HTTPError
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone
from django.utils.encoding import smart_text from django.utils.encoding import smart_text
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -511,7 +512,7 @@ def swap_meeting_schedule_timeslot_assignments(schedule, source_timeslots, targe
if max_overlap > datetime.timedelta(minutes=5): if max_overlap > datetime.timedelta(minutes=5):
for a in lts_assignments: for a in lts_assignments:
a.timeslot = most_overlapping_rts a.timeslot = most_overlapping_rts
a.modified = datetime.datetime.now() a.modified = timezone.now()
a.save() a.save()
swapped = True swapped = True

View file

@ -36,10 +36,10 @@ from django.db.models import F, Max, Q
from django.forms.models import modelform_factory, inlineformset_factory from django.forms.models import modelform_factory, inlineformset_factory
from django.template import TemplateDoesNotExist from django.template import TemplateDoesNotExist
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone
from django.utils.encoding import force_str from django.utils.encoding import force_str
from django.utils.functional import curry from django.utils.functional import curry
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.timezone import now
from django.views.decorators.cache import cache_page from django.views.decorators.cache import cache_page
from django.views.decorators.csrf import ensure_csrf_cookie, csrf_exempt from django.views.decorators.csrf import ensure_csrf_cookie, csrf_exempt
from django.views.generic import RedirectView from django.views.generic import RedirectView
@ -128,7 +128,7 @@ def materials(request, num=None):
cut_off_date = meeting.get_submission_cut_off_date() cut_off_date = meeting.get_submission_cut_off_date()
cor_cut_off_date = meeting.get_submission_correction_date() cor_cut_off_date = meeting.get_submission_correction_date()
now = datetime.date.today() now = datetime.date.today()
old = datetime.datetime.now() - datetime.timedelta(days=1) old = timezone.now() - datetime.timedelta(days=1)
if settings.SERVER_MODE != 'production' and '_testoverride' in request.GET: if settings.SERVER_MODE != 'production' and '_testoverride' in request.GET:
pass pass
elif now > cor_cut_off_date: elif now > cor_cut_off_date:
@ -442,7 +442,7 @@ def edit_meeting_schedule(request, num=None, owner=None, name=None):
lock_time = settings.MEETING_SESSION_LOCK_TIME lock_time = settings.MEETING_SESSION_LOCK_TIME
def timeslot_locked(ts): def timeslot_locked(ts):
meeting_now = now().astimezone(pytz.timezone(meeting.time_zone)) meeting_now = timezone.now().astimezone(pytz.timezone(meeting.time_zone))
if not settings.USE_TZ: if not settings.USE_TZ:
meeting_now = meeting_now.replace(tzinfo=None) meeting_now = meeting_now.replace(tzinfo=None)
return schedule.is_official and (ts.time - meeting_now < lock_time) return schedule.is_official and (ts.time - meeting_now < lock_time)
@ -785,7 +785,7 @@ def edit_meeting_schedule(request, num=None, owner=None, name=None):
timeslot=old_timeslot, timeslot=old_timeslot,
) )
existing_assignments.update(timeslot=timeslot, modified=datetime.datetime.now()) existing_assignments.update(timeslot=timeslot, modified=timezone.now())
else: else:
SchedTimeSessAssignment.objects.create( SchedTimeSessAssignment.objects.create(
session=session, session=session,
@ -1560,7 +1560,7 @@ def agenda(request, num=None, name=None, base=None, ext=None, owner=None, utc=""
"updated": updated, "updated": updated,
"filter_categories": filter_organizer.get_filter_categories(), "filter_categories": filter_organizer.get_filter_categories(),
"non_area_keywords": filter_organizer.get_non_area_keywords(), "non_area_keywords": filter_organizer.get_non_area_keywords(),
"now": datetime.datetime.now().astimezone(pytz.UTC), "now": timezone.now().astimezone(pytz.utc),
"timezone": meeting.time_zone, "timezone": meeting.time_zone,
"is_current_meeting": is_current_meeting, "is_current_meeting": is_current_meeting,
"use_codimd": True if meeting.date>=settings.MEETING_USES_CODIMD_DATE else False, "use_codimd": True if meeting.date>=settings.MEETING_USES_CODIMD_DATE else False,
@ -2454,7 +2454,7 @@ def session_details(request, num, acronym):
'can_manage_materials' : can_manage, 'can_manage_materials' : can_manage,
'can_view_request': can_view_request, 'can_view_request': can_view_request,
'thisweek': datetime.date.today()-datetime.timedelta(days=7), 'thisweek': datetime.date.today()-datetime.timedelta(days=7),
'now': datetime.datetime.now(), 'now': timezone.now(),
'use_codimd': True if meeting.date>=settings.MEETING_USES_CODIMD_DATE else False, 'use_codimd': True if meeting.date>=settings.MEETING_USES_CODIMD_DATE else False,
}) })
@ -3542,7 +3542,7 @@ def interim_request_edit(request, number):
@cache_page(60*60) @cache_page(60*60)
def past(request): def past(request):
'''List of past meetings''' '''List of past meetings'''
today = datetime.datetime.today() today = timezone.now()
meetings = data_for_meetings_overview(Meeting.objects.filter(date__lte=today).order_by('-date')) meetings = data_for_meetings_overview(Meeting.objects.filter(date__lte=today).order_by('-date'))
@ -3615,7 +3615,7 @@ def upcoming(request):
'menu_actions': actions, 'menu_actions': actions,
'menu_entries': menu_entries, 'menu_entries': menu_entries,
'selected_menu_entry': selected_menu_entry, 'selected_menu_entry': selected_menu_entry,
'now': datetime.datetime.now(), 'now': timezone.now(),
'use_codimd': True if datetime.date.today()>=settings.MEETING_USES_CODIMD_DATE else False, 'use_codimd': True if datetime.date.today()>=settings.MEETING_USES_CODIMD_DATE else False,
}) })

View file

@ -6,6 +6,7 @@ import email
import datetime import datetime
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -25,7 +26,7 @@ class Command(BaseCommand):
""" """
def add_arguments(self, parser): def add_arguments(self, parser):
default_start = datetime.datetime.now() - datetime.timedelta(days=14) default_start = timezone.now() - datetime.timedelta(days=14)
parser.add_argument( parser.add_argument(
'-t', '--start', '--from', type=str, default=default_start.strftime('%Y-%m-%d %H:%M'), '-t', '--start', '--from', type=str, default=default_start.strftime('%Y-%m-%d %H:%M'),
help='Limit the list to messages saved after the given time (default %(default)s).', help='Limit the list to messages saved after the given time (default %(default)s).',

View file

@ -0,0 +1,24 @@
# Generated by Django 2.2.28 on 2022-07-12 11:24
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('message', '0011_auto_20201109_0439'),
]
operations = [
migrations.AlterField(
model_name='message',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='sendqueue',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

View file

@ -2,10 +2,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import datetime
import email.utils import email.utils
from django.db import models from django.db import models
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -17,7 +17,7 @@ from ietf.utils.models import ForeignKey
from ietf.utils.mail import get_email_addresses_from_text from ietf.utils.mail import get_email_addresses_from_text
class Message(models.Model): class Message(models.Model):
time = models.DateTimeField(default=datetime.datetime.now) time = models.DateTimeField(default=timezone.now)
by = ForeignKey(Person) by = ForeignKey(Person)
subject = models.CharField(max_length=255) subject = models.CharField(max_length=255)
@ -62,7 +62,7 @@ class MessageAttachment(models.Model):
class SendQueue(models.Model): class SendQueue(models.Model):
time = models.DateTimeField(default=datetime.datetime.now) time = models.DateTimeField(default=timezone.now)
by = ForeignKey(Person) by = ForeignKey(Person)
message = ForeignKey(Message) message = ForeignKey(Message)

View file

@ -5,6 +5,7 @@
import datetime import datetime
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -87,7 +88,7 @@ class SendScheduledAnnouncementsTests(TestCase):
q = SendQueue.objects.create( q = SendQueue.objects.create(
by=Person.objects.get(name="(System)"), by=Person.objects.get(name="(System)"),
message=msg, message=msg,
send_at=datetime.datetime.now() + datetime.timedelta(hours=12) send_at=timezone.now() + datetime.timedelta(hours=12)
) )
mailbox_before = len(outbox) mailbox_before = len(outbox)
@ -113,7 +114,7 @@ class SendScheduledAnnouncementsTests(TestCase):
q = SendQueue.objects.create( q = SendQueue.objects.create(
by=Person.objects.get(name="(System)"), by=Person.objects.get(name="(System)"),
message=msg, message=msg,
send_at=datetime.datetime.now() + datetime.timedelta(hours=12) send_at=timezone.now() + datetime.timedelta(hours=12)
) )
mailbox_before = len(outbox) mailbox_before = len(outbox)

View file

@ -2,8 +2,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import re, datetime, email import re, email
from django.utils import timezone
from django.utils.encoding import force_str from django.utils.encoding import force_str
from ietf.utils.mail import send_mail_text, send_mail_mime from ietf.utils.mail import send_mail_text, send_mail_mime
@ -52,7 +53,7 @@ def send_scheduled_message_from_send_queue(queue_item):
send_mail_mime(None, message.to, message.frm, message.subject, send_mail_mime(None, message.to, message.frm, message.subject,
msg, cc=message.cc, bcc=message.bcc) msg, cc=message.cc, bcc=message.bcc)
queue_item.sent_at = datetime.datetime.now() queue_item.sent_at = timezone.now()
queue_item.save() queue_item.save()
queue_item.message.sent = queue_item.sent_at queue_item.message.sent = queue_item.sent_at

View file

@ -17,6 +17,7 @@ from django.conf import settings
from django.core.files import File from django.core.files import File
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.urls import reverse from django.urls import reverse
from django.utils import timezone
from django.utils.encoding import force_str from django.utils.encoding import force_str
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -1389,7 +1390,7 @@ class FeedbackLastSeenTests(TestCase):
f.nominees.add(self.nominee) f.nominees.add(self.nominee)
f = FeedbackFactory.create(author=self.author,nomcom=self.nc,type_id='comment') f = FeedbackFactory.create(author=self.author,nomcom=self.nc,type_id='comment')
f.topics.add(self.topic) f.topics.add(self.topic)
now = datetime.datetime.now() now = timezone.now()
self.hour_ago = now - datetime.timedelta(hours=1) self.hour_ago = now - datetime.timedelta(hours=1)
self.half_hour_ago = now - datetime.timedelta(minutes=30) self.half_hour_ago = now - datetime.timedelta(minutes=30)
self.second_from_now = now + datetime.timedelta(seconds=1) self.second_from_now = now + datetime.timedelta(seconds=1)

View file

@ -1,9 +1,10 @@
# Copyright The IETF Trust 2021, All Rights Reserved # Copyright The IETF Trust 2021, All Rights Reserved
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from datetime import datetime, timedelta from datetime import timedelta
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from django.db.models import Max, Min from django.db.models import Max, Min
from django.utils import timezone
from ietf.person.models import PersonApiKeyEvent from ietf.person.models import PersonApiKeyEvent
@ -33,7 +34,7 @@ class Command(BaseCommand):
self.stdout.write('Finding events older than {}\n'.format(_format_count(keep_days))) self.stdout.write('Finding events older than {}\n'.format(_format_count(keep_days)))
self.stdout.flush() self.stdout.flush()
now = datetime.now() now = timezone.now()
old_events = PersonApiKeyEvent.objects.filter( old_events = PersonApiKeyEvent.objects.filter(
time__lt=now - timedelta(days=keep_days) time__lt=now - timedelta(days=keep_days)
) )

View file

@ -5,6 +5,7 @@ import datetime
from io import StringIO from io import StringIO
from django.core.management import call_command, CommandError from django.core.management import call_command, CommandError
from django.utils import timezone
from ietf.person.factories import PersonApiKeyEventFactory from ietf.person.factories import PersonApiKeyEventFactory
from ietf.person.models import PersonApiKeyEvent, PersonEvent from ietf.person.models import PersonApiKeyEvent, PersonEvent
@ -51,7 +52,7 @@ class CommandTests(TestCase):
# Remember how many PersonEvents were present so we can verify they're cleaned up properly. # Remember how many PersonEvents were present so we can verify they're cleaned up properly.
personevents_before = PersonEvent.objects.count() personevents_before = PersonEvent.objects.count()
now = datetime.datetime.now() now = timezone.now()
# The first of these events will be timestamped a fraction of a second more than keep_days # The first of these events will be timestamped a fraction of a second more than keep_days
# days ago by the time we call the management command, so will just barely chosen for purge. # days ago by the time we call the management command, so will just barely chosen for purge.
old_events = [ old_events = [
@ -101,7 +102,7 @@ class CommandTests(TestCase):
def test_purge_old_personal_api_key_events_rejects_invalid_arguments(self): def test_purge_old_personal_api_key_events_rejects_invalid_arguments(self):
"""The purge_old_personal_api_key_events command should reject invalid arguments""" """The purge_old_personal_api_key_events command should reject invalid arguments"""
event = PersonApiKeyEventFactory(time=datetime.datetime.now() - datetime.timedelta(days=30)) event = PersonApiKeyEventFactory(time=timezone.now() - datetime.timedelta(days=30))
with self.assertRaises(CommandError): with self.assertRaises(CommandError):
self._call_command('purge_old_personal_api_key_events') self._call_command('purge_old_personal_api_key_events')

View file

@ -0,0 +1,34 @@
# Generated by Django 2.2.28 on 2022-07-12 11:24
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('person', '0024_pronouns'),
]
operations = [
migrations.AlterField(
model_name='historicalperson',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='person',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='personalapikey',
name='created',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='personevent',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now, help_text='When the event happened'),
),
]

View file

@ -2,7 +2,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import datetime
import email.utils import email.utils
import email.header import email.header
import jsonfield import jsonfield
@ -18,6 +17,7 @@ from django.core.validators import validate_email
from django.db import models from django.db import models
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
from django.utils.encoding import smart_bytes from django.utils.encoding import smart_bytes
from django.utils.text import slugify from django.utils.text import slugify
@ -38,7 +38,7 @@ from ietf.utils.models import ForeignKey, OneToOneField
class Person(models.Model): class Person(models.Model):
history = HistoricalRecords() history = HistoricalRecords()
user = OneToOneField(User, blank=True, null=True, on_delete=models.SET_NULL) user = OneToOneField(User, blank=True, null=True, on_delete=models.SET_NULL)
time = models.DateTimeField(default=datetime.datetime.now) # When this Person record entered the system time = models.DateTimeField(default=timezone.now) # When this Person record entered the system
# The normal unicode form of the name. This must be # The normal unicode form of the name. This must be
# set to the same value as the ascii-form if equal. # set to the same value as the ascii-form if equal.
name = models.CharField("Full Name (Unicode)", max_length=255, db_index=True, help_text="Preferred long form of name.") name = models.CharField("Full Name (Unicode)", max_length=255, db_index=True, help_text="Preferred long form of name.")
@ -377,7 +377,7 @@ PERSON_API_KEY_ENDPOINTS = sorted(list(set([ (v, n) for (v, n, r) in PERSON_API_
class PersonalApiKey(models.Model): class PersonalApiKey(models.Model):
person = ForeignKey(Person, related_name='apikeys') person = ForeignKey(Person, related_name='apikeys')
endpoint = models.CharField(max_length=128, null=False, blank=False, choices=PERSON_API_KEY_ENDPOINTS) endpoint = models.CharField(max_length=128, null=False, blank=False, choices=PERSON_API_KEY_ENDPOINTS)
created = models.DateTimeField(default=datetime.datetime.now, null=False) created = models.DateTimeField(default=timezone.now, null=False)
valid = models.BooleanField(default=True) valid = models.BooleanField(default=True)
salt = models.BinaryField(default=salt, max_length=12, null=False, blank=False) salt = models.BinaryField(default=salt, max_length=12, null=False, blank=False)
count = models.IntegerField(default=0, null=False, blank=False) count = models.IntegerField(default=0, null=False, blank=False)
@ -427,7 +427,7 @@ PERSON_EVENT_CHOICES = [
class PersonEvent(models.Model): class PersonEvent(models.Model):
person = ForeignKey(Person) person = ForeignKey(Person)
time = models.DateTimeField(default=datetime.datetime.now, help_text="When the event happened") time = models.DateTimeField(default=timezone.now, help_text="When the event happened")
type = models.CharField(max_length=50, choices=PERSON_EVENT_CHOICES) type = models.CharField(max_length=50, choices=PERSON_EVENT_CHOICES)
desc = models.TextField() desc = models.TextField()

View file

@ -13,6 +13,7 @@ from pyquery import PyQuery
from django.http import HttpRequest from django.http import HttpRequest
from django.test import override_settings from django.test import override_settings
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
from django.utils.encoding import iri_to_uri from django.utils.encoding import iri_to_uri
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -211,7 +212,7 @@ class PersonUtilsTests(TestCase):
self.assertEqual(results,(p1,p3)) self.assertEqual(results,(p1,p3))
# both have User # both have User
today = datetime.datetime.today() today = timezone.now()
p2.user.last_login = today p2.user.last_login = today
p2.user.save() p2.user.save()
p4.user.last_login = today - datetime.timedelta(days=30) p4.user.last_login = today - datetime.timedelta(days=30)

View file

@ -2,6 +2,8 @@
import factory import factory
import datetime import datetime
from django.utils import timezone
from ietf.review.models import ReviewTeamSettings, ReviewRequest, ReviewAssignment, ReviewerSettings from ietf.review.models import ReviewTeamSettings, ReviewRequest, ReviewAssignment, ReviewerSettings
from ietf.name.models import ReviewTypeName, ReviewResultName from ietf.name.models import ReviewTypeName, ReviewResultName
@ -39,7 +41,7 @@ class ReviewRequestFactory(factory.django.DjangoModelFactory):
type_id = 'lc' type_id = 'lc'
doc = factory.SubFactory('ietf.doc.factories.DocumentFactory',type_id='draft') doc = factory.SubFactory('ietf.doc.factories.DocumentFactory',type_id='draft')
team = factory.SubFactory('ietf.group.factories.ReviewTeamFactory',type_id='review') team = factory.SubFactory('ietf.group.factories.ReviewTeamFactory',type_id='review')
deadline = datetime.datetime.today()+datetime.timedelta(days=14) deadline = timezone.now()+datetime.timedelta(days=14)
requested_by = factory.SubFactory('ietf.person.factories.PersonFactory') requested_by = factory.SubFactory('ietf.person.factories.PersonFactory')
class ReviewAssignmentFactory(factory.django.DjangoModelFactory): class ReviewAssignmentFactory(factory.django.DjangoModelFactory):
@ -49,7 +51,7 @@ class ReviewAssignmentFactory(factory.django.DjangoModelFactory):
review_request = factory.SubFactory('ietf.review.factories.ReviewRequestFactory') review_request = factory.SubFactory('ietf.review.factories.ReviewRequestFactory')
state_id = 'assigned' state_id = 'assigned'
reviewer = factory.SubFactory('ietf.person.factories.EmailFactory') reviewer = factory.SubFactory('ietf.person.factories.EmailFactory')
assigned_on = datetime.datetime.now() assigned_on = timezone.now()
class ReviewerSettingsFactory(factory.django.DjangoModelFactory): class ReviewerSettingsFactory(factory.django.DjangoModelFactory):
class Meta: class Meta:

View file

@ -0,0 +1,29 @@
# Generated by Django 2.2.28 on 2022-07-12 11:24
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('review', '0028_auto_20220513_1456'),
]
operations = [
migrations.AlterField(
model_name='historicalreviewrequest',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='reviewrequest',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='reviewwish',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

View file

@ -7,6 +7,7 @@ import datetime
from simple_history.models import HistoricalRecords from simple_history.models import HistoricalRecords
from django.db import models from django.db import models
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -95,7 +96,7 @@ class UnavailablePeriod(models.Model):
class ReviewWish(models.Model): class ReviewWish(models.Model):
"""Reviewer wishes to review a document when it becomes available for review.""" """Reviewer wishes to review a document when it becomes available for review."""
time = models.DateTimeField(default=datetime.datetime.now) time = models.DateTimeField(default=timezone.now)
team = ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None)) team = ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))
person = ForeignKey(Person) person = ForeignKey(Person)
doc = ForeignKey(Document) doc = ForeignKey(Document)
@ -125,7 +126,7 @@ class ReviewRequest(models.Model):
# Fields filled in on the initial record creation - these # Fields filled in on the initial record creation - these
# constitute the request part. # constitute the request part.
time = models.DateTimeField(default=datetime.datetime.now) time = models.DateTimeField(default=timezone.now)
type = ForeignKey(ReviewTypeName) type = ForeignKey(ReviewTypeName)
doc = ForeignKey(Document, related_name='reviewrequest_set') doc = ForeignKey(Document, related_name='reviewrequest_set')
team = ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None)) team = ForeignKey(Group, limit_choices_to=~models.Q(reviewteamsettings=None))

View file

@ -12,6 +12,8 @@ from django.template.defaultfilters import pluralize
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.utils import timezone
from simple_history.utils import update_change_reason from simple_history.utils import update_change_reason
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -119,7 +121,7 @@ def days_needed_to_fulfill_min_interval_for_reviewers(team):
min_intervals = dict(ReviewerSettings.objects.filter(team=team).values_list("person_id", "min_interval")) min_intervals = dict(ReviewerSettings.objects.filter(team=team).values_list("person_id", "min_interval"))
now = datetime.datetime.now() now = timezone.now()
res = {} res = {}
for person_id, latest_assignment_time in latest_assignments.items(): for person_id, latest_assignment_time in latest_assignments.items():
@ -495,7 +497,7 @@ def suggested_review_requests_for_team(team):
requests = {} requests = {}
now = datetime.datetime.now() now = timezone.now()
reviewable_docs_qs = Document.objects.filter(type="draft").exclude(stream="ise") reviewable_docs_qs = Document.objects.filter(type="draft").exclude(stream="ise")

View file

@ -14,6 +14,7 @@ import debug # pyflakes:ignore
from django.conf import settings from django.conf import settings
from django.urls import reverse from django.urls import reverse
from django.utils import timezone
from ietf.group.models import Group, GroupEvent from ietf.group.models import Group, GroupEvent
from ietf.meeting.factories import MeetingFactory from ietf.meeting.factories import MeetingFactory
@ -212,8 +213,8 @@ class SecrMeetingTestCase(TestCase):
self.assertEqual(q('#id_notification_list').html(),'ames, mars') self.assertEqual(q('#id_notification_list').html(),'ames, mars')
# test that only changes since last notification show up # test that only changes since last notification show up
now = datetime.datetime.now() now = timezone.now()
then = datetime.datetime.now()+datetime.timedelta(hours=1) then = timezone.now()+datetime.timedelta(hours=1)
person = Person.objects.get(name="(System)") person = Person.objects.get(name="(System)")
GroupEvent.objects.create(group=mars_group,time=now,type='sent_notification', GroupEvent.objects.create(group=mars_group,time=now,type='sent_notification',
by=person,desc='sent scheduled notification for %s' % meeting) by=person,desc='sent scheduled notification for %s' % meeting)

View file

@ -11,6 +11,7 @@ from django.db.models import IntegerField
from django.db.models.functions import Cast from django.db.models.functions import Cast
from django.forms.models import inlineformset_factory from django.forms.models import inlineformset_factory
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone
from django.utils.text import slugify from django.utils.text import slugify
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -121,7 +122,7 @@ def send_notifications(meeting, groups, person):
Send session scheduled email notifications for each group in groups. Person is the Send session scheduled email notifications for each group in groups. Person is the
user who initiated this action, request.uesr.get_profile(). user who initiated this action, request.uesr.get_profile().
''' '''
now = datetime.datetime.now() now = timezone.now()
for group in groups: for group in groups:
sessions = group.session_set.filter(meeting=meeting) sessions = group.session_set.filter(meeting=meeting)
addrs = gather_address_lists('session_scheduled',group=group,session=sessions[0]) addrs = gather_address_lists('session_scheduled',group=group,session=sessions[0])

View file

@ -1,6 +1,7 @@
import datetime import datetime
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone
from ietf.meeting.models import Meeting from ietf.meeting.models import Meeting
from ietf.doc.models import DocEvent, Document from ietf.doc.models import DocEvent, Document
@ -9,7 +10,7 @@ from ietf.secr.proceedings.proc_utils import get_progress_stats
def report_id_activity(start,end): def report_id_activity(start,end):
# get previous meeting # get previous meeting
meeting = Meeting.objects.filter(date__lt=datetime.datetime.now(),type='ietf').order_by('-date')[0] meeting = Meeting.objects.filter(date__lt=timezone.now(),type='ietf').order_by('-date')[0]
syear,smonth,sday = start.split('-') syear,smonth,sday = start.split('-')
eyear,emonth,eday = end.split('-') eyear,emonth,eday = end.split('-')
sdate = datetime.datetime(int(syear),int(smonth),int(sday)) sdate = datetime.datetime(int(syear),int(smonth),int(sday))

View file

@ -1,6 +1,8 @@
import datetime import datetime
import debug # pyflakes:ignore import debug # pyflakes:ignore
from django.utils import timezone
from ietf.doc.factories import DocumentFactory,NewRevisionDocEventFactory from ietf.doc.factories import DocumentFactory,NewRevisionDocEventFactory
from ietf.secr.proceedings.reports import report_id_activity, report_progress_report from ietf.secr.proceedings.reports import report_id_activity, report_progress_report
from ietf.utils.test_utils import TestCase from ietf.utils.test_utils import TestCase
@ -10,7 +12,7 @@ class ReportsTestCase(TestCase):
def test_report_id_activity(self): def test_report_id_activity(self):
today = datetime.datetime.today() today = timezone.now()
yesterday = today - datetime.timedelta(days=1) yesterday = today - datetime.timedelta(days=1)
last_quarter = today - datetime.timedelta(days=3*30) last_quarter = today - datetime.timedelta(days=3*30)
next_week = today+datetime.timedelta(days=7) next_week = today+datetime.timedelta(days=7)
@ -24,7 +26,7 @@ class ReportsTestCase(TestCase):
self.assertTrue('IETF Activity since last IETF Meeting' in result) self.assertTrue('IETF Activity since last IETF Meeting' in result)
def test_report_progress_report(self): def test_report_progress_report(self):
today = datetime.datetime.today() today = timezone.now()
last_quarter = today - datetime.timedelta(days=3*30) last_quarter = today - datetime.timedelta(days=3*30)
next_week = today+datetime.timedelta(days=7) next_week = today+datetime.timedelta(days=7)

View file

@ -8,6 +8,7 @@ from pyquery import PyQuery
import debug # pyflakes:ignore import debug # pyflakes:ignore
from django.urls import reverse from django.urls import reverse
from django.utils import timezone
from ietf.doc.factories import (WgDraftFactory, IndividualRfcFactory, CharterFactory, from ietf.doc.factories import (WgDraftFactory, IndividualRfcFactory, CharterFactory,
IndividualDraftFactory, ConflictReviewFactory) IndividualDraftFactory, ConflictReviewFactory)
@ -22,7 +23,7 @@ from ietf.secr.telechat.views import get_next_telechat_date
SECR_USER='secretary' SECR_USER='secretary'
def augment_data(): def augment_data():
TelechatDate.objects.create(date=datetime.datetime.today()) TelechatDate.objects.create(date=timezone.now())
class SecrTelechatTestCase(TestCase): class SecrTelechatTestCase(TestCase):
def test_main(self): def test_main(self):
@ -138,7 +139,7 @@ class SecrTelechatTestCase(TestCase):
self.assertEqual(q("#telechat-positions-table").find("th:contains('No Record')").length,1) self.assertEqual(q("#telechat-positions-table").find("th:contains('No Record')").length,1)
def test_bash(self): def test_bash(self):
today = datetime.datetime.today() today = timezone.now()
TelechatDate.objects.create(date=today) TelechatDate.objects.create(date=today)
url = reverse('ietf.secr.telechat.views.bash',kwargs={'date':today.strftime('%Y-%m-%d')}) url = reverse('ietf.secr.telechat.views.bash',kwargs={'date':today.strftime('%Y-%m-%d')})
self.client.login(username="secretary", password="secretary+password") self.client.login(username="secretary", password="secretary+password")

View file

@ -1,10 +1,10 @@
# Copyright The IETF Trust 2017-2019, All Rights Reserved # Copyright The IETF Trust 2017-2019, All Rights Reserved
# Copyright 2016 IETF Trust # Copyright 2016 IETF Trust
import datetime
import syslog import syslog
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -32,7 +32,7 @@ class Command(BaseCommand):
elif options['all']: elif options['all']:
meetings = Meeting.objects.filter(type="ietf").order_by("date") meetings = Meeting.objects.filter(type="ietf").order_by("date")
elif options['latest']: elif options['latest']:
meetings = Meeting.objects.filter(type="ietf", date__lte=datetime.datetime.today()).order_by("-date")[:options['latest']] meetings = Meeting.objects.filter(type="ietf", date__lte=timezone.now()).order_by("-date")[:options['latest']]
else: else:
raise CommandError("Please use one of --meeting, --all or --latest") raise CommandError("Please use one of --meeting, --all or --latest")

View file

@ -13,6 +13,7 @@ from requests import Response
import debug # pyflakes:ignore import debug # pyflakes:ignore
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
from ietf.utils.test_utils import login_testing_unauthorized, TestCase from ietf.utils.test_utils import login_testing_unauthorized, TestCase
import ietf.stats.views import ietf.stats.views
@ -63,7 +64,7 @@ class StatisticsTests(TestCase):
Document.objects.filter(pk=draft.pk).update(words=4000) Document.objects.filter(pk=draft.pk).update(words=4000)
# move it back so it shows up in the yearly summaries # move it back so it shows up in the yearly summaries
NewRevisionDocEvent.objects.filter(doc=draft, rev=draft.rev).update( NewRevisionDocEvent.objects.filter(doc=draft, rev=draft.rev).update(
time=datetime.datetime.now() - datetime.timedelta(days=500)) time=timezone.now() - datetime.timedelta(days=500))
referencing_draft = Document.objects.create( referencing_draft = Document.objects.create(
name="draft-ietf-mars-referencing", name="draft-ietf-mars-referencing",
@ -88,7 +89,7 @@ class StatisticsTests(TestCase):
doc=referencing_draft, doc=referencing_draft,
desc="New revision available", desc="New revision available",
rev=referencing_draft.rev, rev=referencing_draft.rev,
time=datetime.datetime.now() - datetime.timedelta(days=1000) time=timezone.now() - datetime.timedelta(days=1000)
) )

View file

@ -18,6 +18,7 @@ from django.db.models import Count, Q
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.text import slugify from django.utils.text import slugify
@ -196,7 +197,7 @@ def document_stats(request, stats_type=None):
if "y" in time_choice: if "y" in time_choice:
try: try:
y = int(time_choice.rstrip("y")) y = int(time_choice.rstrip("y"))
from_time = datetime.datetime.today() - dateutil.relativedelta.relativedelta(years=y) from_time = timezone.now() - dateutil.relativedelta.relativedelta(years=y)
except ValueError: except ValueError:
pass pass

View file

@ -21,6 +21,7 @@ from django import forms
from django.conf import settings from django.conf import settings
from django.utils.html import mark_safe, format_html # type:ignore from django.utils.html import mark_safe, format_html # type:ignore
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
from django.utils.encoding import force_str from django.utils.encoding import force_str
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -79,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 self.base_formats = None # None will raise an exception in clean() if this isn't changed in a subclass
def set_cutoff_warnings(self): def set_cutoff_warnings(self):
now = datetime.datetime.now(pytz.utc) now = timezone.now().astimezone(pytz.utc)
meeting = Meeting.get_current_meeting() meeting = Meeting.get_current_meeting()
if not meeting: if not meeting:
return return

View file

@ -0,0 +1,29 @@
# Generated by Django 2.2.28 on 2022-07-12 11:24
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('submit', '0010_create_cancel_stale_submissions_task'),
]
operations = [
migrations.AlterField(
model_name='preapproval',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='submissioncheck',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='submissionevent',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

View file

@ -7,6 +7,7 @@ import email
import jsonfield import jsonfield
from django.db import models from django.db import models
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -120,7 +121,7 @@ class Submission(models.Model):
class SubmissionCheck(models.Model): class SubmissionCheck(models.Model):
time = models.DateTimeField(default=datetime.datetime.now) time = models.DateTimeField(default=timezone.now)
submission = ForeignKey(Submission, related_name='checks') submission = ForeignKey(Submission, related_name='checks')
checker = models.CharField(max_length=256, blank=True) checker = models.CharField(max_length=256, blank=True)
passed = models.BooleanField(null=True, default=False) passed = models.BooleanField(null=True, default=False)
@ -139,7 +140,7 @@ class SubmissionCheck(models.Model):
class SubmissionEvent(models.Model): class SubmissionEvent(models.Model):
submission = ForeignKey(Submission) submission = ForeignKey(Submission)
time = models.DateTimeField(default=datetime.datetime.now) time = models.DateTimeField(default=timezone.now)
by = ForeignKey(Person, null=True, blank=True) by = ForeignKey(Person, null=True, blank=True)
desc = models.TextField() desc = models.TextField()
@ -157,7 +158,7 @@ class Preapproval(models.Model):
"""Pre-approved draft submission name.""" """Pre-approved draft submission name."""
name = models.CharField(max_length=255, db_index=True) name = models.CharField(max_length=255, db_index=True)
by = ForeignKey(Person) by = ForeignKey(Person)
time = models.DateTimeField(default=datetime.datetime.now) time = models.DateTimeField(default=timezone.now)
def __str__(self): def __str__(self):
return self.name return self.name

View file

@ -287,7 +287,7 @@ class SubmitTests(BaseSubmitTestCase):
# prepare draft to suggest replace # prepare draft to suggest replace
sug_replaced_draft = Document.objects.create( sug_replaced_draft = Document.objects.create(
name="draft-ietf-ames-sug-replaced", name="draft-ietf-ames-sug-replaced",
time=datetime.datetime.now(), time=timezone.now(),
type_id="draft", type_id="draft",
title="Draft to be suggested to be replaced", title="Draft to be suggested to be replaced",
stream_id="ietf", stream_id="ietf",
@ -298,7 +298,7 @@ class SubmitTests(BaseSubmitTestCase):
words=100, words=100,
intended_std_level_id="ps", intended_std_level_id="ps",
ad=draft.ad, ad=draft.ad,
expires=datetime.datetime.now() + datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), expires=timezone.now() + datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE),
notify="aliens@example.mars", notify="aliens@example.mars",
note="", note="",
) )
@ -357,7 +357,7 @@ class SubmitTests(BaseSubmitTestCase):
self.assertTrue(os.path.exists(os.path.join(self.repository_dir, "%s-%s.txt" % (name, rev)))) self.assertTrue(os.path.exists(os.path.join(self.repository_dir, "%s-%s.txt" % (name, rev))))
self.assertEqual(draft.type_id, "draft") self.assertEqual(draft.type_id, "draft")
self.assertEqual(draft.stream_id, "ietf") self.assertEqual(draft.stream_id, "ietf")
self.assertTrue(draft.expires >= datetime.datetime.now() + datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE - 1)) self.assertTrue(draft.expires >= timezone.now() + datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE - 1))
self.assertEqual(draft.get_state("draft-stream-%s" % draft.stream_id).slug, "wg-doc") self.assertEqual(draft.get_state("draft-stream-%s" % draft.stream_id).slug, "wg-doc")
authors = draft.documentauthor_set.all() authors = draft.documentauthor_set.all()
self.assertEqual(len(authors), 1) self.assertEqual(len(authors), 1)
@ -2320,7 +2320,7 @@ Subject: test submission via email
Please submit my draft at http://test.com/mydraft.txt Please submit my draft at http://test.com/mydraft.txt
Thank you Thank you
""".format(datetime.datetime.now().ctime()) """.format(timezone.now().ctime())
message = email.message_from_string(force_str(message_string)) message = email.message_from_string(force_str(message_string))
submission, submission_email_event = ( submission, submission_email_event = (
add_submission_email(request=None, add_submission_email(request=None,
@ -2402,7 +2402,7 @@ Content-Disposition: attachment; filename="attach.txt"
QW4gZXhhbXBsZSBhdHRhY2htZW50IHd0aG91dCB2ZXJ5IG11Y2ggaW4gaXQuCgpBIGNvdXBs QW4gZXhhbXBsZSBhdHRhY2htZW50IHd0aG91dCB2ZXJ5IG11Y2ggaW4gaXQuCgpBIGNvdXBs
ZSBvZiBsaW5lcyAtIGJ1dCBpdCBjb3VsZCBiZSBhIGRyYWZ0Cg== ZSBvZiBsaW5lcyAtIGJ1dCBpdCBjb3VsZCBiZSBhIGRyYWZ0Cg==
--------------090908050800030909090207-- --------------090908050800030909090207--
""".format(frm, datetime.datetime.now().ctime()) """.format(frm, timezone.now().ctime())
message = email.message_from_string(force_str(message_string)) message = email.message_from_string(force_str(message_string))
submission, submission_email_event = ( submission, submission_email_event = (
@ -2458,7 +2458,7 @@ Content-Disposition: attachment; filename="attachment.txt"
QW4gZXhhbXBsZSBhdHRhY2htZW50IHd0aG91dCB2ZXJ5IG11Y2ggaW4gaXQuCgpBIGNvdXBs QW4gZXhhbXBsZSBhdHRhY2htZW50IHd0aG91dCB2ZXJ5IG11Y2ggaW4gaXQuCgpBIGNvdXBs
ZSBvZiBsaW5lcyAtIGJ1dCBpdCBjb3VsZCBiZSBhIGRyYWZ0Cg== ZSBvZiBsaW5lcyAtIGJ1dCBpdCBjb3VsZCBiZSBhIGRyYWZ0Cg==
--------------090908050800030909090207-- --------------090908050800030909090207--
""".format(datetime.datetime.now().ctime()) """.format(timezone.now().ctime())
# Back to secretariat # Back to secretariat
self.client.login(username="secretary", password="secretary+password") self.client.login(username="secretary", password="secretary+password")
@ -2597,7 +2597,7 @@ Subject: Another message
About my submission About my submission
Thank you Thank you
""".format(datetime.datetime.now().ctime()) """.format(timezone.now().ctime())
r = self.client.post(add_email_url, { r = self.client.post(add_email_url, {
"name": "{}-{}".format(submission.name, submission.rev), "name": "{}-{}".format(submission.name, submission.rev),
@ -2664,7 +2664,7 @@ Thank you
From: {} From: {}
Date: {} Date: {}
Subject: test Subject: test
""".format(reply_to, to, datetime.datetime.now().ctime()) """.format(reply_to, to, timezone.now().ctime())
result = process_response_email(message_string) result = process_response_email(message_string)
self.assertIsInstance(result, Message) self.assertIsInstance(result, Message)

View file

@ -22,6 +22,7 @@ from django.http import HttpRequest # pyflakes:ignore
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -338,7 +339,7 @@ def post_submission(request, submission, approved_doc_desc, approved_subm_desc):
if stream_slug: if stream_slug:
draft.stream = StreamName.objects.get(slug=stream_slug) draft.stream = StreamName.objects.get(slug=stream_slug)
draft.expires = datetime.datetime.now() + datetime.timedelta(settings.INTERNET_DRAFT_DAYS_TO_EXPIRE) draft.expires = timezone.now() + datetime.timedelta(settings.INTERNET_DRAFT_DAYS_TO_EXPIRE)
log.log(f"{submission.name}: got draft details") log.log(f"{submission.name}: got draft details")
events = [] events = []
@ -616,7 +617,7 @@ def ensure_person_email_info_exists(name, email, docname):
email.active = active email.active = active
email.person = person email.person = person
if email.time is None: if email.time is None:
email.time = datetime.datetime.now() email.time = timezone.now()
email.origin = "author: %s" % docname email.origin = "author: %s" % docname
email.save() email.save()

View file

@ -10,6 +10,7 @@ import re
import requests import requests
from django.conf import settings from django.conf import settings
from django.utils import timezone
from django.utils.encoding import smart_bytes, force_str from django.utils.encoding import smart_bytes, force_str
from django.utils.http import urlquote from django.utils.http import urlquote
@ -241,7 +242,7 @@ def parse_review_email(text):
doc_name = strip_version_extension(doc_name) doc_name = strip_version_extension(doc_name)
# date # date
review_time = datetime.datetime.now() review_time = timezone.now()
if "Date" in msg: if "Date" in msg:
review_time = email_time_to_local_timezone(msg["Date"]) review_time = email_time_to_local_timezone(msg["Date"])

View file

@ -11,6 +11,7 @@ from urllib.parse import urlencode
from xml.dom import pulldom, Node from xml.dom import pulldom, Node
from django.conf import settings from django.conf import settings
from django.utils import timezone
from django.utils.encoding import smart_bytes, force_str, force_text from django.utils.encoding import smart_bytes, force_str, force_text
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -443,7 +444,7 @@ def update_docs_from_rfc_index(index_data, errata_data, skip_older_than_date=Non
# at the moment because the data only has month/year, so # at the moment because the data only has month/year, so
# try to deduce it # try to deduce it
d = datetime.datetime.combine(rfc_published_date, datetime.time()) d = datetime.datetime.combine(rfc_published_date, datetime.time())
synthesized = datetime.datetime.now() synthesized = timezone.now()
if abs(d - synthesized) > datetime.timedelta(days=60): if abs(d - synthesized) > datetime.timedelta(days=60):
synthesized = d synthesized = d
else: else:

View file

@ -10,6 +10,7 @@ import quopri
from django.conf import settings from django.conf import settings
from django.urls import reverse as urlreverse from django.urls import reverse as urlreverse
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -34,11 +35,11 @@ class IANASyncTests(TestCase):
self.assertEqual(len(rfc_names), 1) self.assertEqual(len(rfc_names), 1)
self.assertEqual(rfc_names[0], "rfc1234") self.assertEqual(rfc_names[0], "rfc1234")
iana.update_rfc_log_from_protocol_page(rfc_names, datetime.datetime.now() - datetime.timedelta(days=1)) iana.update_rfc_log_from_protocol_page(rfc_names, timezone.now() - datetime.timedelta(days=1))
self.assertEqual(DocEvent.objects.filter(doc=draft, type="rfc_in_iana_registry").count(), 1) self.assertEqual(DocEvent.objects.filter(doc=draft, type="rfc_in_iana_registry").count(), 1)
# make sure it doesn't create duplicates # make sure it doesn't create duplicates
iana.update_rfc_log_from_protocol_page(rfc_names, datetime.datetime.now() - datetime.timedelta(days=1)) iana.update_rfc_log_from_protocol_page(rfc_names, timezone.now() - datetime.timedelta(days=1))
self.assertEqual(DocEvent.objects.filter(doc=draft, type="rfc_in_iana_registry").count(), 1) self.assertEqual(DocEvent.objects.filter(doc=draft, type="rfc_in_iana_registry").count(), 1)
def test_changes_sync(self): def test_changes_sync(self):

View file

@ -12,6 +12,7 @@ from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.http import HttpResponse, HttpResponseRedirect, Http404 from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render from django.shortcuts import render
from django.utils import timezone
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from ietf.doc.models import DeletedEvent, StateDocEvent, DocEvent from ietf.doc.models import DeletedEvent, StateDocEvent, DocEvent
@ -118,12 +119,12 @@ def rfceditor_undo(request):
events = [] events = []
events.extend(StateDocEvent.objects.filter( events.extend(StateDocEvent.objects.filter(
state_type="draft-rfceditor", state_type="draft-rfceditor",
time__gte=datetime.datetime.now() - datetime.timedelta(weeks=1) time__gte=timezone.now() - datetime.timedelta(weeks=1)
).order_by("-time", "-id")) ).order_by("-time", "-id"))
events.extend(DocEvent.objects.filter( events.extend(DocEvent.objects.filter(
type="sync_from_rfc_editor", type="sync_from_rfc_editor",
time__gte=datetime.datetime.now() - datetime.timedelta(weeks=1) time__gte=timezone.now() - datetime.timedelta(weeks=1)
).order_by("-time", "-id")) ).order_by("-time", "-id"))
events.sort(key=lambda e: (e.time, e.id), reverse=True) events.sort(key=lambda e: (e.time, e.id), reverse=True)

View file

@ -10,6 +10,7 @@ from django.conf import settings
from django.contrib.auth import login from django.contrib.auth import login
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import render from django.shortcuts import render
from django.utils import timezone
from django.utils.encoding import force_bytes from django.utils.encoding import force_bytes
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -64,7 +65,7 @@ def require_api_key(f, request, *args, **kwargs):
person = key.person person = key.person
last_login = person.user.last_login last_login = person.user.last_login
if not person.user.is_staff: if not person.user.is_staff:
time_limit = (datetime.datetime.now() - datetime.timedelta(days=settings.UTILS_APIKEY_GUI_LOGIN_LIMIT_DAYS)) time_limit = (timezone.now() - datetime.timedelta(days=settings.UTILS_APIKEY_GUI_LOGIN_LIMIT_DAYS))
if last_login == None or last_login < time_limit: if last_login == None or last_login < time_limit:
return err(400, "Too long since last regular login") return err(400, "Too long since last regular login")
# Log in # Log in
@ -74,7 +75,7 @@ def require_api_key(f, request, *args, **kwargs):
person.user.save() person.user.save()
# Update stats # Update stats
key.count += 1 key.count += 1
key.latest = datetime.datetime.now() key.latest = timezone.now()
key.save() key.save()
PersonApiKeyEvent.objects.create(person=person, type='apikey_login', key=key, desc="Logged in with key ID %s, endpoint %s" % (key.id, key.endpoint)) PersonApiKeyEvent.objects.create(person=person, type='apikey_login', key=key, desc="Logged in with key ID %s, endpoint %s" % (key.id, key.endpoint))
# Execute decorated function # Execute decorated function

View file

@ -3,7 +3,6 @@
import copy import copy
import datetime
#import logging #import logging
import re import re
import smtplib import smtplib
@ -27,6 +26,7 @@ from django.core.exceptions import ImproperlyConfigured, ValidationError
from django.core.validators import validate_email from django.core.validators import validate_email
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.template import Context,RequestContext from django.template import Context,RequestContext
from django.utils import timezone
from django.utils.encoding import force_text, force_str, force_bytes from django.utils.encoding import force_text, force_str, force_bytes
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -324,7 +324,7 @@ def show_that_mail_was_sent(request,leadline,msg,bcc):
if request and request.user: if request and request.user:
from ietf.ietfauth.utils import has_role from ietf.ietfauth.utils import has_role
if has_role(request.user,['Area Director','Secretariat','IANA','RFC Editor','ISE','IAD','IRTF Chair','WG Chair','RG Chair','WG Secretary','RG Secretary']): if has_role(request.user,['Area Director','Secretariat','IANA','RFC Editor','ISE','IAD','IRTF Chair','WG Chair','RG Chair','WG Secretary','RG Secretary']):
info = "%s at %s %s\n" % (leadline,datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),settings.TIME_ZONE) info = "%s at %s %s\n" % (leadline,timezone.now().strftime("%Y-%m-%d %H:%M:%S"),settings.TIME_ZONE)
info += "Subject: %s\n" % force_text(msg.get('Subject','[no subject]')) info += "Subject: %s\n" % force_text(msg.get('Subject','[no subject]'))
info += "To: %s\n" % msg.get('To','[no to]') info += "To: %s\n" % msg.get('To','[no to]')
if msg.get('Cc'): if msg.get('Cc'):
@ -378,7 +378,7 @@ def send_mail_mime(request, to, frm, subject, msg, cc=None, extra=None, toUser=F
try: try:
send_smtp(msg, bcc) send_smtp(msg, bcc)
if save: if save:
message.sent = datetime.datetime.now() message.sent = timezone.now()
message.save() message.save()
if settings.SERVER_MODE != 'development': if settings.SERVER_MODE != 'development':
show_that_mail_was_sent(request,'Email was sent',msg,bcc) show_that_mail_was_sent(request,'Email was sent',msg,bcc)
@ -505,7 +505,7 @@ def send_mail_message(request, message, extra=None):
# msg = send_mail_text(request, message.to, message.frm, message.subject, # msg = send_mail_text(request, message.to, message.frm, message.subject,
# message.body, cc=message.cc, bcc=message.bcc, extra=e, save=False) # message.body, cc=message.cc, bcc=message.bcc, extra=e, save=False)
message.sent = datetime.datetime.now() message.sent = timezone.now()
message.save() message.save()
return msg return msg

View file

@ -13,6 +13,7 @@ import django
django.setup() django.setup()
from django.core.management.base import BaseCommand #, CommandError from django.core.management.base import BaseCommand #, CommandError
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -29,7 +30,7 @@ class Command(BaseCommand):
""" """
def add_arguments(self, parser): def add_arguments(self, parser):
default_start = datetime.datetime.now() - datetime.timedelta(days=60) default_start = timezone.now() - datetime.timedelta(days=60)
parser.add_argument( parser.add_argument(
'-d', '--from', type=str, default=default_start.strftime('%Y-%m-%d'), '-d', '--from', type=str, default=default_start.strftime('%Y-%m-%d'),
help='Limit the list to messages saved after the given date (default %(default)s).', help='Limit the list to messages saved after the given date (default %(default)s).',

View file

@ -10,6 +10,7 @@ from django.apps import apps
from django.conf import settings from django.conf import settings
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.db import models from django.db import models
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -53,7 +54,7 @@ class Command(BaseCommand):
def handle(self, *app_labels, **options): def handle(self, *app_labels, **options):
self.verbosity = options['verbosity'] self.verbosity = options['verbosity']
self.quiet = self.verbosity < 1 self.quiet = self.verbosity < 1
stop = datetime.datetime.now() stop = timezone.now()
start = stop - datetime.timedelta(days=14) start = stop - datetime.timedelta(days=14)
for name, appconf in apps.app_configs.items(): for name, appconf in apps.app_configs.items():

View file

@ -7,6 +7,7 @@ import time
from django.conf import settings from django.conf import settings
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from django.utils import timezone
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -65,7 +66,7 @@ class Command(BaseCommand):
delay = 1.0/options['rate'] delay = 1.0/options['rate']
# --minimum_interval # --minimum_interval
minimum_interval = options['minimum_interval'] minimum_interval = options['minimum_interval']
latest_previous = datetime.datetime.now() - datetime.timedelta(days=minimum_interval) latest_previous = timezone.now() - datetime.timedelta(days=minimum_interval)
# user # user
self.stdout.write('Querying the database for matching person records ...') self.stdout.write('Querying the database for matching person records ...')
if 'user' in options and options['user']: if 'user' in options and options['user']:

View file

@ -6,6 +6,7 @@ import datetime
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils import timezone
from django.utils.encoding import smart_text from django.utils.encoding import smart_text
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -271,14 +272,14 @@ def make_test_data():
# old draft # old draft
old_draft = Document.objects.create( old_draft = Document.objects.create(
name="draft-foo-mars-test", name="draft-foo-mars-test",
time=datetime.datetime.now() - datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), time=timezone.now() - datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE),
type_id="draft", type_id="draft",
title="Optimizing Martian Network Topologies", title="Optimizing Martian Network Topologies",
stream_id="ietf", stream_id="ietf",
abstract="Techniques for achieving near-optimal Martian networks.", abstract="Techniques for achieving near-optimal Martian networks.",
rev="00", rev="00",
pages=2, pages=2,
expires=datetime.datetime.now(), expires=timezone.now(),
) )
old_draft.set_state(State.objects.get(used=True, type="draft", slug="expired")) old_draft.set_state(State.objects.get(used=True, type="draft", slug="expired"))
old_alias = DocAlias.objects.create(name=old_draft.name) old_alias = DocAlias.objects.create(name=old_draft.name)
@ -287,7 +288,7 @@ def make_test_data():
# draft # draft
draft = Document.objects.create( draft = Document.objects.create(
name="draft-ietf-mars-test", name="draft-ietf-mars-test",
time=datetime.datetime.now(), time=timezone.now(),
type_id="draft", type_id="draft",
title="Optimizing Martian Network Topologies", title="Optimizing Martian Network Topologies",
stream_id="ietf", stream_id="ietf",
@ -298,7 +299,7 @@ def make_test_data():
intended_std_level_id="ps", intended_std_level_id="ps",
shepherd=email, shepherd=email,
ad=ad, ad=ad,
expires=datetime.datetime.now() + datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), expires=timezone.now() + datetime.timedelta(days=settings.INTERNET_DRAFT_DAYS_TO_EXPIRE),
notify="aliens@example.mars", notify="aliens@example.mars",
note="", note="",
) )
@ -458,7 +459,7 @@ def make_review_data(doc):
doc=doc, doc=doc,
team=team1, team=team1,
type_id="early", type_id="early",
deadline=datetime.datetime.now() + datetime.timedelta(days=20), deadline=timezone.now() + datetime.timedelta(days=20),
state_id="accepted", state_id="accepted",
requested_by=reviewer, requested_by=reviewer,
reviewer=email, reviewer=email,

View file

@ -43,7 +43,6 @@ import json
import pytz import pytz
import importlib import importlib
import socket import socket
import datetime
import gzip import gzip
import unittest import unittest
import pathlib import pathlib
@ -76,6 +75,7 @@ from django.core.management import call_command
from django.urls import URLResolver # type: ignore from django.urls import URLResolver # type: ignore
from django.template.backends.django import DjangoTemplates from django.template.backends.django import DjangoTemplates
from django.template.backends.django import Template # type: ignore[attr-defined] from django.template.backends.django import Template # type: ignore[attr-defined]
from django.utils import timezone
# from django.utils.safestring import mark_safe # from django.utils.safestring import mark_safe
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -570,7 +570,7 @@ class CoverageTest(unittest.TestCase):
checker.stop() checker.stop()
# Save to the .coverage file # Save to the .coverage file
checker.save() checker.save()
# Apply the configured and requested omit and include data # Apply the configured and requested omit and include data
checker.config.from_args(ignore_errors=None, omit=settings.TEST_CODE_COVERAGE_EXCLUDE_FILES, checker.config.from_args(ignore_errors=None, omit=settings.TEST_CODE_COVERAGE_EXCLUDE_FILES,
include=include, file=None) include=include, file=None)
for pattern in settings.TEST_CODE_COVERAGE_EXCLUDE_LINES: for pattern in settings.TEST_CODE_COVERAGE_EXCLUDE_LINES:
@ -739,7 +739,7 @@ class IetfTestRunner(DiscoverRunner):
print(" Datatracker %s test suite, %s:" % (ietf.__version__, time.strftime("%d %B %Y %H:%M:%S %Z"))) print(" Datatracker %s test suite, %s:" % (ietf.__version__, time.strftime("%d %B %Y %H:%M:%S %Z")))
print(" Python %s." % sys.version.replace('\n', ' ')) print(" Python %s." % sys.version.replace('\n', ' '))
print(" Django %s, settings '%s'" % (django.get_version(), settings.SETTINGS_MODULE)) print(" Django %s, settings '%s'" % (django.get_version(), settings.SETTINGS_MODULE))
settings.TEMPLATES[0]['BACKEND'] = 'ietf.utils.test_runner.ValidatingTemplates' settings.TEMPLATES[0]['BACKEND'] = 'ietf.utils.test_runner.ValidatingTemplates'
if self.check_coverage: if self.check_coverage:
if self.coverage_file.endswith('.gz'): if self.coverage_file.endswith('.gz'):
@ -749,19 +749,19 @@ class IetfTestRunner(DiscoverRunner):
with io.open(self.coverage_file, encoding='utf-8') as file: with io.open(self.coverage_file, encoding='utf-8') as file:
self.coverage_master = json.load(file) self.coverage_master = json.load(file)
self.coverage_data = { self.coverage_data = {
"time": datetime.datetime.now(pytz.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), "time": timezone.now().astimezone(pytz.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
"template": { "template": {
"coverage": 0.0, "coverage": 0.0,
"covered": {}, "covered": {},
"format": 1, # default format, coverage data in 'covered' are just fractions "format": 1, # default format, coverage data in 'covered' are just fractions
}, },
"url": { "url": {
"coverage": 0.0, "coverage": 0.0,
"covered": {}, "covered": {},
"format": 4, "format": 4,
}, },
"code": { "code": {
"coverage": 0.0, "coverage": 0.0,
"covered": {}, "covered": {},
"format": 1, "format": 1,
}, },
@ -808,8 +808,8 @@ class IetfTestRunner(DiscoverRunner):
for offset in range(10): for offset in range(10):
try: try:
# remember the value so ietf.utils.mail.send_smtp() will use the same # remember the value so ietf.utils.mail.send_smtp() will use the same
ietf.utils.mail.SMTP_ADDR['port'] = base + offset ietf.utils.mail.SMTP_ADDR['port'] = base + offset
self.smtpd_driver = SMTPTestServerDriver((ietf.utils.mail.SMTP_ADDR['ip4'],ietf.utils.mail.SMTP_ADDR['port']),None) self.smtpd_driver = SMTPTestServerDriver((ietf.utils.mail.SMTP_ADDR['ip4'],ietf.utils.mail.SMTP_ADDR['port']),None)
self.smtpd_driver.start() self.smtpd_driver.start()
print((" Running an SMTP test server on %(ip4)s:%(port)s to catch outgoing email." % ietf.utils.mail.SMTP_ADDR)) print((" Running an SMTP test server on %(ip4)s:%(port)s to catch outgoing email." % ietf.utils.mail.SMTP_ADDR))
break break

View file

@ -1,15 +1,16 @@
# Copyright The IETF Trust 2021, All Rights Reserved # Copyright The IETF Trust 2021, All Rights Reserved
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import datetime import datetime
import pytz
import requests import requests
import requests_mock import requests_mock
from pytz import timezone, utc
from unittest.mock import patch from unittest.mock import patch
from urllib.parse import urljoin from urllib.parse import urljoin
from django.conf import settings from django.conf import settings
from django.test import override_settings from django.test import override_settings
from django.utils import timezone
from ietf.utils.tests import TestCase from ietf.utils.tests import TestCase
from .meetecho import Conference, ConferenceManager, MeetechoAPI, MeetechoAPIError from .meetecho import Conference, ConferenceManager, MeetechoAPI, MeetechoAPIError
@ -92,7 +93,7 @@ class APITests(TestCase):
api = MeetechoAPI(API_BASE, CLIENT_ID, CLIENT_SECRET) api = MeetechoAPI(API_BASE, CLIENT_ID, CLIENT_SECRET)
api_response = api.schedule_meeting( api_response = api.schedule_meeting(
wg_token='my-token', wg_token='my-token',
start_time=utc.localize(datetime.datetime(2021, 9, 14, 10, 0, 0)), start_time=pytz.utc.localize(datetime.datetime(2021, 9, 14, 10, 0, 0)),
duration=datetime.timedelta(minutes=130), duration=datetime.timedelta(minutes=130),
description='interim-2021-wgname-01', description='interim-2021-wgname-01',
extrainfo='message for staff', extrainfo='message for staff',
@ -120,11 +121,11 @@ class APITests(TestCase):
) )
# same time in different time zones # same time in different time zones
for start_time in [ for start_time in [
utc.localize(datetime.datetime(2021, 9, 14, 10, 0, 0)), pytz.utc.localize(datetime.datetime(2021, 9, 14, 10, 0, 0)),
timezone('america/halifax').localize(datetime.datetime(2021, 9, 14, 7, 0, 0)), pytz.timezone('america/halifax').localize(datetime.datetime(2021, 9, 14, 7, 0, 0)),
timezone('europe/kiev').localize(datetime.datetime(2021, 9, 14, 13, 0, 0)), pytz.timezone('europe/kiev').localize(datetime.datetime(2021, 9, 14, 13, 0, 0)),
timezone('pacific/easter').localize(datetime.datetime(2021, 9, 14, 5, 0, 0)), pytz.timezone('pacific/easter').localize(datetime.datetime(2021, 9, 14, 5, 0, 0)),
timezone('africa/porto-novo').localize(datetime.datetime(2021, 9, 14, 11, 0, 0)), pytz.timezone('africa/porto-novo').localize(datetime.datetime(2021, 9, 14, 11, 0, 0)),
]: ]:
self.assertEqual( self.assertEqual(
api_response, api_response,
@ -191,7 +192,7 @@ class APITests(TestCase):
'3d55bce0-535e-4ba8-bb8e-734911cf3c32': { '3d55bce0-535e-4ba8-bb8e-734911cf3c32': {
'room': { 'room': {
'id': 18, 'id': 18,
'start_time': utc.localize(datetime.datetime(2021, 9, 14, 10, 0, 0)), 'start_time': pytz.utc.localize(datetime.datetime(2021, 9, 14, 10, 0, 0)),
'duration': datetime.timedelta(minutes=130), 'duration': datetime.timedelta(minutes=130),
'description': 'interim-2021-wgname-01', 'description': 'interim-2021-wgname-01',
}, },
@ -201,7 +202,7 @@ class APITests(TestCase):
'e68e96d4-d38f-475b-9073-ecab46ca96a5': { 'e68e96d4-d38f-475b-9073-ecab46ca96a5': {
'room': { 'room': {
'id': 23, 'id': 23,
'start_time': utc.localize(datetime.datetime(2021, 9, 15, 14, 30, 0)), 'start_time': pytz.utc.localize(datetime.datetime(2021, 9, 15, 14, 30, 0)),
'duration': datetime.timedelta(minutes=30), 'duration': datetime.timedelta(minutes=30),
'description': 'interim-2021-wgname-02', 'description': 'interim-2021-wgname-02',
}, },
@ -249,7 +250,7 @@ class APITests(TestCase):
def test_time_serialization(self): def test_time_serialization(self):
"""Time de/serialization should be consistent""" """Time de/serialization should be consistent"""
time = datetime.datetime.now(utc).replace(microsecond=0) # cut off to 0 microseconds time = timezone.now().astimezone(pytz.utc).replace(microsecond=0) # cut off to 0 microseconds
api = MeetechoAPI(API_BASE, CLIENT_ID, CLIENT_SECRET) api = MeetechoAPI(API_BASE, CLIENT_ID, CLIENT_SECRET)
self.assertEqual(api._deserialize_time(api._serialize_time(time)), time) self.assertEqual(api._deserialize_time(api._serialize_time(time)), time)
@ -263,7 +264,7 @@ class ConferenceManagerTests(TestCase):
'session-1-uuid': { 'session-1-uuid': {
'room': { 'room': {
'id': 1, 'id': 1,
'start_time': utc.localize(datetime.datetime(2022,2,4,1,2,3)), 'start_time': pytz.utc.localize(datetime.datetime(2022,2,4,1,2,3)),
'duration': datetime.timedelta(minutes=45), 'duration': datetime.timedelta(minutes=45),
'description': 'some-description', 'description': 'some-description',
}, },
@ -273,7 +274,7 @@ class ConferenceManagerTests(TestCase):
'session-2-uuid': { 'session-2-uuid': {
'room': { 'room': {
'id': 2, 'id': 2,
'start_time': utc.localize(datetime.datetime(2022,2,5,4,5,6)), 'start_time': pytz.utc.localize(datetime.datetime(2022,2,5,4,5,6)),
'duration': datetime.timedelta(minutes=90), 'duration': datetime.timedelta(minutes=90),
'description': 'another-description', 'description': 'another-description',
}, },
@ -290,7 +291,7 @@ class ConferenceManagerTests(TestCase):
id=1, id=1,
public_id='session-1-uuid', public_id='session-1-uuid',
description='some-description', description='some-description',
start_time=utc.localize(datetime.datetime(2022, 2, 4, 1, 2, 3)), start_time=pytz.utc.localize(datetime.datetime(2022, 2, 4, 1, 2, 3)),
duration=datetime.timedelta(minutes=45), duration=datetime.timedelta(minutes=45),
url='https://example.com/some/url', url='https://example.com/some/url',
deletion_token='delete-me', deletion_token='delete-me',
@ -300,7 +301,7 @@ class ConferenceManagerTests(TestCase):
id=2, id=2,
public_id='session-2-uuid', public_id='session-2-uuid',
description='another-description', description='another-description',
start_time=utc.localize(datetime.datetime(2022, 2, 5, 4, 5, 6)), start_time=pytz.utc.localize(datetime.datetime(2022, 2, 5, 4, 5, 6)),
duration=datetime.timedelta(minutes=90), duration=datetime.timedelta(minutes=90),
url='https://example.com/another/url', url='https://example.com/another/url',
deletion_token='delete-me-too', deletion_token='delete-me-too',
@ -316,7 +317,7 @@ class ConferenceManagerTests(TestCase):
'session-1-uuid': { 'session-1-uuid': {
'room': { 'room': {
'id': 1, 'id': 1,
'start_time': utc.localize(datetime.datetime(2022,2,4,1,2,3)), 'start_time': pytz.utc.localize(datetime.datetime(2022,2,4,1,2,3)),
'duration': datetime.timedelta(minutes=45), 'duration': datetime.timedelta(minutes=45),
'description': 'some-description', 'description': 'some-description',
}, },
@ -335,7 +336,7 @@ class ConferenceManagerTests(TestCase):
id=1, id=1,
public_id='session-1-uuid', public_id='session-1-uuid',
description='some-description', description='some-description',
start_time=utc.localize(datetime.datetime(2022,2,4,1,2,3)), start_time=pytz.utc.localize(datetime.datetime(2022,2,4,1,2,3)),
duration=datetime.timedelta(minutes=45), duration=datetime.timedelta(minutes=45),
url='https://example.com/some/url', url='https://example.com/some/url',
deletion_token='delete-me', deletion_token='delete-me',
@ -351,7 +352,7 @@ class ConferenceManagerTests(TestCase):
'session-1-uuid': { 'session-1-uuid': {
'room': { 'room': {
'id': 1, 'id': 1,
'start_time': utc.localize(datetime.datetime(2022,2,4,1,2,3)), 'start_time': pytz.utc.localize(datetime.datetime(2022,2,4,1,2,3)),
'duration': datetime.timedelta(minutes=45), 'duration': datetime.timedelta(minutes=45),
'description': 'some-description', 'description': 'some-description',
}, },
@ -369,7 +370,7 @@ class ConferenceManagerTests(TestCase):
id=1, id=1,
public_id='session-1-uuid', public_id='session-1-uuid',
description='some-description', description='some-description',
start_time=utc.localize(datetime.datetime(2022,2,4,1,2,3)), start_time=pytz.utc.localize(datetime.datetime(2022,2,4,1,2,3)),
duration=datetime.timedelta(minutes=45), duration=datetime.timedelta(minutes=45),
url='https://example.com/some/url', url='https://example.com/some/url',
deletion_token='delete-me', deletion_token='delete-me',