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:
parent
a94a87f336
commit
ebebdbed3e
|
@ -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:
|
||||||
|
|
|
@ -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":
|
||||||
|
|
|
@ -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')
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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 = ''
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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')
|
||||||
|
|
||||||
|
|
39
ietf/doc/migrations/0045_use_timezone_now_for_doc_models.py
Normal file
39
ietf/doc/migrations/0045_use_timezone_now_for_doc_models.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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)
|
||||||
|
|
|
@ -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 <15 days."><i class="bi bi-clock-fill"></i> 16</span>'
|
'<span class="badge bg-danger" title="In state for 16 days; goal is <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 <15 days."><i class="bi bi-clock-fill"></i> 30</span>'
|
'<span class="badge bg-danger" title="In state for 30 days; goal is <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 <%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 <%d days."><i class="bi bi-clock-fill"></i> %d</span>'
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 })
|
||||||
|
|
|
@ -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 = {}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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']
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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 ]
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
})
|
})
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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():
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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():
|
||||||
|
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -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).',
|
||||||
|
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
)
|
)
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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))
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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])
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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"])
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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).',
|
||||||
|
|
|
@ -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():
|
||||||
|
|
|
@ -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']:
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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',
|
||||||
|
|
Loading…
Reference in a new issue