agenda: add get_max_meeting_duration method (#53313)

This commit is contained in:
Benjamin Dauvergne 2021-04-21 11:44:32 +02:00
parent 0bb2ca3676
commit 3952fe604b
4 changed files with 19 additions and 4 deletions

View File

@ -41,6 +41,7 @@ from django.utils import functional
from django.utils.dates import WEEKDAYS
from django.utils.encoding import force_text
from django.utils.formats import date_format
from django.utils.functional import cached_property
from django.utils.module_loading import import_string
from django.utils.text import slugify
from django.utils.timezone import is_aware, localtime, make_aware, make_naive, now, utc
@ -250,6 +251,10 @@ class Agenda(models.Model):
return self.real_agendas.all()
return [self]
@cached_property
def cached_meetingtypes(self):
return list(self.iter_meetingtypes())
def iter_meetingtypes(self, excluded_agenda=None):
"""Expose agenda's meetingtypes.
straighforward on a real agenda
@ -281,7 +286,7 @@ class Agenda(models.Model):
if self.kind == 'virtual':
match = id_ or slug
meeting_type = None
for mt in self.iter_meetingtypes():
for mt in self.cached_meetingtypes:
if mt.slug == match:
meeting_type = mt
break
@ -296,8 +301,11 @@ class Agenda(models.Model):
def get_virtual_members(self):
return VirtualMember.objects.filter(virtual_agenda=self)
def get_max_meeting_duration(self):
return max(x.duration for x in self.cached_meetingtypes)
def get_base_meeting_duration(self):
durations = [x.duration for x in self.iter_meetingtypes()]
durations = [x.duration for x in self.cached_meetingtypes]
if not durations:
raise ValueError()
gcd = durations[0]

View File

@ -764,14 +764,17 @@ def test_base_meeting_duration():
meeting_type = MeetingType(agenda=agenda, label='Foo', duration=30)
meeting_type.save()
del agenda.__dict__['cached_meetingtypes']
assert agenda.get_base_meeting_duration() == 30
meeting_type = MeetingType(agenda=agenda, label='Bar', duration=60)
meeting_type.save()
del agenda.__dict__['cached_meetingtypes']
assert agenda.get_base_meeting_duration() == 30
meeting_type = MeetingType(agenda=agenda, label='Bar', duration=45)
meeting_type.save()
del agenda.__dict__['cached_meetingtypes']
assert agenda.get_base_meeting_duration() == 15
@ -896,10 +899,12 @@ def test_virtual_agenda_base_meeting_duration():
meeting_type = MeetingType(agenda=agenda1, label='Foo', duration=30)
meeting_type.save()
del virt_agenda.__dict__['cached_meetingtypes']
assert virt_agenda.get_base_meeting_duration() == 30
meeting_type = MeetingType(agenda=agenda1, label='Bar', duration=60)
meeting_type.save()
del virt_agenda.__dict__['cached_meetingtypes']
assert virt_agenda.get_base_meeting_duration() == 30
agenda2 = Agenda.objects.create(label='Agenda 2', kind='meetings')
@ -908,6 +913,7 @@ def test_virtual_agenda_base_meeting_duration():
meeting_type = MeetingType(agenda=agenda2, label='Bar', duration=60)
meeting_type.save()
del virt_agenda.__dict__['cached_meetingtypes']
assert virt_agenda.get_base_meeting_duration() == 60

View File

@ -5070,7 +5070,7 @@ def test_virtual_agendas_meetings_datetimes_multiple_agendas(app, mock_now):
with CaptureQueriesContext(connection) as ctx:
resp = app.get(api_url)
assert len(resp.json['data']) == 12
assert len(ctx.captured_queries) == 12
assert len(ctx.captured_queries) == 10
# simulate booking
dt = datetime.datetime.strptime(resp.json['data'][2]['id'].split(':')[1], '%Y-%m-%d-%H%M')
@ -5199,7 +5199,7 @@ def test_virtual_agendas_meetings_datetimes_exclude_slots(app):
'/api/agenda/%s/meetings/%s/datetimes/' % (virt_agenda.slug, meeting_type.slug),
params={'exclude_user_external_id': '42'},
)
assert len(ctx.captured_queries) == 13
assert len(ctx.captured_queries) == 11
assert resp.json['data'][0]['id'] == 'foo-bar:2021-02-26-0900'
assert resp.json['data'][0]['disabled'] is True
assert resp.json['data'][2]['id'] == 'foo-bar:2021-02-26-1000'

View File

@ -100,6 +100,7 @@ def test_timeperiod_time_slots():
# shorter duration -> double the events
meeting_type.duration = 30
meeting_type.save()
del agenda.__dict__['cached_meetingtypes']
timeperiod = TimePeriod(
desk=desk, weekday=5, start_time=datetime.time(9, 0), end_time=datetime.time(12, 0)
)