Skip to content

Commit 421621e

Browse files
committed
Another round of iesg page optimizations. Reduced additional instances of individual lookups to a single lookup followed by annotation of document objects. Reduced several instances of repeating the same work multiple times (queries for telechat documents, queries for telechat dates).
- Legacy-Id: 15010
1 parent 67a17bb commit 421621e

6 files changed

Lines changed: 84 additions & 46 deletions

File tree

ietf/doc/utils_search.py

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,34 @@
44
import debug # pyflakes:ignore
55

66
from ietf.community.utils import augment_docs_with_tracking_info
7-
from ietf.doc.models import Document, DocAlias, RelatedDocument, DocEvent, TelechatDocEvent
7+
from ietf.doc.models import Document, DocAlias, RelatedDocument, DocEvent, TelechatDocEvent, BallotDocEvent
88
from ietf.doc.expire import expirable_draft
9-
from ietf.meeting.models import SessionPresentation
9+
1010

1111
def wrap_value(v):
1212
return lambda: v
1313

1414

15-
def fill_in_document_table_attributes(docs):
15+
def fill_in_telechat_date(docs, doc_dict=None, doc_ids=None):
16+
if doc_dict is None:
17+
doc_dict = dict((d.pk, d) for d in docs)
18+
doc_ids = doc_dict.keys()
19+
if doc_ids is None:
20+
doc_ids = doc_dict.keys()
21+
22+
seen = set()
23+
for e in TelechatDocEvent.objects.filter(doc__in=doc_ids, type="scheduled_for_telechat").order_by('-time'):
24+
if e.doc_id not in seen:
25+
d = doc_dict[e.doc_id]
26+
d.telechat_date = wrap_value(d.telechat_date(e))
27+
seen.add(e.doc_id)
28+
29+
def fill_in_document_table_attributes(docs, have_telechat_date=False):
1630
# fill in some attributes for the document table results to save
1731
# some hairy template code and avoid repeated SQL queries
1832

19-
docs_dict = dict((d.pk, d) for d in docs)
20-
doc_ids = docs_dict.keys()
33+
doc_dict = dict((d.pk, d) for d in docs)
34+
doc_ids = doc_dict.keys()
2135

2236
rfc_aliases = dict(DocAlias.objects.filter(name__startswith="rfc", document__in=doc_ids).values_list("document", "name"))
2337

@@ -32,22 +46,26 @@ def fill_in_document_table_attributes(docs):
3246
d.latest_event_cache[e] = None
3347

3448
for e in DocEvent.objects.filter(doc__in=doc_ids, type__in=event_types).order_by('time'):
35-
docs_dict[e.doc_id].latest_event_cache[e.type] = e
49+
doc_dict[e.doc_id].latest_event_cache[e.type] = e
3650

37-
# telechat date, can't do this with above query as we need to get TelechatDocEvents out
3851
seen = set()
39-
for e in TelechatDocEvent.objects.filter(doc__in=doc_ids, type="scheduled_for_telechat").order_by('-time'):
40-
if e.doc_id not in seen:
41-
d = docs_dict[e.doc_id]
42-
d.telechat_date = wrap_value(d.telechat_date(e))
52+
for e in BallotDocEvent.objects.filter(doc__in=doc_ids, type__in=('created_ballot', 'closed_ballot')).order_by('-time'):
53+
if not e.doc_id in seen:
54+
doc_dict[e.doc_id].ballot = e if e.type == 'created_ballot' else None
4355
seen.add(e.doc_id)
4456

57+
if not have_telechat_date:
58+
fill_in_telechat_date(docs, doc_dict, doc_ids)
59+
4560
# on agenda in upcoming meetings
46-
presentations = SessionPresentation.objects.filter(session__meeting__date__gte=datetime.date.today()-datetime.timedelta(days=7)).select_related('session', 'document')
47-
session_list = [ (p.document, p.session) for p in presentations ]
48-
sessions = dict( (d, []) for (d, s) in session_list )
49-
for (d, s) in session_list:
50-
sessions[d].append(s)
61+
sessions = {}
62+
# debug.mark()
63+
# presentations = SessionPresentation.objects.filter(session__meeting__date__gte=datetime.date.today()-datetime.timedelta(days=7)).select_related('session', 'document')
64+
# session_list = [ (p.document, p.session) for p in presentations ]
65+
# sessions = dict( (d, []) for (d, s) in session_list )
66+
# for (d, s) in session_list:
67+
# sessions[d].append(s)
68+
# debug.clock('presentations')
5169

5270
# misc
5371
for d in docs:
@@ -79,6 +97,9 @@ def fill_in_document_table_attributes(docs):
7997

8098
d.sessions = sessions[d] if d in sessions else []
8199

100+
e = d.latest_event_cache.get('started_iesg_proces', None)
101+
d.balloting_started = e.time if e else datetime.datetime.min
102+
82103
# RFCs
83104

84105
# errata
@@ -88,7 +109,7 @@ def fill_in_document_table_attributes(docs):
88109

89110
# obsoleted/updated by
90111
for a in rfc_aliases:
91-
d = docs_dict[a]
112+
d = doc_dict[a]
92113
d.obsoleted_by_list = []
93114
d.updated_by_list = []
94115

@@ -97,7 +118,7 @@ def fill_in_document_table_attributes(docs):
97118
rel_rfc_aliases = dict(DocAlias.objects.filter(name__startswith="rfc",
98119
document__in=[rel.source_id for rel in xed_by]).values_list('document', 'name'))
99120
for rel in xed_by:
100-
d = docs_dict[rel.target.document_id]
121+
d = doc_dict[rel.target.document_id]
101122
if rel.relationship_id == "obs":
102123
l = d.obsoleted_by_list
103124
elif rel.relationship_id == "updates":

ietf/group/views.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ def chartering_groups(request):
382382

383383
for g in t.chartering_groups:
384384
g.chartering_type = get_chartering_type(g.charter)
385+
g.charter.ballot = g.charter.active_ballot()
385386

386387
return render(request, 'group/chartering_groups.html',
387388
dict(charter_states=charter_states,

ietf/iesg/agenda.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
from django.conf import settings
88
from django.http import Http404
99

10-
from ietf.doc.models import Document, TelechatDocEvent, LastCallDocEvent, ConsensusDocEvent
10+
from ietf.doc.models import Document, LastCallDocEvent, ConsensusDocEvent
11+
from ietf.doc.utils_search import fill_in_telechat_date
1112
from ietf.iesg.models import TelechatDate, TelechatAgendaItem
1213
from ietf.review.utils import review_requests_to_list_for_docs
1314

@@ -147,19 +148,21 @@ def fill_in_agenda_administrivia(date, sections):
147148

148149
sections[s]["text"] = t
149150

150-
def fill_in_agenda_docs(date, sections, matches=None):
151-
if not matches:
152-
matches = Document.objects.filter(docevent__telechatdocevent__telechat_date=date)
153-
matches = matches.select_related("stream", "group").distinct()
151+
def fill_in_agenda_docs(date, sections, docs=None):
152+
if not docs:
153+
docs = Document.objects.filter(docevent__telechatdocevent__telechat_date=date)
154+
docs = docs.select_related("stream", "group").distinct()
155+
fill_in_telechat_date(docs)
154156

155-
review_requests_for_docs = review_requests_to_list_for_docs(matches)
157+
review_requests_for_docs = review_requests_to_list_for_docs(docs)
156158

157-
for doc in matches:
158-
if doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat").telechat_date != date:
159+
for doc in docs:
160+
if doc.telechat_date() != date:
159161
continue
160162

161-
e = doc.latest_event(type="started_iesg_process")
162-
doc.balloting_started = e.time if e else datetime.datetime.min
163+
if not hasattr(doc, 'balloting_started'):
164+
e = doc.latest_event(type="started_iesg_process")
165+
doc.balloting_started = e.time if e else datetime.datetime.min
163166

164167
if doc.type_id == "draft":
165168
s = doc.get_state("draft-iana-review")

ietf/iesg/utils.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import debug # pyflakes:ignore
44

5-
from ietf.doc.models import Document, TelechatDocEvent, STATUSCHANGE_RELATIONS
5+
from ietf.doc.models import Document, STATUSCHANGE_RELATIONS
6+
from ietf.doc.utils_search import fill_in_telechat_date
67
from ietf.iesg.agenda import get_doc_section
78

9+
810
TelechatPageCount = namedtuple('TelechatPageCount',['for_approval','for_action','related'])
911

1012
def telechat_page_count(date=None, docs=None):
@@ -13,7 +15,8 @@ def telechat_page_count(date=None, docs=None):
1315

1416
if not docs:
1517
candidates = Document.objects.filter(docevent__telechatdocevent__telechat_date=date).distinct()
16-
docs = [ doc for doc in candidates if doc.latest_event(TelechatDocEvent,type='scheduled_for_telechat').telechat_date==date ]
18+
fill_in_telechat_date(candidates)
19+
docs = [ doc for doc in candidates if doc.telechat_date()==date ]
1720

1821
for_action =[d for d in docs if get_doc_section(d).endswith('.3')]
1922

ietf/iesg/views.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,18 @@
4949
from django.http import HttpResponse
5050
from django.shortcuts import render, redirect
5151
from django.contrib.sites.models import Site
52+
#from django.views.decorators.cache import cache_page
53+
#from django.views.decorators.vary import vary_on_cookie
5254

53-
54-
from ietf.doc.models import Document, State, TelechatDocEvent, LastCallDocEvent, ConsensusDocEvent, DocEvent, IESG_BALLOT_ACTIVE_STATES
55+
from ietf.doc.models import Document, State, LastCallDocEvent, ConsensusDocEvent, DocEvent, IESG_BALLOT_ACTIVE_STATES
5556
from ietf.doc.utils import update_telechat, augment_events_with_revision
5657
from ietf.group.models import GroupMilestone, Role
5758
from ietf.iesg.agenda import agenda_data, agenda_sections, fill_in_agenda_docs, get_agenda_date
5859
from ietf.iesg.models import TelechatDate
5960
from ietf.iesg.utils import telechat_page_count
6061
from ietf.ietfauth.utils import has_role, role_required, user_is_person
6162
from ietf.person.models import Person
62-
from ietf.doc.utils_search import fill_in_document_table_attributes
63+
from ietf.doc.utils_search import fill_in_document_table_attributes, fill_in_telechat_date
6364

6465
def review_decisions(request, year=None):
6566
events = DocEvent.objects.filter(type__in=("iesg_disapproved", "iesg_approved"))
@@ -288,8 +289,11 @@ def agenda_package(request, date=None):
288289
def agenda_documents_txt(request):
289290
dates = list(TelechatDate.objects.active().order_by('date').values_list("date", flat=True)[:4])
290291

292+
all_docs = Document.objects.filter(docevent__telechatdocevent__telechat_date__in=dates).distinct()
291293
docs = []
292-
for d in Document.objects.filter(docevent__telechatdocevent__telechat_date__in=dates).distinct():
294+
fill_in_telechat_date(all_docs)
295+
296+
for d in all_docs:
293297
date = d.telechat_date()
294298
if date in dates:
295299
d.computed_telechat_date = date
@@ -358,11 +362,13 @@ def agenda_documents(request):
358362
dates = list(TelechatDate.objects.active().order_by('date').values_list("date", flat=True)[:4])
359363

360364
docs_by_date = dict((d, []) for d in dates)
361-
for doc in (Document.objects
362-
.filter(docevent__telechatdocevent__telechat_date__in=dates)
363-
.select_related('stream', 'group', 'intended_std_level')
364-
.distinct()):
365-
d = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat").telechat_date
365+
docs = Document.objects.filter(docevent__telechatdocevent__telechat_date__in=dates).distinct()
366+
docs = docs.select_related("ad", "std_level", "intended_std_level", "group", "stream", "shepherd", )
367+
# No prefetch-related -- turns out not to be worth it
368+
369+
fill_in_telechat_date(docs)
370+
for doc in docs:
371+
d = doc.telechat_date()
366372
if d in docs_by_date:
367373
docs_by_date[d].append(doc)
368374

@@ -380,13 +386,13 @@ def agenda_documents(request):
380386
sections = agenda_sections()
381387
# augment the docs with the search attributes, since we're using
382388
# the search_result_row view to display them (which expects them)
383-
fill_in_document_table_attributes(docs_by_date[date])
389+
fill_in_document_table_attributes(docs_by_date[date], have_telechat_date=True)
384390
fill_in_agenda_docs(date, sections, docs_by_date[date])
385391
pages = telechat_page_count(docs=docs_by_date[date]).for_approval
386392

387393
telechats.append({
388-
"date":date,
389-
"pages":pages,
394+
"date": date,
395+
"pages": pages,
390396
"sections": sorted((num, section) for num, section in sections.iteritems()
391397
if "2" <= num < "5")
392398
})
@@ -417,6 +423,7 @@ def past_documents(request):
417423
doc.milestones = doc.groupmilestone_set.filter(state="active").order_by("time").select_related("group")
418424
doc.blocking_positions = blocking_positions
419425
doc.telechat = doc.previous_telechat_date()
426+
doc.ballot = ballot
420427

421428
if doc.telechat:
422429
docs.append(doc)
@@ -431,9 +438,11 @@ def past_documents(request):
431438
def telechat_docs_tarfile(request, date):
432439
date = get_agenda_date(date)
433440

441+
all_docs = Document.objects.filter(docevent__telechatdocevent__telechat_date=date).distinct()
442+
fill_in_telechat_date(all_docs)
434443
docs = []
435-
for d in Document.objects.filter(docevent__telechatdocevent__telechat_date=date).distinct():
436-
if d.latest_event(TelechatDocEvent, type="scheduled_for_telechat").telechat_date == date:
444+
for d in all_docs:
445+
if d.telechat_date() == date:
437446
docs.append(d)
438447

439448
response = HttpResponse(content_type='application/octet-stream')
@@ -491,6 +500,7 @@ def discusses(request):
491500
doc.for_me = user_is_person(request.user, doc.ad)
492501
doc.milestones = doc.groupmilestone_set.filter(state="active").order_by("time").select_related("group")
493502
doc.blocking_positions = blocking_positions
503+
doc.ballot = ballot
494504

495505
docs.append(doc)
496506

ietf/templates/doc/search/status_columns.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
{% load ietf_filters ballot_icon %}
33

44
<td class="status">
5-
<div class="pull-right">
6-
{% ballot_icon doc %}
5+
<div class="pull-right" id="ballot-icon-{{doc.name}}">
6+
{% if doc.ballot %}{% ballot_icon doc %}{% endif %}
77
</div>
88

99
{% if not doc.get_state_slug == "rfc" %}

0 commit comments

Comments
 (0)