misc: always use timezone-aware datetimes (#20926)

This commit is contained in:
Frédéric Péters 2017-12-30 15:48:48 +01:00
parent 6004272376
commit b8b130e4f7
7 changed files with 63 additions and 47 deletions

View File

@ -422,7 +422,7 @@ class Desk(models.Model):
}
def get_exceptions_within_two_weeks(self):
in_two_weeks = datetime.datetime.today() + datetime.timedelta(days=14)
in_two_weeks = make_aware(datetime.datetime.today() + datetime.timedelta(days=14))
exceptions = self.timeperiodexception_set.filter(
end_datetime__gte=now(), end_datetime__lte=in_two_weeks)
if exceptions.exists():

View File

@ -156,17 +156,19 @@ class Datetimes(GenericAPIView):
if agenda.minimal_booking_delay:
entries = entries.filter(
start_datetime__gte=localtime(now() + datetime.timedelta(days=agenda.minimal_booking_delay)).date())
start_datetime__gte=localtime(now() + datetime.timedelta(days=agenda.minimal_booking_delay)).replace(hour=0, minute=0))
if agenda.maximal_booking_delay:
entries = entries.filter(
start_datetime__lt=localtime(now() + datetime.timedelta(days=agenda.maximal_booking_delay)).date())
start_datetime__lt=localtime(now() + datetime.timedelta(days=agenda.maximal_booking_delay)).replace(hour=0, minute=0))
if 'date_start' in request.GET:
entries = entries.filter(start_datetime__gte=parse_date(request.GET['date_start']))
entries = entries.filter(start_datetime__gte=make_aware(
datetime.datetime.combine(parse_date(request.GET['date_start']), datetime.time(0, 0))))
if 'date_end' in request.GET:
entries = entries.filter(start_datetime__lt=parse_date(request.GET['date_end']))
entries = entries.filter(start_datetime__lt=make_aware(
datetime.datetime.combine(parse_date(request.GET['date_end']), datetime.time(0, 0))))
response = {'data': [{'id': x.id,
'text': unicode(x),

View File

@ -19,6 +19,7 @@ import datetime
from django import forms
from django.forms import ValidationError
from django.utils.timezone import make_aware
from django.utils.translation import ugettext_lazy as _
from chrono.agendas.models import (Event, MeetingType, TimePeriod, Desk,
@ -146,7 +147,7 @@ class ImportEventsForm(forms.Form):
'%s %s' % tuple(csvline[:2]), datetime_fmt)
except ValueError:
continue
event.start_datetime = event_datetime
event.start_datetime = make_aware(event_datetime)
break
else:
raise ValidationError(_('Invalid file format. (date/time format, line %d)') % (i+1))

View File

@ -722,7 +722,7 @@ def test_agenda_api_date_range(app, some_data):
for event in day_events:
event_dt = datetime.datetime.combine(
day, datetime.datetime.strptime(event, '%H:%M').time())
Event.objects.create(agenda=agenda2, start_datetime=event_dt, places=2)
Event.objects.create(agenda=agenda2, start_datetime=make_aware(event_dt), places=2)
params = {'date_start': base_date.isoformat()}
resp = app.get('/api/agenda/%s/datetimes/' % agenda2.slug, params=params)
@ -935,25 +935,26 @@ def test_agenda_meeting_api_exception(app, meetings_agenda, user):
desk = meetings_agenda.desk_set.first()
# test exception at the lowest limit
excp1 = TimePeriodException.objects.create(
desk=desk, start_datetime=datetime.datetime(2017, 5, 22, 10, 00),
end_datetime=datetime.datetime(2017, 5, 22, 12, 00))
desk=desk, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 0)),
end_datetime=make_aware(datetime.datetime(2017, 5, 22, 12, 0)))
resp2 = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
assert len(resp.json['data']) == len(resp2.json['data']) + 4
# test exception at the highest limit
excp1.end_datetime = datetime.datetime(2017, 5, 22, 11, 00)
excp1.end_datetime = make_aware(datetime.datetime(2017, 5, 22, 11, 0))
excp1.save()
resp2 = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
assert len(resp.json['data']) == len(resp2.json['data']) + 2
# add an exception with an end datetime less than excp1 end datetime
# and make sure that excp1 end datetime preveil
excp1.end_datetime = datetime.datetime(2017, 5, 23, 11, 00)
excp1.end_datetime = make_aware(datetime.datetime(2017, 5, 23, 11, 0))
excp1.save()
TimePeriodException.objects.create(
desk=excp1.desk, start_datetime=datetime.datetime(2017, 5, 22, 15, 00),
end_datetime=datetime.datetime(2017, 5, 23, 9, 00))
desk=excp1.desk,
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 15, 0)),
end_datetime=make_aware(datetime.datetime(2017, 5, 23, 9, 0)))
resp2 = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
assert len(resp.json['data']) == len(resp2.json['data']) + 6
@ -969,8 +970,9 @@ def test_agenda_meeting_api_exception(app, meetings_agenda, user):
# try to booking just after an exception is set
TimePeriodException.objects.create(
desk=desk2, start_datetime=datetime.datetime(2017, 5, 22, 9, 00),
end_datetime=datetime.datetime(2017, 5, 22, 12, 00))
desk=desk2,
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 9, 0)),
end_datetime=make_aware(datetime.datetime(2017, 5, 22, 12, 0)))
booking_url = resp3.json['data'][0]['api']['fillslot_url']
resp = app.post(booking_url)
assert resp.json['err'] == 1
@ -983,8 +985,9 @@ def test_agenda_meeting_api_in_between_exceptions(app, meetings_agenda, user):
desk = meetings_agenda.desk_set.first()
# test exception at the lowest limit
TimePeriodException.objects.create(
desk=desk, start_datetime=datetime.datetime(2017, 5, 22, 10, 00),
end_datetime=datetime.datetime(2017, 5, 22, 12, 00))
desk=desk,
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 0)),
end_datetime=make_aware(datetime.datetime(2017, 5, 22, 12, 0)))
resp2 = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
assert len(resp.json['data']) == len(resp2.json['data']) + 4
# exclude slots on 2017-05-30 and 2017-07-10
@ -995,11 +998,13 @@ def test_agenda_meeting_api_in_between_exceptions(app, meetings_agenda, user):
count_on_2017_07_10 = len([
datum for datum in resp.json['data'] if datetime_from_str(datum['datetime']).date() == date_2017_07_10])
TimePeriodException.objects.create(
desk=desk, start_datetime=datetime.datetime(2017, 5, 30, 8, 00),
end_datetime=datetime.datetime(2017, 5, 30, 18, 00))
desk=desk,
start_datetime=make_aware(datetime.datetime(2017, 5, 30, 8, 0)),
end_datetime=make_aware(datetime.datetime(2017, 5, 30, 18, 0)))
TimePeriodException.objects.create(
desk=desk, start_datetime=datetime.datetime(2017, 7, 10, 8, 00),
end_datetime=datetime.datetime(2017, 7, 10, 18, 00))
desk=desk,
start_datetime=make_aware(datetime.datetime(2017, 7, 10, 8, 0)),
end_datetime=make_aware(datetime.datetime(2017, 7, 10, 18, 0)))
resp3 = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
assert len(resp2.json['data']) == len(resp3.json['data']) + count_on_2017_05_30 + count_on_2017_07_10
assert len([datum for datum in resp3.json['data'] if datetime_from_str(datum['datetime']).date() == date_2017_05_30]) == 0
@ -1033,7 +1038,7 @@ def test_agenda_meeting_api_desk_info(app, meetings_agenda, user):
resp = app.post(booking_url)
assert resp.json['desk']['label'] == desk2.label
assert resp.json['desk']['slug'] == desk2.slug
# booking slot 3 and make sure desk 1 info are returened
# booking slot 3 and make sure desk 1 info are returned
resp = app.post(booking_url2)
assert resp.json['desk']['label'] == desk.label
assert resp.json['desk']['slug'] == desk.slug
@ -1117,8 +1122,9 @@ def test_agenda_meeting_gcd_durations_and_exceptions(app, meetings_agenda, user)
# exception to just leave enough place for a single 20-minutes meeting.
TimePeriodException.objects.create(
desk=desk, start_datetime=datetime.datetime(2017, 5, 22, 10, 20),
end_datetime=datetime.datetime(2017, 5, 22, 12, 00))
desk=desk,
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 20)),
end_datetime=make_aware(datetime.datetime(2017, 5, 22, 12, 0)))
resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type_20.id)
assert len(resp.json['data']) == 1

View File

@ -3,6 +3,7 @@ import pytest
from django.db import connection
from django.db.migrations.executor import MigrationExecutor
from django.utils.timezone import make_aware
from chrono.agendas.models import MeetingType
@ -56,11 +57,11 @@ def test_timeperiod_data_migrations():
meeting_type = MeetingType.objects.create(agenda=agenda, label='foo',
slug='foo', duration=60)
Event.objects.create(agenda=agenda, places=1, meeting_type=meeting_type,
start_datetime=datetime.datetime(2017, 5, 22, 9, 30))
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 9, 30)))
Event.objects.create(agenda=agenda, places=1, meeting_type=meeting_type,
start_datetime=datetime.datetime(2017, 5, 22, 10, 0))
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 0)))
Event.objects.create(agenda=agenda2, places=5,
start_datetime=datetime.datetime(2017, 5, 22, 10, 0))
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 0)))
executor.loader.build_graph()
executor.migrate(migrate_to)
new_apps = executor.loader.project_state(migrate_to).apps

View File

@ -8,6 +8,7 @@ import tempfile
import pytest
from django.core.management import call_command
from django.utils.timezone import make_aware
from chrono.agendas.models import (Agenda, Event, MeetingType, TimePeriod,
Desk, TimePeriodException)
@ -28,11 +29,13 @@ def test_import_export(app, some_data, meetings_agenda):
# add exception to meeting agenda
desk = meetings_agenda.desk_set.first()
TimePeriodException.objects.create(
desk=desk, start_datetime=datetime.datetime(2017, 5, 22, 8, 0),
end_datetime=datetime.datetime(2017, 5, 22, 12, 30))
desk=desk,
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 8, 0)),
end_datetime=make_aware(datetime.datetime(2017, 5, 22, 12, 30)))
TimePeriodException.objects.create(
desk=desk, start_datetime=datetime.datetime(2017, 5, 22, 8, 0),
end_datetime=datetime.datetime(2017, 5, 22, 12, 30))
desk=desk,
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 8, 0)),
end_datetime=make_aware(datetime.datetime(2017, 5, 22, 12, 30)))
output = get_output_of_command('export_site')
assert len(json.loads(output)['agendas']) == 3
import_site(data={}, clean=True)
@ -58,15 +61,16 @@ def test_import_export(app, some_data, meetings_agenda):
agenda1 = Agenda.objects.get(label=u'Foo bar')
agenda2 = Agenda.objects.get(label=u'Foo bar Meeting')
event = Event(agenda=agenda1, start_datetime= datetime.datetime.now(), places=10)
event = Event(agenda=agenda1, start_datetime=make_aware(datetime.datetime.now()), places=10)
event.save()
desk, _ = Desk.objects.get_or_create(agenda=agenda2, label='Desk A', slug='desk-a')
timeperiod = TimePeriod(weekday=2, desk=desk,
start_time=datetime.time(10, 0), end_time=datetime.time(11, 0))
timeperiod.save()
exception = TimePeriodException(
desk=desk, start_datetime=datetime.datetime(2017, 5, 22, 8, 0),
end_datetime=datetime.datetime(2017, 5, 22, 12, 30))
desk=desk,
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 8, 0)),
end_datetime=make_aware(datetime.datetime(2017, 5, 22, 12, 30)))
exception.save()
import_site(json.loads(output), overwrite=True)
@ -75,14 +79,15 @@ def test_import_export(app, some_data, meetings_agenda):
assert TimePeriod.objects.filter(id=timeperiod.id).count() == 0
assert TimePeriodException.objects.filter(id=exception.id).count() == 0
event = Event(agenda=agenda1, start_datetime= datetime.datetime.now(), places=10)
event = Event(agenda=agenda1, start_datetime=make_aware(datetime.datetime.now()), places=10)
event.save()
timeperiod = TimePeriod(weekday=2, desk=desk,
start_time=datetime.time(10, 0), end_time=datetime.time(11, 0))
timeperiod.save()
exception = TimePeriodException(
desk=desk, start_datetime=datetime.datetime(2017, 5, 22, 8, 0),
end_datetime=datetime.datetime(2017, 5, 22, 12, 30))
desk=desk,
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 8, 0)),
end_datetime=make_aware(datetime.datetime(2017, 5, 22, 12, 30)))
exception.save()
import_site(json.loads(output), overwrite=False)
assert Event.objects.filter(id=event.id).count() == 1

View File

@ -294,8 +294,9 @@ def test_add_event_as_manager(app, manager_user):
def test_edit_event(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.save()
event = Event(start_datetime=datetime.datetime(2016, 2, 15, 17, 0),
places=20, agenda=agenda)
event = Event(
start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)),
places=20, agenda=agenda)
event.save()
app = login(app)
resp = app.get('/manage/agendas/%s/' % agenda.id, status=200)
@ -317,7 +318,7 @@ def test_edit_event_as_manager(app, manager_user):
agenda = Agenda(label=u'Foo bar')
agenda.view_role = manager_user.groups.all()[0]
agenda.save()
event = Event(start_datetime=datetime.datetime(2016, 2, 15, 17, 0),
event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)),
places=20, agenda=agenda)
event.save()
app = login(app, username='manager', password='manager')
@ -341,7 +342,7 @@ def test_edit_event_as_manager(app, manager_user):
def test_booked_places(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.save()
event = Event(start_datetime=datetime.datetime(2016, 2, 15, 17, 0),
event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)),
places=10, agenda=agenda)
event.save()
Booking(event=event).save()
@ -354,7 +355,7 @@ def test_booked_places(app, admin_user):
def test_event_classes(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.save()
event = Event(start_datetime=datetime.datetime(2016, 2, 15, 17, 0),
event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)),
places=10, agenda=agenda)
event.save()
for i in range(2):
@ -380,7 +381,7 @@ def test_event_classes(app, admin_user):
def test_delete_event(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.save()
event = Event(start_datetime=datetime.datetime(2016, 2, 15, 17, 0),
event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)),
places=10, agenda=agenda)
event.save()
@ -429,7 +430,7 @@ def test_delete_event_as_manager(app, manager_user):
agenda = Agenda(label=u'Foo bar')
agenda.edit_role = manager_user.groups.all()[0]
agenda.save()
event = Event(start_datetime=datetime.datetime(2016, 2, 15, 17, 0),
event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)),
places=10, agenda=agenda)
event.save()
@ -777,7 +778,7 @@ def test_meetings_agenda_add_time_period_exception_when_booking_exists(app, admi
TimePeriod.objects.create(weekday=1, desk=desk,
start_time=datetime.time(10, 0), end_time=datetime.time(12, 0))
event = Event.objects.create(agenda=agenda, places=1,
start_datetime=datetime.datetime(2017, 5, 22, 10, 30))
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 30)))
Booking.objects.create(event=event)
login(app)
resp = app.get('/manage/agendas/%d/' % agenda.pk)
@ -799,9 +800,9 @@ def test_meetings_agenda_add_time_period_exception_when_cancelled_booking_exists
TimePeriod.objects.create(weekday=1, desk=desk,
start_time=datetime.time(10, 0), end_time=datetime.time(12, 0))
event = Event.objects.create(agenda=agenda, places=1,
start_datetime=datetime.datetime(2017, 5, 22, 10, 30))
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 30)))
Booking.objects.create(event=event,
cancellation_datetime=datetime.datetime(2017, 5, 20, 10, 30))
cancellation_datetime=make_aware(datetime.datetime(2017, 5, 20, 10, 30)))
login(app)
resp = app.get('/manage/agendas/%d/' % agenda.pk)
resp = resp.click('Add a time period exception')