Skip to content

Commit f3bdbf0

Browse files
Merge branch 'feat/tzaware' into jennifer/main-for-tzaware-merge
# Conflicts: # ietf/meeting/tests_js.py # ietf/meeting/tests_models.py # ietf/meeting/tests_views.py # ietf/meeting/views.py # ietf/name/fixtures/names.json # ietf/templates/meeting/agenda.html # ietf/templates/meeting/session_buttons_include.html # ietf/templates/meeting/timeslot_start_end.html
2 parents d698e7c + 0391383 commit f3bdbf0

157 files changed

Lines changed: 2289 additions & 1134 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ jobs:
139139
run: |
140140
echo "Running checks..."
141141
./ietf/manage.py check
142+
./ietf/manage.py migrate || true
143+
echo "USE_TZ = True" >> ./ietf/settings_local.py
142144
./ietf/manage.py migrate
143145
echo "Validating migrations..."
144146
if ! ( ietf/manage.py makemigrations --dry-run --check --verbosity 3 ) ; then

dev/diff/prepare.sh

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,24 @@ yarn legacy:build
1212
echo "Creating data directories..."
1313
chmod +x ./docker/scripts/app-create-dirs.sh
1414
./docker/scripts/app-create-dirs.sh
15+
1516
./ietf/manage.py check
16-
./ietf/manage.py migrate
17+
if ./ietf/manage.py showmigrations | grep "\[ \] 0003_pause_to_change_use_tz"; then
18+
if grep "USE_TZ" ./ietf/settings_local.py; then
19+
cat ./ietf/settings_local.py | sed 's/USE_TZ.*$/USE_TZ = False/' > /tmp/settings_local.py && mv /tmp/settings_local.py ./ietf/settings_local.py
20+
else
21+
echo "USE_TZ = False" >> ./ietf/settings_local.py
22+
fi
23+
# This is expected to exit non-zero at the pause
24+
/usr/local/bin/python ./ietf/manage.py migrate || true
25+
cat ./ietf/settings_local.py | sed 's/USE_TZ.*$/USE_TZ = True/' > /tmp/settings_local.py && mv /tmp/settings_local.py ./ietf/settings_local.py
26+
/usr/local/bin/python ./ietf/manage.py migrate
27+
28+
else
29+
if grep "USE_TZ" ./ietf/settings_local.py; then
30+
cat ./ietf/settings_local.py | sed 's/USE_TZ.*$/USE_TZ = True/' > /tmp/settings_local.py && mv /tmp/settings_local.py ./ietf/settings_local.py
31+
else
32+
echo "USE_TZ = True" >> ./ietf/settings_local.py
33+
/usr/local/bin/python ./ietf/manage.py migrate
34+
fi
35+
fi

docker/scripts/app-init.sh

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,28 @@ echo "Starting memcached..."
100100

101101
echo "Running initial checks..."
102102
/usr/local/bin/python $WORKSPACEDIR/ietf/manage.py check --settings=settings_local
103-
# /usr/local/bin/python $WORKSPACEDIR/ietf/manage.py migrate --settings=settings_local
103+
104+
# Migrate, adjusting to what the current state of the underlying database might be:
105+
106+
if ietf/manage.py showmigrations | grep "\[ \] 0003_pause_to_change_use_tz"; then
107+
if grep "USE_TZ" $WORKSPACEDIR/ietf/settings_local.py; then
108+
cat $WORKSPACEDIR/ietf/settings_local.py | sed 's/USE_TZ.*$/USE_TZ = False/' > /tmp/settings_local.py && mv /tmp/settings_local.py $WORKSPACEDIR/ietf/settings_local.py
109+
else
110+
echo "USE_TZ = False" >> $WORKSPACEDIR/ietf/settings_local.py
111+
fi
112+
# This is expected to exit non-zero at the pause
113+
/usr/local/bin/python $WORKSPACEDIR/ietf/manage.py migrate --settings=settings_local || true
114+
cat $WORKSPACEDIR/ietf/settings_local.py | sed 's/USE_TZ.*$/USE_TZ = True/' > /tmp/settings_local.py && mv /tmp/settings_local.py $WORKSPACEDIR/ietf/settings_local.py
115+
/usr/local/bin/python $WORKSPACEDIR/ietf/manage.py migrate --settings=settings_local
116+
117+
else
118+
if grep "USE_TZ" $WORKSPACEDIR/ietf/settings_local.py; then
119+
cat $WORKSPACEDIR/ietf/settings_local.py | sed 's/USE_TZ.*$/USE_TZ = True/' > /tmp/settings_local.py && mv /tmp/settings_local.py $WORKSPACEDIR/ietf/settings_local.py
120+
else
121+
echo "USE_TZ = True" >> $WORKSPACEDIR/ietf/settings_local.py
122+
/usr/local/bin/python $WORKSPACEDIR/ietf/manage.py migrate --settings=settings_local
123+
fi
124+
fi
104125

105126
echo "-----------------------------------------------------------------"
106127
echo "Done!"

ietf/api/management/commands/makeresources.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44

55
import os
6-
import datetime
76
import collections
87
import io
98

@@ -14,6 +13,7 @@
1413
from django.core.management.base import AppCommand
1514
from django.db import models
1615
from django.template import Template, Context
16+
from django.utils import timezone
1717

1818
from tastypie.resources import ModelResource
1919

@@ -89,7 +89,7 @@ def handle_app_config(self, app, **options):
8989
info = dict(
9090
app=app.name,
9191
app_label=app.label,
92-
date=datetime.datetime.now()
92+
date=timezone.now()
9393
)
9494
new_models = {}
9595
for model, rclass_name in missing_resources:

ietf/api/tests.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from ietf.person.models import PersonalApiKey
3333
from ietf.stats.models import MeetingRegistration
3434
from ietf.utils.mail import outbox, get_payload_text
35+
from ietf.utils.models import DumpInfo
3536
from ietf.utils.test_utils import TestCase, login_testing_unauthorized
3637

3738
OMITTED_APPS = (
@@ -508,10 +509,17 @@ def test_api_new_meeting_registration(self):
508509
self.assertEqual(set(missing_fields), set(drop_fields))
509510

510511
def test_api_version(self):
512+
DumpInfo.objects.create(date=timezone.datetime(2022,8,31,7,10,1,tzinfo=timezone.utc), host='testapi.example.com',tz='UTC')
511513
url = urlreverse('ietf.api.views.version')
512514
r = self.client.get(url)
513515
data = r.json()
514516
self.assertEqual(data['version'], ietf.__version__+ietf.__patch__)
517+
self.assertEqual(data['dumptime'], "2022-08-31 07:10:01 +0000")
518+
DumpInfo.objects.update(tz='PST8PDT')
519+
r = self.client.get(url)
520+
data = r.json()
521+
self.assertEqual(data['dumptime'], "2022-08-31 07:10:01 -0700")
522+
515523

516524
def test_api_appauth(self):
517525
url = urlreverse('ietf.api.views.app_auth')

ietf/api/views.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,13 @@ def err(code, text):
203203

204204

205205
def version(request):
206+
dumpdate = None
206207
dumpinfo = DumpInfo.objects.order_by('-date').first()
207-
dumptime = pytz.timezone(dumpinfo.tz).localize(dumpinfo.date).strftime('%Y-%m-%d %H:%M:%S %z') if dumpinfo else None
208+
if dumpinfo:
209+
dumpdate = dumpinfo.date
210+
if dumpinfo.tz != "UTC":
211+
dumpdate = pytz.timezone(dumpinfo.tz).localize(dumpinfo.date.replace(tzinfo=None))
212+
dumptime = dumpdate.strftime('%Y-%m-%d %H:%M:%S %z') if dumpinfo else None
208213
return HttpResponse(
209214
json.dumps({
210215
'version': ietf.__version__+ietf.__patch__,

ietf/bin/create-charter-newrevisiondocevents

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def warn(string):
2828
# ------------------------------------------------------------------------------
2929

3030
import re
31-
from datetime import datetime as Datetime
31+
import datetime
3232

3333
import django
3434
django.setup()
@@ -44,7 +44,7 @@ system_entity = Person.objects.get(name="(System)")
4444
charterdir = Path(settings.CHARTER_PATH)
4545
for file in charterdir.files("charter-ietf-*.txt"):
4646
fname = file.name
47-
ftime = Datetime.fromtimestamp(file.mtime)
47+
ftime = datetime.datetime.fromtimestamp(file.mtime, datetime.timezone.utc)
4848
match = re.search("^(?P<name>[a-z0-9-]+)-(?P<rev>\d\d-\d\d)\.txt$", fname)
4949
if match:
5050
name = match.group("name")

ietf/bin/iana-changes-updates

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ django.setup()
1818

1919
from django.conf import settings
2020
from optparse import OptionParser
21+
from zoneinfo import ZoneInfo
2122

2223
parser = OptionParser()
2324
parser.add_option("-f", "--from", dest="start",
@@ -38,21 +39,30 @@ CLOCK_SKEW_COMPENSATION = 5 # seconds
3839
MAX_INTERVAL_ACCEPTED_BY_IANA = datetime.timedelta(hours=23)
3940

4041

42+
local_tzinfo = ZoneInfo(settings.TIME_ZONE)
4143
start = datetime.datetime.now() - datetime.timedelta(hours=23) + datetime.timedelta(seconds=CLOCK_SKEW_COMPENSATION)
4244
if options.start:
4345
start = datetime.datetime.strptime(options.start, "%Y-%m-%d %H:%M:%S")
46+
start = start.replace(tzinfo=local_tzinfo).astimezone(datetime.timezone.utc)
4447

4548
end = start + datetime.timedelta(hours=23)
4649
if options.end:
47-
end = datetime.datetime.strptime(options.end, "%Y-%m-%d %H:%M:%S")
50+
end = datetime.datetime.strptime(options.end, "%Y-%m-%d %H:%M:%S").replace(tzinfo=local_tzinfo)
51+
end = end.astimezone(datetime.timezone.utc)
4852

4953
syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_USER)
5054

5155
# ----------------------------------------------------------------------
5256

5357
from ietf.sync.iana import fetch_changes_json, parse_changes_json, update_history_with_changes
5458

55-
syslog.syslog("Updating history log with new changes from IANA from %s, period %s - %s" % (settings.IANA_SYNC_CHANGES_URL, start, end))
59+
syslog.syslog(
60+
"Updating history log with new changes from IANA from %s, period %s - %s" % (
61+
settings.IANA_SYNC_CHANGES_URL,
62+
start.astimezone(local_tzinfo),
63+
end.astimezone(local_tzinfo),
64+
)
65+
)
5666

5767
t = start
5868
while t < end:

ietf/bin/send-scheduled-mail

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# This script requires that the proper virtual python environment has been
44
# invoked before start
55

6-
import datetime, os, sys
6+
import os, sys
77
import syslog
88

99
# boilerplate
@@ -16,6 +16,7 @@ syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_USER)
1616

1717
import django
1818
django.setup()
19+
from django.utils import timezone
1920

2021
from ietf.utils.mail import log_smtp_exception, send_error_email
2122
from smtplib import SMTPException
@@ -32,7 +33,7 @@ from ietf.message.models import SendQueue
3233

3334
mode = sys.argv[1]
3435

35-
now = datetime.datetime.now()
36+
now = timezone.now()
3637

3738
needs_sending = SendQueue.objects.filter(sent_at=None).select_related("message")
3839
if mode == "specific":

ietf/community/views.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from django.http import HttpResponse, HttpResponseRedirect, Http404
1111
from django.shortcuts import get_object_or_404, render
1212
from django.contrib.auth.decorators import login_required
13+
from django.utils import timezone
1314
from django.utils.html import strip_tags
1415

1516
import debug # pyflakes:ignore
@@ -218,7 +219,7 @@ def feed(request, username=None, acronym=None, group_type=None):
218219
significant = request.GET.get('significant', '') == '1'
219220

220221
documents = docs_tracked_by_community_list(clist).values_list('pk', flat=True)
221-
since = datetime.datetime.now() - datetime.timedelta(days=14)
222+
since = timezone.now() - datetime.timedelta(days=14)
222223

223224
events = DocEvent.objects.filter(
224225
doc__id__in=documents,
@@ -243,7 +244,7 @@ def feed(request, username=None, acronym=None, group_type=None):
243244
'title': title,
244245
'subtitle': subtitle,
245246
'id': feed_id.urn,
246-
'updated': datetime.datetime.now(),
247+
'updated': timezone.now(),
247248
}, content_type='text/xml')
248249

249250

0 commit comments

Comments
 (0)