Skip to content

Commit 4e5ce99

Browse files
committed
Merged [2967] from jelte@nlnetlabs.nl:
Make search result table headers clickable; clicking will sort on said column, see trac ietf-tools#484 - Legacy-Id: 2974 Note: SVN reference [2967] has been migrated to Git commit a6ef460
1 parent 662514f commit 4e5ce99

6 files changed

Lines changed: 98 additions & 11 deletions

File tree

ietf/idrfc/idrfc_wrapper.py

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -576,13 +576,47 @@ def view_sort_group(self):
576576
return 'Active Internet-Draft'
577577
else:
578578
return 'Old Internet-Draft'
579-
def view_sort_key(self):
580-
if self.rfc:
581-
return "2%04d" % self.rfc.rfc_number
582-
elif self.id.draft_status == "Active":
583-
return "1"+self.id.draft_name
579+
580+
def view_sort_key(self, sort_by=None):
581+
if sort_by is None:
582+
if self.rfc:
583+
return "2%04d" % self.rfc.rfc_number
584+
elif self.id.draft_status == "Active":
585+
return "1"+self.id.draft_name
586+
else:
587+
return "3"+self.id.draft_name
584588
else:
585-
return "3"+self.id.draft_name
589+
if self.rfc:
590+
sort_key = "2"
591+
elif self.id.draft_status == "Active":
592+
sort_key = "1"
593+
else:
594+
sort_key = "3"
595+
596+
# Depending on what we're sorting on, we may
597+
# need to do some conversion.
598+
if sort_by == "title":
599+
sort_key += self.title()
600+
elif sort_by == "date":
601+
sort_key = sort_key + str(self.publication_date())
602+
elif sort_by == "status":
603+
if self.rfc:
604+
sort_key += "%04d" % self.rfc.rfc_number
605+
else:
606+
sort_key += self.id.draft_status
607+
elif sort_by == "ipr":
608+
sort_key += self.iprUrl
609+
elif sort_by == "ad":
610+
return self.view_sort_key_byad()
611+
else:
612+
# sort default or unknown sort value, revert to default
613+
if self.rfc:
614+
sort_key += "%04d" % self.rfc.rfc_number
615+
else:
616+
sort_key += self.id.draft_name
617+
618+
return sort_key
619+
586620
def view_sort_key_byad(self):
587621
if self.rfc:
588622
return "2%04d" % self.rfc.rfc_number

ietf/idrfc/views_search.py

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def clean(self):
9898
q['subState'] = ""
9999
return q
100100

101-
def search_query(query_original):
101+
def search_query(query_original, sort_by=None):
102102
query = dict(query_original.items())
103103
drafts = query['activeDrafts'] or query['oldDrafts']
104104
if (not drafts) and (not query['rfcs']):
@@ -258,23 +258,58 @@ def search_query(query_original):
258258
if d or r:
259259
doc = IdRfcWrapper(d, r)
260260
results.append(doc)
261-
results.sort(key=lambda obj: obj.view_sort_key())
261+
results.sort(key=lambda obj: obj.view_sort_key(sort_by))
262+
262263
meta = {}
263264
if maxReached:
264265
meta['max'] = MAX
265266
if query['by']:
266267
meta['advanced'] = True
267268
return (results,meta)
268269

270+
def genParamURL(request, ignore_list):
271+
"""Recreates the parameter string from the given request, and
272+
returns it as a string.
273+
Any parameter names present in ignore_list shall not be put
274+
in the result string.
275+
"""
276+
params = []
277+
for i in request.GET:
278+
if not i in ignore_list:
279+
params.append(i + "=" + request.GET[i])
280+
return "?" + "&".join(params)
281+
269282
def search_results(request):
270283
if len(request.REQUEST.items()) == 0:
271284
return search_main(request)
272285
form = SearchForm(dict(request.REQUEST.items()))
273286
if not form.is_valid():
274287
return HttpResponse("form not valid?", mimetype="text/plain")
275-
(results,meta) = search_query(form.cleaned_data)
288+
289+
sort_by = None
290+
if "sortBy" in request.GET:
291+
sort_by = request.GET["sortBy"]
292+
293+
(results,meta) = search_query(form.cleaned_data, sort_by)
294+
276295
meta['searching'] = True
277296
meta['by'] = form.cleaned_data['by']
297+
meta['rqps'] = genParamURL(request, ['sortBy'])
298+
# With a later Django we can do this from the template (incude with tag)
299+
# Pass the headers and their sort key names
300+
meta['hdrs'] = [{'htitle': 'Document', 'htype':'doc'},
301+
{'htitle': 'Title', 'htype':'title'},
302+
{'htitle': 'Date', 'htype':'date'},
303+
{'htitle': 'Status', 'htype':'status', 'colspan':'2'},
304+
{'htitle': 'IPR', 'htype':'ipr'},
305+
{'htitle': 'Ad', 'htype':'ad'}]
306+
307+
# Make sure we know which one is selected (for visibility later)
308+
if sort_by:
309+
for hdr in meta['hdrs']:
310+
if hdr['htype'] == sort_by:
311+
hdr['selected'] = True
312+
278313
if 'ajax' in request.REQUEST and request.REQUEST['ajax']:
279314
return render_to_response('idrfc/search_results.html', {'docs':results, 'meta':meta}, context_instance=RequestContext(request))
280315
elif form.cleaned_data['lucky'] and len(results)==1:

ietf/templates/idrfc/search_results.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,13 @@
4040
{% else %}
4141
{% regroup docs by view_sort_group as grouped_docs %}
4242
<table class="ietf-table ietf-doctable">
43-
<tr><th class="doc">Document</th><th class="title">Title</th><th class="date">Date</th><th class="status" colspan="2">Status</th><th class="ipr">ipr</th><th class="ad">Area Director</th></tr>
43+
<tr>
44+
{% for hdr in meta.hdrs %}
45+
{% include "idrfc/table_header.html" %}
46+
{% endfor %}
47+
</tr>
4448
{% for doc_group in grouped_docs %}
4549
<tr class="header"><td colspan="7">{{doc_group.grouper}}s</td></tr>
46-
4750
{% for doc in doc_group.list %}
4851
{% include "idrfc/search_result_row.html" %}
4952
{% endfor %}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{# Copyright The IETF Trust 2011, All Rights Reserved #}
2+
3+
<th class="{{hdr.htype}}"{% if hdr.colspan %}colspan="{{ hdr.colspan }}" {% endif %}
4+
onclick="location=unescape('{{ meta.rqps }}&sortBy={{hdr.htype}}');"
5+
style="white-space: nowrap;"
6+
>
7+
<span>
8+
<label>{{hdr.htitle}}</label>
9+
{% if hdr.selected %}
10+
<img style="border-style: none;vertical-align:top" src="/images/sort-header-filled.png"/>
11+
{% else %}
12+
<img style="border-style: none;vertical-align:top" src="/images/sort-header-clear.png"/>
13+
{% endif %}
14+
</span>
15+
</th>
265 Bytes
Loading
214 Bytes
Loading

0 commit comments

Comments
 (0)