api: add minutes filter on meetings datetimes endpoint (#73832)
gitea/chrono/pipeline/head This commit looks good Details

This commit is contained in:
Emmanuel Cazenave 2023-02-16 15:56:26 +01:00
parent bdae8cd217
commit 1827cfe5c6
3 changed files with 68 additions and 0 deletions

View File

@ -772,3 +772,9 @@ class SharedCustodyAgendaSerializer(SharedCustodyAgendaMixin, serializers.ModelS
def get_child_id(self, attrs):
return self.instance.child.user_external_id
class MinutesSerializer(serializers.Serializer):
minutes = CommaSeparatedStringField(
required=False, child=serializers.IntegerField(min_value=0, max_value=59)
)

View File

@ -700,6 +700,13 @@ def get_start_and_end_datetime_from_request(request):
return serializer.validated_data.get('date_start'), serializer.validated_data.get('date_end')
def get_minutes_from_request(request):
serializer = serializers.MinutesSerializer(data=request.query_params)
if not serializer.is_valid():
raise APIErrorBadRequest(N_('invalid payload'), errors=serializer.errors)
return serializer.validated_data.get('minutes')
def make_booking(event, payload, extra_data, primary_booking=None, in_waiting_list=False, color=None):
out_of_min_delay = False
if event.agenda.min_booking_datetime and event.start_datetime < event.agenda.min_booking_datetime:
@ -1021,6 +1028,7 @@ class MeetingDatetimes(APIView):
resources = get_resources_from_request(request, agenda)
start_datetime, end_datetime = get_start_and_end_datetime_from_request(request)
minutes = get_minutes_from_request(request)
booked_user_external_id = request.GET.get('user_external_id') or None
excluded_user_external_id = request.GET.get('exclude_user_external_id') or None
if (
@ -1085,6 +1093,8 @@ class MeetingDatetimes(APIView):
for slot in generator_of_unique_slots:
if request.GET.get('hide_disabled') and slot.full:
continue
if minutes and slot.start_datetime.minute not in minutes:
continue
# Make virtual id for a slot, combining meeting_type.id and
# iso-format of date and time.

View File

@ -2608,3 +2608,55 @@ def test_datetimes_end_datetime(app):
('2023-03-10 10:00:00', '2023-03-10 10:30:00'),
('2023-03-10 10:30:00', '2023-03-10 11:00:00'),
]
def test_datetimes_api_meetings_agenda_filter_minutes(app):
agenda = Agenda(
label='Foo bar Meeting', kind='meetings', minimal_booking_delay=0, maximal_booking_delay=2
)
agenda.save()
meeting_type = MeetingType(agenda=agenda, label='Blah', duration=15)
meeting_type.save()
tomorrow_weekday = (localtime(now()).weekday() + 1) % 7
default_desk, _ = Desk.objects.get_or_create(agenda=agenda, label='Desk 1')
time_period = TimePeriod(
weekday=tomorrow_weekday,
start_time=datetime.time(10, 0),
end_time=datetime.time(12, 0),
desk=default_desk,
)
time_period.save()
api_url = '/api/agenda/%s/meetings/%s/datetimes/' % (meeting_type.agenda.slug, meeting_type.slug)
resp = app.get(api_url)
assert len(resp.json['data']) == 8
assert datetime_from_str(resp.json['data'][0]['datetime']).minute == 0
assert datetime_from_str(resp.json['data'][1]['datetime']).minute == 15
assert datetime_from_str(resp.json['data'][2]['datetime']).minute == 30
assert datetime_from_str(resp.json['data'][3]['datetime']).minute == 45
assert datetime_from_str(resp.json['data'][4]['datetime']).minute == 0
assert datetime_from_str(resp.json['data'][5]['datetime']).minute == 15
assert datetime_from_str(resp.json['data'][6]['datetime']).minute == 30
assert datetime_from_str(resp.json['data'][7]['datetime']).minute == 45
# filter on minutes
api_url = '/api/agenda/%s/meetings/%s/datetimes/?minutes=0' % (
meeting_type.agenda.slug,
meeting_type.slug,
)
resp = app.get(api_url)
assert len(resp.json['data']) == 2
assert datetime_from_str(resp.json['data'][0]['datetime']).minute == 0
assert datetime_from_str(resp.json['data'][1]['datetime']).minute == 0
# filter on minutes, with more choices
api_url = '/api/agenda/%s/meetings/%s/datetimes/?minutes=0,30' % (
meeting_type.agenda.slug,
meeting_type.slug,
)
resp = app.get(api_url)
assert len(resp.json['data']) == 4
assert datetime_from_str(resp.json['data'][0]['datetime']).minute == 0
assert datetime_from_str(resp.json['data'][1]['datetime']).minute == 30
assert datetime_from_str(resp.json['data'][2]['datetime']).minute == 0
assert datetime_from_str(resp.json['data'][3]['datetime']).minute == 30