Skip to content

Commit b7232d0

Browse files
committed
Revamp tracked/not tracked icons in search results to not do one query
per document, and make them work on all search result pages, move the utility function to community/ - Legacy-Id: 10690
1 parent 22e2a6a commit b7232d0

5 files changed

Lines changed: 31 additions & 37 deletions

File tree

ietf/community/utils.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from ietf.community.models import CommunityList
12
from ietf.group.models import Role
23

34
def can_manage_community_list_for_group(user, group):
@@ -11,3 +12,16 @@ def can_manage_community_list_for_group(user, group):
1112
else:
1213
return False
1314

15+
def augment_docs_with_tracking_info(docs, user):
16+
"""Add attribute to each document with whether the document is tracked
17+
by the user or not."""
18+
19+
tracked = set()
20+
21+
if user and user.is_authenticated():
22+
clist = CommunityList.objects.filter(user=user).first()
23+
if clist:
24+
tracked.update(clist.get_documents().filter(pk__in=docs).values_list("pk", flat=True))
25+
26+
for d in docs:
27+
d.tracked_in_personal_community_list = d.pk in tracked

ietf/doc/views_search.py

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,13 @@
3333
import datetime, re
3434

3535
from django import forms
36-
from django.core.exceptions import ObjectDoesNotExist
3736
from django.core.urlresolvers import reverse as urlreverse
3837
from django.shortcuts import render
3938
from django.db.models import Q
4039
from django.http import Http404, HttpResponseBadRequest, HttpResponse, HttpResponseRedirect
4140

4241
import debug # pyflakes:ignore
4342

44-
from ietf.community.models import CommunityList
4543
from ietf.doc.models import ( Document, DocHistory, DocAlias, State, RelatedDocument,
4644
DocEvent, LastCallDocEvent, TelechatDocEvent, IESG_SUBSTATE_TAGS )
4745
from ietf.doc.expire import expirable_draft
@@ -51,6 +49,7 @@
5149
from ietf.name.models import DocTagName, DocTypeName, StreamName
5250
from ietf.person.models import Person
5351
from ietf.utils.draft_search import normalize_draftname
52+
from ietf.community.utils import augment_docs_with_tracking_info
5453

5554

5655
class SearchForm(forms.Form):
@@ -201,9 +200,9 @@ def fill_in_search_attributes(docs):
201200
l.sort()
202201

203202

204-
def retrieve_search_results(form, all_types=False):
205-
203+
def retrieve_search_results(form, request, all_types=False):
206204
"""Takes a validated SearchForm and return the results."""
205+
207206
if not form.is_valid():
208207
raise ValueError("SearchForm doesn't validate: %s" % form.errors)
209208

@@ -322,6 +321,8 @@ def sort_key(d):
322321

323322
results.sort(key=sort_key)
324323

324+
augment_docs_with_tracking_info(results, request.user)
325+
325326
# fill in a meta dict with some information for rendering the result table
326327
if len(results) == MAX:
327328
meta['max'] = MAX
@@ -345,21 +346,6 @@ def sort_key(d):
345346
return (results, meta)
346347

347348

348-
def get_doc_is_tracked(request, results):
349-
# Determine whether each document is being tracked or not, and remember
350-
# that so we can display the proper track/untrack option.
351-
doc_is_tracked = { }
352-
if request.user.is_authenticated():
353-
try:
354-
clist = CommunityList.objects.get(user=request.user)
355-
clist.update()
356-
except ObjectDoesNotExist:
357-
return doc_is_tracked
358-
for doc in results:
359-
if clist.get_documents().filter(name=doc.name).count() > 0:
360-
doc_is_tracked[doc.name] = True
361-
return doc_is_tracked
362-
363349
def search(request):
364350
if request.GET:
365351
# backwards compatibility
@@ -375,17 +361,15 @@ def search(request):
375361
if not form.is_valid():
376362
return HttpResponseBadRequest("form not valid: %s" % form.errors)
377363

378-
results, meta = retrieve_search_results(form)
364+
results, meta = retrieve_search_results(form, request)
379365
meta['searching'] = True
380366
else:
381367
form = SearchForm()
382368
results = []
383369
meta = { 'by': None, 'advanced': False, 'searching': False }
384370

385-
doc_is_tracked = get_doc_is_tracked(request, results)
386-
387371
return render(request, 'doc/search/search.html', {
388-
'form':form, 'docs':results, 'doc_is_tracked':doc_is_tracked, 'meta':meta, },
372+
'form':form, 'docs':results, 'meta':meta, },
389373
)
390374

391375
def frontpage(request):
@@ -550,7 +534,7 @@ def docs_for_ad(request, name):
550534
form = SearchForm({'by':'ad','ad': ad.id,
551535
'rfcs':'on', 'activedrafts':'on', 'olddrafts':'on',
552536
'sort': 'status'})
553-
results, meta = retrieve_search_results(form, all_types=True)
537+
results, meta = retrieve_search_results(form, request, all_types=True)
554538
results.sort(key=ad_dashboard_sort_key)
555539
del meta["headers"][-1]
556540
#
@@ -564,7 +548,7 @@ def docs_for_ad(request, name):
564548
def drafts_in_last_call(request):
565549
lc_state = State.objects.get(type="draft-iesg", slug="lc").pk
566550
form = SearchForm({'by':'state','state': lc_state, 'rfcs':'on', 'activedrafts':'on'})
567-
results, meta = retrieve_search_results(form)
551+
results, meta = retrieve_search_results(form, request)
568552

569553
return render(request, 'doc/drafts_in_last_call.html', {
570554
'form':form, 'docs':results, 'meta':meta

ietf/group/info.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
from django.db.models import Q
4848
from django.utils.safestring import mark_safe
4949

50-
from ietf.doc.views_search import SearchForm, retrieve_search_results, get_doc_is_tracked
50+
from ietf.doc.views_search import SearchForm, retrieve_search_results
5151
from ietf.doc.models import Document, State, DocAlias, RelatedDocument
5252
from ietf.doc.utils import get_chartering_type
5353
from ietf.doc.templatetags.ietf_filters import clean_whitespace
@@ -378,13 +378,13 @@ def construct_group_menu_context(request, group, selected, group_type, others):
378378

379379
return d
380380

381-
def search_for_group_documents(group):
381+
def search_for_group_documents(group, request):
382382
form = SearchForm({ 'by':'group', 'group': group.acronym or "", 'rfcs':'on', 'activedrafts': 'on' })
383-
docs, meta = retrieve_search_results(form)
383+
docs, meta = retrieve_search_results(form, request)
384384

385385
# get the related docs
386386
form_related = SearchForm({ 'by':'group', 'name': u'-%s-' % group.acronym, 'activedrafts': 'on' })
387-
raw_docs_related, meta_related = retrieve_search_results(form_related)
387+
raw_docs_related, meta_related = retrieve_search_results(form_related, request)
388388

389389
docs_related = []
390390
for d in raw_docs_related:
@@ -423,17 +423,13 @@ def group_documents(request, acronym, group_type=None):
423423
if not group.features.has_documents:
424424
raise Http404
425425

426-
docs, meta, docs_related, meta_related = search_for_group_documents(group)
427-
428-
doc_is_tracked = get_doc_is_tracked(request, docs)
429-
doc_is_tracked.update(get_doc_is_tracked(request, docs_related))
426+
docs, meta, docs_related, meta_related = search_for_group_documents(group, request)
430427

431428
context = construct_group_menu_context(request, group, "documents", group_type, {
432429
'docs': docs,
433430
'meta': meta,
434431
'docs_related': docs_related,
435432
'meta_related': meta_related,
436-
'doc_is_tracked': doc_is_tracked,
437433
})
438434

439435
return render(request, 'group/group_documents.html', context)
@@ -444,7 +440,7 @@ def group_documents_txt(request, acronym, group_type=None):
444440
if not group.features.has_documents:
445441
raise Http404
446442

447-
docs, meta, docs_related, meta_related = search_for_group_documents(group)
443+
docs, meta, docs_related, meta_related = search_for_group_documents(group, request)
448444

449445
for d in docs:
450446
d.prefix = d.get_state().name

ietf/group/views_stream.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def stream_documents(request, acronym):
2929
stream = StreamName.objects.get(slug=acronym)
3030
form = SearchForm({'by':'stream', 'stream':acronym,
3131
'rfcs':'on', 'activedrafts':'on'})
32-
docs, meta = retrieve_search_results(form)
32+
docs, meta = retrieve_search_results(form, request)
3333
return render_to_response('group/stream_documents.html', {'stream':stream, 'docs':docs, 'meta':meta, 'editable':editable }, context_instance=RequestContext(request))
3434

3535
class StreamEditForm(forms.Form):

ietf/templates/doc/search/search_result_row.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
<td>
1515
{% if user.is_authenticated %}
16-
{% if doc.name in doc_is_tracked %}
16+
{% if doc.tracked_in_personal_community_list %}
1717
<a href="{% url "community_personal_untrack_document" doc.name %}" class="community-list-add-remove-doc" title="Remove from your personal ID list">
1818
<span class="fa fa-bookmark"></span>
1919
</a>

0 commit comments

Comments
 (0)