Skip to content
This repository was archived by the owner on Nov 26, 2018. It is now read-only.

Commit 487c870

Browse files
committed
Explicitly set UTC
It's possible for timezones to change per session. We always want to use UTC as the base.
1 parent 03cd744 commit 487c870

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed

botbot/apps/logs/views.py

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import datetime
12
import json
23
import math
34
import random
@@ -9,7 +10,6 @@
910
from django.db.models import Q
1011
from django.http import Http404, HttpResponse
1112
from django.shortcuts import redirect, get_object_or_404
12-
from django.utils import timezone
1313
from django.utils.functional import cached_property
1414
from django.utils.translation import ugettext as _
1515
from django.views.generic import ListView, TemplateView, View
@@ -98,7 +98,7 @@ def _local_date_at_midnight(self, timestamp):
9898
# cast timestamp into local timezone
9999
localized = timestamp.astimezone(self.request_timezone)
100100
# create a new date object starting at midnight in that timezone
101-
return timezone.datetime(localized.year,
101+
return datetime.datetime(localized.year,
102102
localized.month,
103103
localized.day,
104104
tzinfo=localized.tzinfo)
@@ -123,7 +123,7 @@ def _get_next_date(self):
123123
date = None
124124
try:
125125
ts = (self._get_base_queryset()
126-
.filter(timestamp__gte=timezone.timedelta(days=1) + self.date)
126+
.filter(timestamp__gte=datetime.timedelta(days=1) + self.date)
127127
.order_by('timestamp')[0].timestamp)
128128
date = self._local_date_at_midnight(ts)
129129
except IndexError:
@@ -133,7 +133,7 @@ def _get_next_date(self):
133133
def _date_query_set(self, date):
134134
qs = self._get_base_queryset()
135135
return qs.filter(timestamp__gte=date,
136-
timestamp__lt=date + timezone.timedelta(days=1))
136+
timestamp__lt=date + datetime.timedelta(days=1))
137137

138138
class LogStream(ChannelMixin, View):
139139
def get(self, request, channel_slug, bot_slug):
@@ -144,6 +144,9 @@ def get(self, request, channel_slug, bot_slug):
144144
response['Last-Event-ID'] = request.META['HTTP_LAST_EVENT_ID']
145145
return response
146146

147+
def _utc_now():
148+
return datetime.datetime.now(tz=pytz.timezone('UTC'))
149+
147150
def _find_pk(pk, queryset):
148151
"""Find a PK in a queryset in memory"""
149152
found = None
@@ -162,19 +165,19 @@ def _timeline_context(timeline):
162165
if not timeline:
163166
return {}
164167

165-
today = timezone.now().date()
166-
last_monday = today - timezone.timedelta(days=today.weekday())
167-
last_week = last_monday - timezone.timedelta(days=7)
168+
today = _utc_now().date()
169+
last_monday = today - datetime.timedelta(days=today.weekday())
170+
last_week = last_monday - datetime.timedelta(days=7)
168171

169172
# the last month in the timeline needs special treatment so it
170173
# doesn't get ordered ahead of the last/current weeks
171174
last_month = timeline[timeline.keyOrder[-1]].pop()
172175
if last_month >= last_week:
173176
last_month_adjusted = (last_week -
174-
timezone.timedelta(days=1))
177+
datetime.timedelta(days=1))
175178
elif last_month >= last_monday:
176179
last_month_adjusted = (last_monday -
177-
timezone.timedelta(days=1))
180+
datetime.timedelta(days=1))
178181
else:
179182
last_month_adjusted = last_month
180183

@@ -349,7 +352,7 @@ def get_queryset(self):
349352
qs = self.channel.filtered_logs()
350353
qs = self.get_ordered_queryset(qs)
351354
start = self.date
352-
end = start + timezone.timedelta(days=1)
355+
end = start + datetime.timedelta(days=1)
353356
return qs.filter(timestamp__gte=start, timestamp__lt=end)
354357

355358
def _date_paginator(self, date):
@@ -414,7 +417,7 @@ def get_next_page_link(self, page):
414417
def get_current_page_link(self, page):
415418
# copy, to maintain any params that came in to original request.
416419
params = self.request.GET.copy()
417-
date = timezone.now()
420+
date = _utc_now()
418421
url = self.channel_date_url(date)
419422
params['page'] = page.number
420423
return '{0}?{1}'.format(url, params.urlencode())
@@ -433,16 +436,15 @@ def request_timezone(self):
433436
def set_view_date(self):
434437
"""Determine start date for queryset"""
435438
if all([field in self.kwargs for field in ['year', 'month', 'day']]):
436-
self.date = timezone.datetime(
437-
year=int(self.kwargs['year']),
438-
month=int(self.kwargs['month']),
439-
day=int(self.kwargs['day']))
440439
# localize date so logs start at local time
441-
return self.request_timezone.localize(self.date)
440+
return datetime.datetime(year=int(self.kwargs['year']),
441+
month=int(self.kwargs['month']),
442+
day=int(self.kwargs['day']),
443+
tzinfo=self.request_timezone)
442444

443445
# Use the last page.
444446
self.kwargs['page'] = 'last'
445-
return timezone.now().date()
447+
return _utc_now().date()
446448

447449

448450
class SearchLogViewer(PaginatorPageLinksMixin, LogViewer, ListView):
@@ -563,7 +565,7 @@ def get_queryset(self):
563565
date_filter = {'timestamp__gte': last_exit.timestamp}
564566
# Only fetch results from when the user logged out.
565567
self.fetch_after = (
566-
last_exit.timestamp - timezone.timedelta(milliseconds=1))
568+
last_exit.timestamp - datetime.timedelta(milliseconds=1))
567569
return queryset.filter(**date_filter)
568570

569571

0 commit comments

Comments
 (0)