api: add minutes filter on meetings datetimes endpoint (#73832)
gitea/chrono/pipeline/head This commit looks good
Details
gitea/chrono/pipeline/head This commit looks good
Details
parent
bdae8cd217
commit
1827cfe5c6
|
@ -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)
|
||||
)
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue