4812 |
4812 |
agenda_foo.save()
|
4813 |
4813 |
resp = app.get(foo_api_url, params=params)
|
4814 |
4814 |
assert len(resp.json['data']) == 16
|
4815 |
4815 |
# also on virtual agenda
|
4816 |
4816 |
virtual_agenda.maximal_booking_delay = 5
|
4817 |
4817 |
virtual_agenda.save()
|
4818 |
4818 |
resp = app.get(virtual_api_url, params=params)
|
4819 |
4819 |
assert len(resp.json['data']) == 16
|
|
4820 |
|
|
4821 |
|
|
4822 |
def test_datetimes_api_meta(app, freezer):
|
|
4823 |
# 2017-05-20 -> saturday
|
|
4824 |
freezer.move_to(make_aware(datetime.datetime(year=2017, month=5, day=20, hour=1, minute=12)))
|
|
4825 |
|
|
4826 |
agenda = Agenda.objects.create(label=u'Foo bar')
|
|
4827 |
first_date = localtime(now()).replace(hour=17, minute=0, second=0, microsecond=0)
|
|
4828 |
first_date += datetime.timedelta(days=1)
|
|
4829 |
for i in range(3):
|
|
4830 |
event = Event(start_datetime=first_date + datetime.timedelta(days=i), places=20, agenda=agenda)
|
|
4831 |
event.save()
|
|
4832 |
# a date in the past
|
|
4833 |
event = Event(start_datetime=first_date - datetime.timedelta(days=10), places=10, agenda=agenda)
|
|
4834 |
event.save()
|
|
4835 |
|
|
4836 |
events = Event.objects.filter(agenda_id=agenda.id).exclude(start_datetime__lt=now())
|
|
4837 |
assert len(events) == 3
|
|
4838 |
api_url = '/api/agenda/%s/datetimes/' % agenda.slug
|
|
4839 |
resp = app.get(api_url)
|
|
4840 |
assert len(resp.json['data']) == 3
|
|
4841 |
assert resp.json['meta'] == {
|
|
4842 |
'no_bookable_datetimes': False,
|
|
4843 |
'bookable_datetimes_number_total': 3,
|
|
4844 |
'bookable_datetimes_number_available': 3,
|
|
4845 |
'bookable_datetimes_first': '2017-05-21 17:00:00',
|
|
4846 |
}
|
|
4847 |
|
|
4848 |
def simulate_booking(event, nb_places):
|
|
4849 |
for i in range(nb_places):
|
|
4850 |
Booking(event=event).save()
|
|
4851 |
|
|
4852 |
simulate_booking(events[0], 10)
|
|
4853 |
resp = app.get(api_url)
|
|
4854 |
assert len(resp.json['data']) == 3
|
|
4855 |
assert resp.json['meta'] == {
|
|
4856 |
'no_bookable_datetimes': False,
|
|
4857 |
'bookable_datetimes_number_total': 3,
|
|
4858 |
'bookable_datetimes_number_available': 3,
|
|
4859 |
'bookable_datetimes_first': '2017-05-21 17:00:00',
|
|
4860 |
}
|
|
4861 |
|
|
4862 |
simulate_booking(events[0], 10)
|
|
4863 |
resp = app.get(api_url)
|
|
4864 |
assert len(resp.json['data']) == 3
|
|
4865 |
assert resp.json['meta'] == {
|
|
4866 |
'no_bookable_datetimes': False,
|
|
4867 |
'bookable_datetimes_number_total': 3,
|
|
4868 |
'bookable_datetimes_number_available': 2,
|
|
4869 |
'bookable_datetimes_first': '2017-05-22 17:00:00',
|
|
4870 |
}
|
|
4871 |
|
|
4872 |
simulate_booking(events[1], 20)
|
|
4873 |
simulate_booking(events[2], 20)
|
|
4874 |
resp = app.get(api_url)
|
|
4875 |
assert len(resp.json['data']) == 3
|
|
4876 |
assert resp.json['meta'] == {
|
|
4877 |
'no_bookable_datetimes': True,
|
|
4878 |
'bookable_datetimes_number_total': 3,
|
|
4879 |
'bookable_datetimes_number_available': 0,
|
|
4880 |
'bookable_datetimes_first': None,
|
|
4881 |
}
|
|
4882 |
|
|
4883 |
|
|
4884 |
def test_datetimes_api_meetings_agenda_meta(app, freezer):
|
|
4885 |
# 2017-05-20 -> saturday
|
|
4886 |
freezer.move_to(make_aware(datetime.datetime(year=2017, month=5, day=20, hour=1, minute=12)))
|
|
4887 |
meetings_agenda = Agenda.objects.create(
|
|
4888 |
label=u'Foo bar Meeting', kind='meetings', maximal_booking_delay=3
|
|
4889 |
)
|
|
4890 |
meeting_type = MeetingType(agenda=meetings_agenda, label='Blah', duration=30)
|
|
4891 |
meeting_type.save()
|
|
4892 |
|
|
4893 |
desk1 = Desk.objects.create(agenda=meetings_agenda, label='Desk 1')
|
|
4894 |
desk2 = Desk.objects.create(agenda=meetings_agenda, label='Desk 2')
|
|
4895 |
test_1st_weekday = (localtime(now()).weekday() + 2) % 7
|
|
4896 |
for desk in desk1, desk2:
|
|
4897 |
TimePeriod(
|
|
4898 |
weekday=test_1st_weekday,
|
|
4899 |
start_time=datetime.time(10, 0),
|
|
4900 |
end_time=datetime.time(12, 0),
|
|
4901 |
desk=desk,
|
|
4902 |
).save()
|
|
4903 |
|
|
4904 |
meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
|
|
4905 |
api_url = '/api/agenda/%s/meetings/%s/datetimes/' % (meeting_type.agenda.slug, meeting_type.slug)
|
|
4906 |
resp = app.get(api_url)
|
|
4907 |
assert len(resp.json['data']) == 4
|
|
4908 |
assert resp.json['data'][2]['disabled'] is False
|
|
4909 |
assert resp.json['meta'] == {
|
|
4910 |
'no_bookable_datetimes': False,
|
|
4911 |
'bookable_datetimes_number_total': 4,
|
|
4912 |
'bookable_datetimes_number_available': 4,
|
|
4913 |
'bookable_datetimes_first': '2017-05-22 10:00:00',
|
|
4914 |
}
|
|
4915 |
|
|
4916 |
def simulate_booking(slot, desk):
|
|
4917 |
dt = datetime.datetime.strptime(slot['id'].split(':')[1], '%Y-%m-%d-%H%M')
|
|
4918 |
ev = Event(
|
|
4919 |
agenda=meetings_agenda,
|
|
4920 |
meeting_type=meeting_type,
|
|
4921 |
places=1,
|
|
4922 |
full=False,
|
|
4923 |
start_datetime=make_aware(dt),
|
|
4924 |
desk=desk,
|
|
4925 |
)
|
|
4926 |
ev.save()
|
|
4927 |
booking = Booking(event=ev)
|
|
4928 |
booking.save()
|
|
4929 |
|
|
4930 |
simulate_booking(resp.json['data'][0], desk1)
|
|
4931 |
resp = app.get(api_url)
|
|
4932 |
assert len(resp.json['data']) == 4
|
|
4933 |
assert resp.json['data'][0]['disabled'] is False
|
|
4934 |
assert resp.json['meta'] == {
|
|
4935 |
'no_bookable_datetimes': False,
|
|
4936 |
'bookable_datetimes_number_total': 4,
|
|
4937 |
'bookable_datetimes_number_available': 4,
|
|
4938 |
'bookable_datetimes_first': '2017-05-22 10:00:00',
|
|
4939 |
}
|
|
4940 |
|
|
4941 |
simulate_booking(resp.json['data'][0], desk2)
|
|
4942 |
resp = app.get(api_url)
|
|
4943 |
assert len(resp.json['data']) == 4
|
|
4944 |
assert resp.json['data'][0]['disabled'] is True
|
|
4945 |
assert resp.json['meta'] == {
|
|
4946 |
'no_bookable_datetimes': False,
|
|
4947 |
'bookable_datetimes_number_total': 4,
|
|
4948 |
'bookable_datetimes_number_available': 3,
|
|
4949 |
'bookable_datetimes_first': '2017-05-22 10:30:00',
|
|
4950 |
}
|
|
4951 |
|
|
4952 |
for idx in range(1, 4):
|
|
4953 |
simulate_booking(resp.json['data'][idx], desk1)
|
|
4954 |
simulate_booking(resp.json['data'][idx], desk2)
|
|
4955 |
resp = app.get(api_url)
|
|
4956 |
assert len(resp.json['data']) == 4
|
|
4957 |
assert resp.json['meta'] == {
|
|
4958 |
'no_bookable_datetimes': True,
|
|
4959 |
'bookable_datetimes_number_total': 4,
|
|
4960 |
'bookable_datetimes_number_available': 0,
|
|
4961 |
'bookable_datetimes_first': None,
|
|
4962 |
}
|
|
4963 |
|
|
4964 |
|
|
4965 |
def test_datetimes_api_virtual_meetings_agenda_meta(app, freezer):
|
|
4966 |
# 2017-05-20 -> saturday
|
|
4967 |
freezer.move_to(make_aware(datetime.datetime(year=2017, month=5, day=20, hour=1, minute=12)))
|
|
4968 |
meetings_agenda1 = Agenda.objects.create(label=u'Foo Meeting', kind='meetings', maximal_booking_delay=3)
|
|
4969 |
meetings_agenda2 = Agenda.objects.create(label=u'Bar Meeting', kind='meetings', maximal_booking_delay=3)
|
|
4970 |
virtual_agenda = Agenda.objects.create(label=u'Agenda Virtual', kind='virtual', maximal_booking_delay=3)
|
|
4971 |
VirtualMember.objects.create(virtual_agenda=virtual_agenda, real_agenda=meetings_agenda1)
|
|
4972 |
VirtualMember.objects.create(virtual_agenda=virtual_agenda, real_agenda=meetings_agenda2)
|
|
4973 |
desk1 = Desk.objects.create(agenda=meetings_agenda1, label='Desk 1')
|
|
4974 |
desk2 = Desk.objects.create(agenda=meetings_agenda2, label='Desk 2')
|
|
4975 |
|
|
4976 |
test_1st_weekday = (localtime(now()).weekday() + 2) % 7
|
|
4977 |
for agenda, desk in zip((meetings_agenda1, meetings_agenda2), (desk1, desk2)):
|
|
4978 |
meeting_type = MeetingType.objects.create(agenda=agenda, label='Blah', duration=30)
|
|
4979 |
TimePeriod(
|
|
4980 |
weekday=test_1st_weekday,
|
|
4981 |
start_time=datetime.time(10, 0),
|
|
4982 |
end_time=datetime.time(12, 0),
|
|
4983 |
desk=desk,
|
|
4984 |
).save()
|
|
4985 |
|
|
4986 |
virt_meeting_type = virtual_agenda.iter_meetingtypes()[0]
|
|
4987 |
api_url = '/api/agenda/%s/meetings/%s/datetimes/' % (virtual_agenda.slug, virt_meeting_type.slug)
|
|
4988 |
resp = app.get(api_url)
|
|
4989 |
assert len(resp.json['data']) == 4
|
|
4990 |
assert resp.json['data'][2]['disabled'] is False
|
|
4991 |
assert resp.json['meta'] == {
|
|
4992 |
'no_bookable_datetimes': False,
|
|
4993 |
'bookable_datetimes_number_total': 4,
|
|
4994 |
'bookable_datetimes_number_available': 4,
|
|
4995 |
'bookable_datetimes_first': '2017-05-22 10:00:00',
|
|
4996 |
}
|
|
4997 |
|
|
4998 |
def simulate_booking(slot, agenda, desk):
|
|
4999 |
dt = datetime.datetime.strptime(slot['id'].split(':')[1], '%Y-%m-%d-%H%M')
|
|
5000 |
ev = Event(
|
|
5001 |
agenda=agenda,
|
|
5002 |
meeting_type=meeting_type,
|
|
5003 |
places=1,
|
|
5004 |
full=False,
|
|
5005 |
start_datetime=make_aware(dt),
|
|
5006 |
desk=desk,
|
|
5007 |
)
|
|
5008 |
ev.save()
|
|
5009 |
booking = Booking(event=ev)
|
|
5010 |
booking.save()
|
|
5011 |
|
|
5012 |
simulate_booking(resp.json['data'][0], meetings_agenda1, desk1)
|
|
5013 |
resp = app.get(api_url)
|
|
5014 |
assert len(resp.json['data']) == 4
|
|
5015 |
assert resp.json['data'][0]['disabled'] is False
|
|
5016 |
assert resp.json['meta'] == {
|
|
5017 |
'no_bookable_datetimes': False,
|
|
5018 |
'bookable_datetimes_number_total': 4,
|
|
5019 |
'bookable_datetimes_number_available': 4,
|
|
5020 |
'bookable_datetimes_first': '2017-05-22 10:00:00',
|
|
5021 |
}
|
|
5022 |
|
|
5023 |
simulate_booking(resp.json['data'][0], meetings_agenda2, desk2)
|
|
5024 |
resp = app.get(api_url)
|
|
5025 |
assert len(resp.json['data']) == 4
|
|
5026 |
assert resp.json['data'][0]['disabled'] is True
|
|
5027 |
assert resp.json['meta'] == {
|
|
5028 |
'no_bookable_datetimes': False,
|
|
5029 |
'bookable_datetimes_number_total': 4,
|
|
5030 |
'bookable_datetimes_number_available': 3,
|
|
5031 |
'bookable_datetimes_first': '2017-05-22 10:30:00',
|
|
5032 |
}
|
|
5033 |
|
|
5034 |
for idx in range(1, 4):
|
|
5035 |
simulate_booking(resp.json['data'][idx], meetings_agenda1, desk1)
|
|
5036 |
simulate_booking(resp.json['data'][idx], meetings_agenda2, desk2)
|
|
5037 |
resp = app.get(api_url)
|
|
5038 |
assert len(resp.json['data']) == 4
|
|
5039 |
assert resp.json['meta'] == {
|
|
5040 |
'no_bookable_datetimes': True,
|
|
5041 |
'bookable_datetimes_number_total': 4,
|
|
5042 |
'bookable_datetimes_number_available': 0,
|
|
5043 |
'bookable_datetimes_first': None,
|
|
5044 |
}
|
4820 |
|
-
|