Skip to content

Commit 69447d0

Browse files
Merge branch 'feat/tzaware' into jennifer/main-for-tzaware-merge
# Conflicts: # ietf/name/fixtures/names.json # ietf/utils/management/commands/send_gdpr_consent_request.py
2 parents 9b4903e + 23c2b5c commit 69447d0

190 files changed

Lines changed: 2789 additions & 1396 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

bin/add-old-drafts-from-archive.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from django.core.validators import validate_email, ValidationError
1717
from ietf.utils.draft import PlaintextDraft
1818
from ietf.submit.utils import update_authors
19+
from ietf.utils.timezone import date_today
1920

2021
import debug # pyflakes:ignore
2122

@@ -66,9 +67,9 @@
6667
print name, rev, "Can't parse", p,":",e
6768
continue
6869
if draft.errors and draft.errors.keys()!=['draftname',]:
69-
print "Errors - could not process", name, rev, datetime.datetime.fromtimestamp(p.stat().st_mtime), draft.errors, draft.get_title().encode('utf8')
70+
print "Errors - could not process", name, rev, datetime.datetime.fromtimestamp(p.stat().st_mtime, datetime.timezone.utc), draft.errors, draft.get_title().encode('utf8')
7071
else:
71-
time = datetime.datetime.fromtimestamp(p.stat().st_mtime)
72+
time = datetime.datetime.fromtimestamp(p.stat().st_mtime, datetime.timezone.utc)
7273
if not doc:
7374
doc = Document.objects.create(name=name,
7475
time=time,
@@ -140,7 +141,7 @@ def turn_into_unicode(s):
140141
doc = doc,
141142
rev = rev,
142143
by = system,
143-
desc = "Revision added from id-archive on %s by %s"%(datetime.date.today(),sys.argv[0]),
144+
desc = "Revision added from id-archive on %s by %s"%(date_today(),sys.argv[0]),
144145
time=time,
145146
)
146147
events.append(e)

bin/check-copyright

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ def get_first_commit(path):
162162
else:
163163
pass
164164
except OSError:
165-
rev, who, when = None, None, datetime.datetime.now()
165+
rev, who, when = None, None, datetime.datetime.now(datetime.timezone.utc)
166166
return { path: { 'rev': rev, 'who': who, 'date': when.strftime('%Y-%m-%d %H:%M:%S'), }, }
167167

168168

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:

0 commit comments

Comments
 (0)