agenda: add get_max_meeting_duration method (#53313)
This commit is contained in:
parent
0bb2ca3676
commit
3952fe604b
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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)
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue