fix: handle timezones in a bunch of places
This commit is contained in:
parent
2e3686b08e
commit
56505147e0
|
@ -162,7 +162,7 @@ def get_first_commit(path):
|
|||
else:
|
||||
pass
|
||||
except OSError:
|
||||
rev, who, when = None, None, datetime.datetime.now()
|
||||
rev, who, when = None, None, datetime.datetime.now(datetime.timezone.utc)
|
||||
return { path: { 'rev': rev, 'who': who, 'date': when.strftime('%Y-%m-%d %H:%M:%S'), }, }
|
||||
|
||||
|
||||
|
|
|
@ -26,8 +26,9 @@ from ietf.review.utils import (
|
|||
send_unavailability_period_ending_reminder, send_reminder_all_open_reviews,
|
||||
send_review_reminder_overdue_assignment, send_reminder_unconfirmed_assignments)
|
||||
from ietf.utils.log import log
|
||||
from ietf.utils.timezone import date_today, DEADLINE_TZINFO
|
||||
|
||||
today = datetime.date.today()
|
||||
today = date_today(DEADLINE_TZINFO)
|
||||
|
||||
for assignment in review_assignments_needing_reviewer_reminder(today):
|
||||
email_reviewer_reminder(assignment)
|
||||
|
|
|
@ -18,7 +18,7 @@ from ietf.person.models import Person
|
|||
from ietf.meeting.models import Meeting
|
||||
from ietf.doc.utils import add_state_change_event, update_action_holders
|
||||
from ietf.mailtrigger.utils import gather_address_lists
|
||||
from ietf.utils.timezone import datetime_today, DEADLINE_TZINFO
|
||||
from ietf.utils.timezone import date_today, datetime_today, DEADLINE_TZINFO
|
||||
|
||||
|
||||
nonexpirable_states: Optional[List[State]] = None
|
||||
|
@ -173,7 +173,7 @@ def expire_draft(doc):
|
|||
|
||||
def clean_up_draft_files():
|
||||
"""Move unidentified and old files out of the Internet Draft directory."""
|
||||
cut_off = datetime.date.today()
|
||||
cut_off = date_today()
|
||||
|
||||
pattern = os.path.join(settings.INTERNET_DRAFT_PATH, "draft-*.*")
|
||||
filename_re = re.compile(r'^(.*)-(\d\d)$')
|
||||
|
|
|
@ -15,6 +15,7 @@ from ietf.person.fields import SearchablePersonField, SearchablePersonsField
|
|||
from ietf.person.models import Email, Person
|
||||
|
||||
from ietf.name.models import ExtResourceName
|
||||
from ietf.utils.timezone import date_today
|
||||
from ietf.utils.validators import validate_external_resource_value
|
||||
|
||||
class TelechatForm(forms.Form):
|
||||
|
@ -34,7 +35,7 @@ class TelechatForm(forms.Form):
|
|||
for d in dates:
|
||||
self.page_count[d] = telechat_page_count(date=d).for_approval
|
||||
choice_display[d] = '%s (%s pages)' % (d.strftime("%Y-%m-%d"),self.page_count[d])
|
||||
if d-datetime.date.today() < datetime.timedelta(days=13):
|
||||
if d - date_today() < datetime.timedelta(days=13):
|
||||
choice_display[d] += ' : WARNING - this may not leave enough time for directorate reviews!'
|
||||
self.fields['telechat_date'].choices = [("", "(not on agenda)")] + [(d, choice_display[d]) for d in dates]
|
||||
|
||||
|
|
|
@ -10,6 +10,8 @@ from ietf.person.models import Person
|
|||
from ietf.doc.utils import add_state_change_event, update_action_holders
|
||||
from ietf.doc.mails import generate_ballot_writeup, generate_approval_mail, generate_last_call_announcement
|
||||
from ietf.doc.mails import send_last_call_request, email_last_call_expired, email_last_call_expired_with_downref
|
||||
from ietf.utils.timezone import date_today, DEADLINE_TZINFO
|
||||
|
||||
|
||||
def request_last_call(request, doc):
|
||||
if not doc.latest_event(type="changed_ballot_writeup_text"):
|
||||
|
@ -33,7 +35,7 @@ def request_last_call(request, doc):
|
|||
e.save()
|
||||
|
||||
def get_expired_last_calls():
|
||||
today = datetime.date.today()
|
||||
today = date_today(DEADLINE_TZINFO)
|
||||
for d in Document.objects.filter(Q(states__type="draft-iesg", states__slug="lc")
|
||||
| Q(states__type="statchg", states__slug="in-lc")):
|
||||
e = d.latest_event(LastCallDocEvent, type="sent_last_call")
|
||||
|
|
|
@ -25,6 +25,7 @@ from ietf.doc.utils_bofreq import bofreq_editors, bofreq_responsible
|
|||
from ietf.group.models import Role
|
||||
from ietf.doc.models import Document
|
||||
from ietf.mailtrigger.utils import gather_address_lists
|
||||
from ietf.utils.timezone import date_today, DEADLINE_TZINFO
|
||||
|
||||
|
||||
def email_state_changed(request, doc, text, mailtrigger_id=None):
|
||||
|
@ -192,7 +193,7 @@ def generate_ballot_rfceditornote(request, doc):
|
|||
return e
|
||||
|
||||
def generate_last_call_announcement(request, doc):
|
||||
expiration_date = datetime.date.today() + datetime.timedelta(days=14)
|
||||
expiration_date = date_today(DEADLINE_TZINFO) + datetime.timedelta(days=14)
|
||||
if doc.group.type_id in ("individ", "area"):
|
||||
group = "an individual submitter"
|
||||
expiration_date += datetime.timedelta(days=14)
|
||||
|
|
|
@ -36,7 +36,7 @@ from ietf.utils.decorators import memoize
|
|||
from ietf.utils.validators import validate_no_control_chars
|
||||
from ietf.utils.mail import formataddr
|
||||
from ietf.utils.models import ForeignKey
|
||||
from ietf.utils.timezone import RPC_TZINFO
|
||||
from ietf.utils.timezone import date_today, RPC_TZINFO
|
||||
if TYPE_CHECKING:
|
||||
# importing other than for type checking causes errors due to cyclic imports
|
||||
from ietf.meeting.models import ProceedingsMaterial, Session
|
||||
|
@ -831,16 +831,20 @@ class Document(DocumentInfo):
|
|||
def telechat_date(self, e=None):
|
||||
if not e:
|
||||
e = self.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
||||
return e.telechat_date if e and e.telechat_date and e.telechat_date >= datetime.date.today() else None
|
||||
return e.telechat_date if e and e.telechat_date and e.telechat_date >= date_today(settings.TIME_ZONE) else None
|
||||
|
||||
def past_telechat_date(self):
|
||||
"Return the latest telechat date if it isn't in the future; else None"
|
||||
e = self.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
||||
return e.telechat_date if e and e.telechat_date and e.telechat_date < datetime.date.today() else None
|
||||
return e.telechat_date if e and e.telechat_date and e.telechat_date < date_today(settings.TIME_ZONE) else None
|
||||
|
||||
def previous_telechat_date(self):
|
||||
"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=timezone.now())
|
||||
e = self.latest_event(
|
||||
TelechatDocEvent,
|
||||
type="scheduled_for_telechat",
|
||||
telechat_date__lt=date_today(settings.TIME_ZONE),
|
||||
)
|
||||
return e.telechat_date if e else None
|
||||
|
||||
def request_closed_time(self, review_req):
|
||||
|
@ -906,8 +910,14 @@ class Document(DocumentInfo):
|
|||
def future_presentations(self):
|
||||
""" returns related SessionPresentation objects for meetings that
|
||||
have not yet ended. This implementation allows for 2 week meetings """
|
||||
candidate_presentations = self.sessionpresentation_set.filter(session__meeting__date__gte=datetime.date.today()-datetime.timedelta(days=15))
|
||||
return sorted([pres for pres in candidate_presentations if pres.session.meeting.end_date()>=datetime.date.today()], key=lambda x:x.session.meeting.date)
|
||||
candidate_presentations = self.sessionpresentation_set.filter(
|
||||
session__meeting__date__gte=date_today() - datetime.timedelta(days=15)
|
||||
)
|
||||
return sorted(
|
||||
[pres for pres in candidate_presentations
|
||||
if pres.session.meeting.end_date() >= date_today()],
|
||||
key=lambda x:x.session.meeting.date,
|
||||
)
|
||||
|
||||
def last_presented(self):
|
||||
""" returns related SessionPresentation objects for the most recent meeting in the past"""
|
||||
|
|
|
@ -38,6 +38,7 @@ import debug # pyflakes:ignore
|
|||
from django import template
|
||||
from django.urls import reverse as urlreverse
|
||||
from django.db.models import Q
|
||||
from django.utils import timezone
|
||||
from django.utils.safestring import mark_safe
|
||||
|
||||
from ietf.ietfauth.utils import user_is_person, has_role
|
||||
|
@ -173,17 +174,17 @@ def state_age_colored(doc):
|
|||
if iesg_state in ["dead", "watching", "pub", "idexists"]:
|
||||
return ""
|
||||
try:
|
||||
state_date = (
|
||||
state_datetime = (
|
||||
doc.docevent_set.filter(
|
||||
Q(type="started_iesg_process")
|
||||
| Q(type="changed_state", statedocevent__state_type="draft-iesg")
|
||||
)
|
||||
.order_by("-time")[0]
|
||||
.time.date()
|
||||
.time
|
||||
)
|
||||
except IndexError:
|
||||
state_date = datetime.date(1990, 1, 1)
|
||||
days = (datetime.date.today() - state_date).days
|
||||
state_datetime = datetime.datetime(1990, 1, 1, tzinfo=datetime.timezone.utc)
|
||||
days = (timezone.now() - state_datetime).days
|
||||
# loosely based on
|
||||
# https://trac.ietf.org/trac/iesg/wiki/PublishPath
|
||||
if iesg_state == "lc":
|
||||
|
|
|
@ -2226,7 +2226,7 @@ class DocumentMeetingTests(TestCase):
|
|||
self.other_chair = PersonFactory()
|
||||
self.other_group.role_set.create(name_id='chair',person=self.other_chair,email=self.other_chair.email())
|
||||
|
||||
today = datetime.date.today()
|
||||
today = datetime_today()
|
||||
cut_days = settings.MEETING_MATERIALS_DEFAULT_SUBMISSION_CORRECTION_DAYS
|
||||
self.past_cutoff = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=1+cut_days))
|
||||
self.past = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=cut_days/2))
|
||||
|
|
|
@ -640,7 +640,7 @@ class ExpireIDsTests(DraftFileMixin, TestCase):
|
|||
|
||||
meeting = Meeting.objects.create(number="123",
|
||||
type=MeetingTypeName.objects.get(slug="ietf"),
|
||||
date=datetime.date.today())
|
||||
date=date_today())
|
||||
second_cut_off = meeting.get_second_cut_off()
|
||||
ietf_monday = meeting.get_ietf_monday()
|
||||
|
||||
|
|
|
@ -324,7 +324,7 @@ class BaseManipulationTests():
|
|||
def test_issue_ballot(self):
|
||||
draft = RgDraftFactory()
|
||||
url = urlreverse('ietf.doc.views_ballot.issue_irsg_ballot',kwargs=dict(name=draft.name))
|
||||
due = datetime.date.today()+datetime.timedelta(days=14)
|
||||
due = datetime_today(DEADLINE_TZINFO)+datetime.timedelta(days=14)
|
||||
empty_outbox()
|
||||
|
||||
login_testing_unauthorized(self, self.username , url)
|
||||
|
@ -445,7 +445,7 @@ class IRSGMemberTests(TestCase):
|
|||
|
||||
def test_cant_issue_irsg_ballot(self):
|
||||
draft = RgDraftFactory()
|
||||
due = datetime.date.today()+datetime.timedelta(days=14)
|
||||
due = datetime_today(DEADLINE_TZINFO) + datetime.timedelta(days=14)
|
||||
url = urlreverse('ietf.doc.views_ballot.close_irsg_ballot', kwargs=dict(name=draft.name))
|
||||
|
||||
self.client.login(username = self.username, password = self.username+'+password')
|
||||
|
|
|
@ -38,7 +38,7 @@ from ietf.utils.mail import outbox, empty_outbox, parseaddr, on_behalf_of, get_p
|
|||
from ietf.utils.test_utils import login_testing_unauthorized, reload_db_objects
|
||||
from ietf.utils.test_utils import TestCase
|
||||
from ietf.utils.text import strip_prefix, xslugify
|
||||
from ietf.utils.timezone import DEADLINE_TZINFO
|
||||
from ietf.utils.timezone import date_today, DEADLINE_TZINFO
|
||||
from django.utils.html import escape
|
||||
|
||||
class ReviewTests(TestCase):
|
||||
|
@ -78,7 +78,7 @@ class ReviewTests(TestCase):
|
|||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
|
||||
deadline = datetime.date.today() + datetime.timedelta(days=10)
|
||||
deadline = date_today() + datetime.timedelta(days=10)
|
||||
|
||||
empty_outbox()
|
||||
|
||||
|
@ -268,7 +268,7 @@ class ReviewTests(TestCase):
|
|||
team=review_req.team,
|
||||
state_id='assigned',
|
||||
requested_rev="01",
|
||||
deadline=datetime.date.today() - datetime.timedelta(days=80),
|
||||
deadline=date_today() - datetime.timedelta(days=80),
|
||||
)
|
||||
ReviewAssignmentFactory(
|
||||
review_request = req,
|
||||
|
@ -526,7 +526,7 @@ class ReviewTests(TestCase):
|
|||
messages = r.json()["messages"]
|
||||
self.assertEqual(len(messages), 2)
|
||||
|
||||
today = datetime.date.today()
|
||||
today = date_today()
|
||||
|
||||
self.assertEqual(messages[0]["url"], "https://www.example.com/testmessage")
|
||||
self.assertTrue("John Doe" in messages[0]["content"])
|
||||
|
|
|
@ -25,6 +25,8 @@ from ietf.utils.mail import parse_preformatted
|
|||
from ietf.mailtrigger.utils import gather_address_lists
|
||||
from ietf.utils.log import log
|
||||
from ietf.group.utils import save_group_in_history
|
||||
from ietf.utils.timezone import date_today
|
||||
|
||||
|
||||
def charter_name_for_group(group):
|
||||
if group.type_id == "rg":
|
||||
|
@ -216,7 +218,7 @@ def default_review_text(group, charter, by):
|
|||
parent_ads=group.parent.role_set.filter(name='ad'),
|
||||
techadv=group.role_set.filter(name="techadv"),
|
||||
milestones=group.groupmilestone_set.filter(state="charter"),
|
||||
review_date=(datetime.date.today() + datetime.timedelta(weeks=1)).isoformat(),
|
||||
review_date=(date_today() + datetime.timedelta(weeks=1)).isoformat(),
|
||||
review_type="new" if group.state_id in ["proposed","bof"] else "recharter",
|
||||
to=addrs.to,
|
||||
cc=addrs.cc,
|
||||
|
|
|
@ -1084,7 +1084,7 @@ def make_last_call(request, name):
|
|||
return HttpResponseRedirect(doc.get_absolute_url())
|
||||
else:
|
||||
initial = {}
|
||||
initial["last_call_sent_date"] = datetime.date.today()
|
||||
initial["last_call_sent_date"] = date_today()
|
||||
if doc.type.slug == 'draft':
|
||||
# This logic is repeated in the code that edits last call text - why?
|
||||
expire_days = 14
|
||||
|
@ -1095,7 +1095,7 @@ def make_last_call(request, name):
|
|||
expire_days=28
|
||||
templ = 'doc/status_change/make_last_call.html'
|
||||
|
||||
initial["last_call_expiration_date"] = datetime.date.today() + datetime.timedelta(days=expire_days)
|
||||
initial["last_call_expiration_date"] = date_today() + datetime.timedelta(days=expire_days)
|
||||
|
||||
form = MakeLastCallForm(initial=initial)
|
||||
|
||||
|
@ -1192,7 +1192,10 @@ def irsg_ballot_status(request):
|
|||
ballot = doc.active_ballot()
|
||||
if ballot:
|
||||
doc.ballot = ballot
|
||||
doc.duedate=datetime.datetime.strftime(ballot.irsgballotdocevent.duedate, '%Y-%m-%d')
|
||||
doc.duedate=datetime.datetime.strftime(
|
||||
ballot.irsgballotdocevent.duedate.astimezone(DEADLINE_TZINFO),
|
||||
'%Y-%m-%d',
|
||||
)
|
||||
|
||||
docs.append(doc)
|
||||
|
||||
|
|
|
@ -84,6 +84,7 @@ from ietf.utils import markup_txt, log, markdown
|
|||
from ietf.utils.draft import PlaintextDraft
|
||||
from ietf.utils.response import permission_denied
|
||||
from ietf.utils.text import maybe_split
|
||||
from ietf.utils.timezone import date_today
|
||||
|
||||
|
||||
def render_document_top(request, doc, tab, name):
|
||||
|
@ -185,7 +186,7 @@ def document_main(request, name, rev=None):
|
|||
|
||||
|
||||
telechat = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
||||
if telechat and (not telechat.telechat_date or telechat.telechat_date < datetime.date.today()):
|
||||
if telechat and (not telechat.telechat_date or telechat.telechat_date < date_today(settings.TIME_ZONE)):
|
||||
telechat = None
|
||||
|
||||
|
||||
|
@ -1386,11 +1387,12 @@ def telechat_date(request, name):
|
|||
|
||||
warnings = []
|
||||
if e and e.telechat_date and doc.type.slug != 'charter':
|
||||
if e.telechat_date==datetime.date.today():
|
||||
today = date_today(settings.TIME_ZONE)
|
||||
if e.telechat_date == today:
|
||||
warnings.append( "This document is currently scheduled for today's telechat. "
|
||||
+"Please set the returning item bit carefully.")
|
||||
|
||||
elif e.telechat_date<datetime.date.today() and has_same_ballot(doc,e.telechat_date):
|
||||
elif e.telechat_date < today and has_same_ballot(doc,e.telechat_date):
|
||||
initial_returning_item = True
|
||||
warnings.append( "This document appears to have been on a previous telechat with the same ballot, "
|
||||
+"so the returning item bit has been set. Clear it if that is not appropriate.")
|
||||
|
|
|
@ -54,7 +54,7 @@ from ietf.utils.mail import send_mail_message
|
|||
from ietf.mailtrigger.utils import gather_address_lists
|
||||
from ietf.utils.fields import MultiEmailField
|
||||
from ietf.utils.response import permission_denied
|
||||
from ietf.utils.timezone import DEADLINE_TZINFO
|
||||
from ietf.utils.timezone import date_today, DEADLINE_TZINFO
|
||||
|
||||
|
||||
def clean_doc_revision(doc, rev):
|
||||
|
@ -96,7 +96,7 @@ class RequestReviewForm(forms.ModelForm):
|
|||
|
||||
def clean_deadline(self):
|
||||
v = self.cleaned_data.get('deadline')
|
||||
if v < datetime.date.today():
|
||||
if v < date_today(DEADLINE_TZINFO):
|
||||
raise forms.ValidationError("Select today or a date in the future.")
|
||||
return v
|
||||
|
||||
|
@ -352,7 +352,7 @@ class RejectReviewerAssignmentForm(forms.Form):
|
|||
def reject_reviewer_assignment(request, name, assignment_id):
|
||||
doc = get_object_or_404(Document, name=name)
|
||||
review_assignment = get_object_or_404(ReviewAssignment, pk=assignment_id, state__in=["assigned", "accepted"])
|
||||
review_request_past_deadline = review_assignment.review_request.deadline < datetime.date.today()
|
||||
review_request_past_deadline = review_assignment.review_request.deadline < date_today(DEADLINE_TZINFO)
|
||||
|
||||
if not review_assignment.reviewer:
|
||||
return redirect(review_request, name=review_assignment.review_request.doc.name, request_id=review_assignment.review_request.pk)
|
||||
|
@ -727,7 +727,7 @@ def complete_review(request, name, assignment_id=None, acronym=None):
|
|||
type=form.cleaned_data['review_type'],
|
||||
doc=doc,
|
||||
team=team,
|
||||
deadline=datetime.date.today(),
|
||||
deadline=date_today(DEADLINE_TZINFO),
|
||||
requested_by=Person.objects.get(user=request.user),
|
||||
requested_rev=form.cleaned_data['reviewed_rev'],
|
||||
)
|
||||
|
@ -786,7 +786,7 @@ def complete_review(request, name, assignment_id=None, acronym=None):
|
|||
|
||||
need_to_email_review = review_submission != "link" and assignment.review_request.team.list_email and not revising_review
|
||||
|
||||
submitted_on_different_date = completion_datetime.date() != datetime.date.today()
|
||||
submitted_on_different_date = completion_datetime.date() != date_today(DEADLINE_TZINFO)
|
||||
desc = "Request for {} review by {} {}: {}. Reviewer: {}.".format(
|
||||
assignment.review_request.type.name,
|
||||
assignment.review_request.team.acronym.upper(),
|
||||
|
@ -902,8 +902,13 @@ def complete_review(request, name, assignment_id=None, acronym=None):
|
|||
}
|
||||
|
||||
try:
|
||||
initial['review_content'] = render_to_string('/group/%s/review/content_templates/%s.txt' % (assignment.review_request.team.acronym,
|
||||
request_type.slug), {'assignment':assignment, 'today':datetime.date.today()})
|
||||
initial['review_content'] = render_to_string(
|
||||
f'/group/{assignment.review_request.team.acronym}/review/content_templates/{request_type.slug}.txt',
|
||||
{
|
||||
'assignment': assignment,
|
||||
'today': date_today(settings.TIME_ZONE),
|
||||
},
|
||||
)
|
||||
except (TemplateDoesNotExist, AttributeError):
|
||||
pass
|
||||
|
||||
|
@ -992,7 +997,7 @@ class EditReviewRequestDeadlineForm(forms.ModelForm):
|
|||
|
||||
def clean_deadline(self):
|
||||
v = self.cleaned_data.get('deadline')
|
||||
if v < datetime.date.today():
|
||||
if v < date_today(DEADLINE_TZINFO):
|
||||
raise forms.ValidationError("Select today or a date in the future.")
|
||||
return v
|
||||
|
||||
|
|
|
@ -19,6 +19,8 @@ from ietf.doc.utils import get_search_cache_key
|
|||
from ietf.doc.views_search import SearchForm, retrieve_search_results
|
||||
from ietf.name.models import DocTypeName
|
||||
from ietf.person.models import Person
|
||||
from ietf.utils.timezone import date_today
|
||||
|
||||
|
||||
epochday = datetime.datetime.utcfromtimestamp(0).date().toordinal()
|
||||
|
||||
|
@ -47,7 +49,7 @@ def model_to_timeline_data(model, field='time', **kwargs):
|
|||
# This is needed for sqlite, when we're running tests:
|
||||
if type(obj_list[0]['date']) != datetime.date:
|
||||
obj_list = [ {'date': dt(e['date']), 'count': e['count']} for e in obj_list ]
|
||||
today = datetime.date.today()
|
||||
today = date_today()
|
||||
if not obj_list[-1]['date'] == today:
|
||||
obj_list += [ {'date': today, 'count': 0} ]
|
||||
data = [ ((e['date'].toordinal()-epochday)*1000*60*60*24, e['count']) for e in obj_list ]
|
||||
|
|
|
@ -35,6 +35,7 @@ from ietf.name.models import DocRelationshipName, StdLevelName
|
|||
from ietf.person.models import Person
|
||||
from ietf.utils.mail import send_mail_preformatted
|
||||
from ietf.utils.textupload import get_cleaned_text_file_content
|
||||
from ietf.utils.timezone import date_today, DEADLINE_TZINFO
|
||||
|
||||
|
||||
class ChangeStateForm(forms.Form):
|
||||
|
@ -638,7 +639,7 @@ def generate_last_call_text(request, doc):
|
|||
# and when groups are set, vary the expiration time accordingly
|
||||
|
||||
requester = "an individual participant"
|
||||
expiration_date = datetime.date.today() + datetime.timedelta(days=28)
|
||||
expiration_date = date_today(DEADLINE_TZINFO) + datetime.timedelta(days=28)
|
||||
cc = []
|
||||
|
||||
new_text = render_to_string("doc/status_change/last_call_announcement.txt",
|
||||
|
|
|
@ -27,6 +27,7 @@ from ietf.utils import log
|
|||
from ietf.utils.textupload import get_cleaned_text_file_content
|
||||
#from ietf.utils.ordereddict import insert_after_in_ordered_dict
|
||||
from ietf.utils.fields import DatepickerDateField, MultiEmailField
|
||||
from ietf.utils.timezone import date_today
|
||||
from ietf.utils.validators import validate_external_resource_value
|
||||
|
||||
# --- Constants --------------------------------------------------------
|
||||
|
@ -364,7 +365,7 @@ class AddUnavailablePeriodForm(forms.ModelForm):
|
|||
def __init__(self, *args, **kwargs):
|
||||
super(AddUnavailablePeriodForm, self).__init__(*args, **kwargs)
|
||||
|
||||
self.fields["start_date"] = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={"autoclose": "1" }, label=self.fields["start_date"].label, help_text=self.fields["start_date"].help_text, required=self.fields["start_date"].required, initial=datetime.date.today())
|
||||
self.fields["start_date"] = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={"autoclose": "1" }, label=self.fields["start_date"].label, help_text=self.fields["start_date"].help_text, required=self.fields["start_date"].required, initial=date_today())
|
||||
self.fields["end_date"] = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={"autoclose": "1" }, label=self.fields["end_date"].label, help_text=self.fields["end_date"].help_text, required=self.fields["end_date"].required)
|
||||
|
||||
self.fields['availability'].widget = forms.RadioSelect(choices=UnavailablePeriod.LONG_AVAILABILITY_CHOICES)
|
||||
|
|
|
@ -42,6 +42,8 @@ from ietf.person.factories import PersonFactory, EmailFactory
|
|||
from ietf.review.factories import ReviewRequestFactory, ReviewAssignmentFactory
|
||||
from ietf.utils.mail import outbox, empty_outbox, get_payload_text
|
||||
from ietf.utils.test_utils import login_testing_unauthorized, TestCase, unicontent, reload_db_objects
|
||||
from ietf.utils.timezone import date_today, DEADLINE_TZINFO
|
||||
|
||||
|
||||
def group_urlreverse_list(group, viewname):
|
||||
return [
|
||||
|
@ -269,7 +271,7 @@ class GroupPagesTests(TestCase):
|
|||
group=group,
|
||||
state_id="active",
|
||||
desc="Get Work Done",
|
||||
due=datetime.date.today() + datetime.timedelta(days=100))
|
||||
due=date_today(DEADLINE_TZINFO) + datetime.timedelta(days=100))
|
||||
milestone.docs.add(draft)
|
||||
|
||||
for url in [group.about_url(),] + group_urlreverse_list(group, 'ietf.group.views.group_about'):
|
||||
|
@ -876,7 +878,7 @@ class GroupEditTests(TestCase):
|
|||
self.assertEqual(r.status_code, 302)
|
||||
review_assignment.state_id = 'accepted'
|
||||
review_assignment.save()
|
||||
review_req.deadline = datetime.date.today() - datetime.timedelta(days=1)
|
||||
review_req.deadline = date_today(DEADLINE_TZINFO) - datetime.timedelta(days=1)
|
||||
review_req.save()
|
||||
|
||||
r = self.client.post(url, post_data)
|
||||
|
@ -1194,7 +1196,7 @@ class MilestoneTests(TestCase):
|
|||
m1 = GroupMilestone.objects.create(id=1,
|
||||
group=group,
|
||||
desc="Test 1",
|
||||
due=datetime.date.today(),
|
||||
due=date_today(DEADLINE_TZINFO),
|
||||
resolved="",
|
||||
state_id="active")
|
||||
m1.docs.set([draft])
|
||||
|
@ -1202,7 +1204,7 @@ class MilestoneTests(TestCase):
|
|||
m2 = GroupMilestone.objects.create(id=2,
|
||||
group=group,
|
||||
desc="Test 2",
|
||||
due=datetime.date.today(),
|
||||
due=date_today(DEADLINE_TZINFO),
|
||||
resolved="",
|
||||
state_id="charter")
|
||||
m2.docs.set([draft])
|
||||
|
@ -1246,7 +1248,7 @@ class MilestoneTests(TestCase):
|
|||
events_before = group.groupevent_set.count()
|
||||
doc_pks = pklist(Document.objects.filter(type="draft"))
|
||||
|
||||
due = self.last_day_of_month(datetime.date.today() + datetime.timedelta(days=365))
|
||||
due = self.last_day_of_month(date_today(DEADLINE_TZINFO) + datetime.timedelta(days=365))
|
||||
|
||||
# faulty post
|
||||
r = self.client.post(url, { 'prefix': "m-1",
|
||||
|
@ -1302,7 +1304,7 @@ class MilestoneTests(TestCase):
|
|||
|
||||
milestones_before = GroupMilestone.objects.filter(group=group).count()
|
||||
events_before = group.groupevent_set.count()
|
||||
due = self.last_day_of_month(datetime.date.today() + datetime.timedelta(days=365))
|
||||
due = self.last_day_of_month(date_today(DEADLINE_TZINFO) + datetime.timedelta(days=365))
|
||||
|
||||
# add
|
||||
mailbox_before = len(outbox)
|
||||
|
@ -1393,7 +1395,7 @@ class MilestoneTests(TestCase):
|
|||
events_before = group.groupevent_set.count()
|
||||
doc_pks = pklist(Document.objects.filter(type="draft"))
|
||||
|
||||
due = self.last_day_of_month(datetime.date.today() + datetime.timedelta(days=365))
|
||||
due = self.last_day_of_month(date_today(DEADLINE_TZINFO) + datetime.timedelta(days=365))
|
||||
|
||||
# faulty post
|
||||
r = self.client.post(url, { 'prefix': "m1",
|
||||
|
@ -1776,7 +1778,7 @@ class MeetingInfoTests(TestCase):
|
|||
def setUp(self):
|
||||
super().setUp()
|
||||
self.group = GroupFactory.create(type_id='wg')
|
||||
today = datetime.date.today()
|
||||
today = date_today()
|
||||
SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=14))
|
||||
self.inprog = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=1))
|
||||
SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today+datetime.timedelta(days=90))
|
||||
|
@ -1900,7 +1902,7 @@ class StatusUpdateTests(TestCase):
|
|||
def test_view_status_update_for_meeting(self):
|
||||
chair = RoleFactory(name_id='chair',group__type_id='wg')
|
||||
GroupEventFactory(type='status_update',group=chair.group)
|
||||
sess = SessionFactory.create(meeting__type_id='ietf',group=chair.group,meeting__date=timezone.now()-datetime.timedelta(days=1))
|
||||
sess = SessionFactory.create(meeting__type_id='ietf',group=chair.group,meeting__date=date_today()-datetime.timedelta(days=1))
|
||||
url = urlreverse('ietf.group.views.group_about_status_meeting',kwargs={'acronym':chair.group.acronym,'num':sess.meeting.number})
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
|
|
@ -7,6 +7,7 @@ import debug # pyflakes:ignore
|
|||
|
||||
from pyquery import PyQuery
|
||||
|
||||
from django.conf import settings
|
||||
from django.urls import reverse as urlreverse
|
||||
from django.utils import timezone
|
||||
|
||||
|
@ -477,7 +478,7 @@ class ReviewTests(TestCase):
|
|||
review_req1 = ReviewRequestFactory()
|
||||
review_assignment_completed = ReviewAssignmentFactory(review_request=review_req1,reviewer=EmailFactory(person__user__username='marschairman'), state_id='completed', reviewed_rev=0)
|
||||
ReviewAssignmentFactory(review_request=review_req1,reviewer=review_assignment_completed.reviewer)
|
||||
TelechatDocEvent.objects.create(telechat_date=datetime.date.today(), type='scheduled_for_telechat', by=review_assignment_completed.reviewer.person, doc=review_req1.doc, rev=0)
|
||||
TelechatDocEvent.objects.create(telechat_date=date_today(settings.TIME_ZONE), type='scheduled_for_telechat', by=review_assignment_completed.reviewer.person, doc=review_req1.doc, rev=0)
|
||||
|
||||
DBTemplateFactory.create(path='/group/defaults/email/open_assignments.txt',
|
||||
type_id='django',
|
||||
|
@ -598,7 +599,7 @@ class ReviewTests(TestCase):
|
|||
self.assertEqual(settings.skip_next, 0)
|
||||
|
||||
# add unavailable period
|
||||
start_date = datetime.date.today() + datetime.timedelta(days=10)
|
||||
start_date = date_today() + datetime.timedelta(days=10)
|
||||
empty_outbox()
|
||||
r = self.client.post(url, {
|
||||
"action": "add_period",
|
||||
|
|
|
@ -119,7 +119,7 @@ from ietf.settings import MAILING_LIST_INFO_URL
|
|||
from ietf.utils.response import permission_denied
|
||||
from ietf.utils.text import strip_suffix
|
||||
from ietf.utils import markdown
|
||||
from ietf.utils.timezone import datetime_today, DEADLINE_TZINFO
|
||||
from ietf.utils.timezone import date_today, datetime_today, DEADLINE_TZINFO
|
||||
|
||||
|
||||
# --- Helpers ----------------------------------------------------------
|
||||
|
@ -1389,7 +1389,7 @@ def review_requests(request, acronym, group_type=None):
|
|||
unassigned_review_requests.sort(key=lambda r: r.doc.name)
|
||||
|
||||
open_review_assignments = list(ReviewAssignment.objects.filter(review_request__team=group, state_id__in=('assigned','accepted')).order_by('-assigned_on'))
|
||||
today = datetime.date.today()
|
||||
today = date_today(DEADLINE_TZINFO)
|
||||
unavailable_periods = current_unavailable_periods_for_reviewers(group)
|
||||
for a in open_review_assignments:
|
||||
a.reviewer_unavailable = any(p.availability == "unavailable"
|
||||
|
@ -1460,7 +1460,7 @@ def reviewer_overview(request, acronym, group_type=None):
|
|||
unavailable_periods[p.person_id].append(p)
|
||||
reviewer_roles = { r.person_id: r for r in Role.objects.filter(group=group, name="reviewer").select_related("email") }
|
||||
|
||||
today = datetime.date.today()
|
||||
today = date_today()
|
||||
|
||||
max_closed_reqs = settings.GROUP_REVIEW_MAX_ITEMS_TO_SHOW_IN_REVIEWER_LIST
|
||||
days_back = settings.GROUP_REVIEW_DAYS_TO_SHOW_IN_REVIEWER_LIST
|
||||
|
@ -1838,7 +1838,7 @@ def change_reviewer_settings(request, acronym, reviewer_email, group_type=None):
|
|||
period.save()
|
||||
update_change_reason(period, "Added unavailability period: {}".format(period))
|
||||
|
||||
today = datetime.date.today()
|
||||
today = date_today()
|
||||
|
||||
in_the_past = period.end_date and period.end_date < today
|
||||
|
||||
|
@ -1879,7 +1879,7 @@ def change_reviewer_settings(request, acronym, reviewer_email, group_type=None):
|
|||
period.delete()
|
||||
update_change_reason(period, "Removed unavailability period: {}".format(period))
|
||||
|
||||
today = datetime.date.today()
|
||||
today = date_today()
|
||||
|
||||
in_the_past = period.end_date and period.end_date < today
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
|
||||
import datetime
|
||||
import os
|
||||
import pytz
|
||||
|
||||
from django.conf import settings
|
||||
from django.template.loader import render_to_string
|
||||
|
@ -297,6 +296,6 @@ def id_index_txt(with_abstracts=False):
|
|||
|
||||
return render_to_string("idindex/id_index.txt", {
|
||||
'groups': groups,
|
||||
'time': timezone.now().astimezone(pytz.utc).strftime("%Y-%m-%d %H:%M:%S %Z"),
|
||||
'time': timezone.now().astimezone(datetime.timezone.utc).strftime("%Y-%m-%d %H:%M:%S %Z"),
|
||||
'with_abstracts': with_abstracts,
|
||||
})
|
||||
|
|
Loading…
Reference in a new issue