diff --git a/ietf/meeting/helpers.py b/ietf/meeting/helpers.py index a41d11d2a..812f47083 100644 --- a/ietf/meeting/helpers.py +++ b/ietf/meeting/helpers.py @@ -9,7 +9,7 @@ import re from tempfile import mkstemp from django.http import HttpRequest, Http404 -from django.db.models import Max, Q, Prefetch +from django.db.models import F, Max, Q, Prefetch from django.conf import settings from django.core.cache import cache from django.urls import reverse @@ -171,13 +171,17 @@ def get_schedule_by_name(meeting, owner, name): return meeting.schedule_set.filter(name = name).first() def preprocess_assignments_for_agenda(assignments_queryset, meeting, extra_prefetches=()): - assignments_queryset = assignments_queryset.select_related( - "timeslot", "timeslot__location", "timeslot__type", - ).prefetch_related( + assignments_queryset = assignments_queryset.prefetch_related( + 'timeslot', 'timeslot__type', 'timeslot__meeting', + 'timeslot__location', 'timeslot__location__floorplan', 'timeslot__location__urlresource_set', Prefetch( "session", queryset=add_event_info_to_session_qs(Session.objects.all().prefetch_related( 'group', 'group__charter', 'group__charter__group', + Prefetch('materials', + queryset=Document.objects.exclude(states__type=F("type"), states__slug='deleted').order_by('sessionpresentation__order').prefetch_related('states'), + to_attr='prefetched_active_materials' + ) )) ), *extra_prefetches @@ -222,6 +226,12 @@ def preprocess_assignments_for_agenda(assignments_queryset, meeting, extra_prefe if a.session and a.session.historic_group and a.session.historic_group.parent_id: a.session.historic_group.historic_parent = parent_replacements.get(a.session.historic_group.parent_id) + for d in a.session.prefetched_active_materials: + # make sure these are precomputed with the meeting instead + # of having to look it up + d.get_href(meeting=meeting) + d.get_versionless_href(meeting=meeting) + return assignments def read_session_file(type, num, doc): diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py index c73374d34..381d97631 100644 --- a/ietf/meeting/models.py +++ b/ietf/meeting/models.py @@ -398,14 +398,14 @@ class Room(models.Model): return self.functional_name # audio stream support def audio_stream_url(self): - urlresource = self.urlresource_set.filter(name_id='audiostream').first() - return urlresource.url if urlresource else None + urlresources = [ur for ur in self.urlresource_set.all() if ur.name_id == 'audiostream'] + return urlresources[0].url if urlresources else None def video_stream_url(self): - urlresource = self.urlresource_set.filter(name_id__in=['meetecho', ]).first() - return urlresource.url if urlresource else None + urlresources = [ur for ur in self.urlresource_set.all() if ur.name_id in ['meetecho']] + return urlresources[0].url if urlresources else None def webex_url(self): - urlresource = self.urlresource_set.filter(name_id__in=['webex', ]).first() - return urlresource.url if urlresource else None + urlresources = [ur for ur in self.urlresource_set.all() if ur.name_id in ['webex']] + return urlresources[0].url if urlresources else None # class Meta: ordering = ["-id"] diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index b8a847207..5000c68a9 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -32,7 +32,7 @@ from django.contrib.auth.decorators import login_required from django.core.exceptions import ValidationError from django.core.validators import URLValidator from django.urls import reverse,reverse_lazy -from django.db.models import F, Min, Max, Prefetch, Q +from django.db.models import F, Min, Max, Q from django.forms.models import modelform_factory, inlineformset_factory from django.template import TemplateDoesNotExist from django.template.loader import render_to_string @@ -1319,11 +1319,6 @@ def agenda_json(request, num=None ): # Update the assignments with historic information, i.e., valid at the # time of the meeting assignments = preprocess_assignments_for_agenda(assignments, meeting, extra_prefetches=[ - # sadly, these prefetches aren't enough to get rid of all implicit queries below - Prefetch("session__materials", - queryset=Document.objects.exclude(states__type=F("type"),states__slug='deleted').select_related("group").order_by("sessionpresentation__order"), - to_attr="prefetched_active_materials", - ), "session__materials__docevent_set", "session__sessionpresentation_set", "timeslot__meeting" diff --git a/ietf/templates/meeting/edit_meeting_schedule_session.html b/ietf/templates/meeting/edit_meeting_schedule_session.html index 760cb2ea9..01f6cce1e 100644 --- a/ietf/templates/meeting/edit_meeting_schedule_session.html +++ b/ietf/templates/meeting/edit_meeting_schedule_session.html @@ -1,4 +1,4 @@ -