api: fix datetimes API on UTC/local timezone/hour borders (#16348)
This commit is contained in:
parent
70a99cadd0
commit
63ffddd5fb
|
@ -261,10 +261,10 @@ class Event(models.Model):
|
|||
(self.waiting_list_places and self.waiting_list >= self.waiting_list_places))
|
||||
|
||||
def in_bookable_period(self):
|
||||
if now().date() > (self.start_datetime - datetime.timedelta(days=self.agenda.minimal_booking_delay)).date():
|
||||
if localtime(now()).date() > localtime(self.start_datetime - datetime.timedelta(days=self.agenda.minimal_booking_delay)).date():
|
||||
return False
|
||||
if self.agenda.maximal_booking_delay and (
|
||||
now().date() <= (self.start_datetime - datetime.timedelta(days=self.agenda.maximal_booking_delay)).date()):
|
||||
localtime(now()).date() <= localtime(self.start_datetime - datetime.timedelta(days=self.agenda.maximal_booking_delay)).date()):
|
||||
return False
|
||||
if self.start_datetime < now():
|
||||
# past the event date, we may want in the future to allow for some
|
||||
|
|
|
@ -66,13 +66,13 @@ class Datetimes(GenericAPIView):
|
|||
|
||||
kwargs = {}
|
||||
if agenda.minimal_booking_delay:
|
||||
kwargs['start_datetime__gte'] = (now() + datetime.timedelta(days=agenda.minimal_booking_delay)).date()
|
||||
kwargs['start_datetime__gte'] = localtime(now() + datetime.timedelta(days=agenda.minimal_booking_delay)).date()
|
||||
else:
|
||||
# if there's no minimal booking delay we still don't want to allow
|
||||
# booking for past events.
|
||||
kwargs['start_datetime__gte'] = now()
|
||||
kwargs['start_datetime__gte'] = localtime(now())
|
||||
if agenda.maximal_booking_delay:
|
||||
kwargs['start_datetime__lt'] = (now() + datetime.timedelta(days=agenda.maximal_booking_delay)).date()
|
||||
kwargs['start_datetime__lt'] = localtime(now() + datetime.timedelta(days=agenda.maximal_booking_delay)).date()
|
||||
|
||||
entries = Event.objects.filter(agenda=agenda).filter(**kwargs)
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
TIME_ZONE = 'Asia/Kolkata'
|
||||
TIME_ZONE = 'Europe/Paris'
|
||||
LANGUAGE_CODE = 'en-us'
|
||||
INSTALLED_APPS = INSTALLED_APPS + ('mellon',)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import datetime
|
||||
import pytest
|
||||
import sys
|
||||
import urlparse
|
||||
from webtest import TestApp
|
||||
|
||||
|
@ -8,6 +9,7 @@ from django.test import override_settings
|
|||
from django.utils.timezone import now, make_aware, localtime
|
||||
|
||||
from chrono.agendas.models import Agenda, Event, Booking, MeetingType, TimePeriod
|
||||
import chrono.api.views
|
||||
|
||||
|
||||
pytestmark = pytest.mark.django_db
|
||||
|
@ -21,8 +23,25 @@ def user():
|
|||
user.save()
|
||||
return user
|
||||
|
||||
@pytest.fixture(params=['Europe/Brussels', 'Asia/Kolkata', 'Brazil/East'])
|
||||
def time_zone(request, settings):
|
||||
settings.TIME_ZONE = request.param
|
||||
|
||||
|
||||
@pytest.fixture(params=[
|
||||
datetime.datetime(2017, 5, 20, 1, 12),
|
||||
datetime.datetime(2017, 5, 20, 11, 42),
|
||||
datetime.datetime(2017, 5, 20, 23, 17)])
|
||||
def mock_now(request, monkeypatch):
|
||||
def mockreturn():
|
||||
return make_aware(request.param)
|
||||
monkeypatch.setattr(chrono.api.views, 'now', mockreturn)
|
||||
monkeypatch.setattr(chrono.agendas.models, 'now', mockreturn)
|
||||
monkeypatch.setattr(sys.modules[__name__], 'now', mockreturn)
|
||||
return mockreturn()
|
||||
|
||||
@pytest.fixture
|
||||
def some_data():
|
||||
def some_data(time_zone, mock_now):
|
||||
agenda = Agenda(label=u'Foo bar')
|
||||
agenda.save()
|
||||
first_date = localtime(now()).replace(hour=17, minute=0, second=0, microsecond=0)
|
||||
|
@ -47,7 +66,7 @@ def some_data():
|
|||
event.save()
|
||||
|
||||
@pytest.fixture
|
||||
def meetings_agenda():
|
||||
def meetings_agenda(time_zone, mock_now):
|
||||
agenda = Agenda(label=u'Foo bar Meeting', kind='meetings',
|
||||
minimal_booking_delay=1, maximal_booking_delay=56)
|
||||
agenda.save()
|
||||
|
@ -175,6 +194,10 @@ def test_datetimes_api_meetings_agenda(app, meetings_agenda):
|
|||
|
||||
# test with a timeperiod overlapping current moment, it should get one
|
||||
# datetime for the current timeperiod + two from the next week.
|
||||
if now().time().hour == 23:
|
||||
# skip this part of the test as it would require support for events
|
||||
# crossing midnight
|
||||
return
|
||||
TimePeriod.objects.filter(agenda=meetings_agenda).delete()
|
||||
start_time = localtime(now()) - datetime.timedelta(minutes=10)
|
||||
time_period = TimePeriod(agenda=meetings_agenda, weekday=localtime(now()).weekday(),
|
||||
|
|
Loading…
Reference in New Issue