From 4e5ce997e5145914e3859d0a9629b12227bf143d Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Sat, 26 Mar 2011 16:58:07 +0000 Subject: [PATCH] Merged [2967] from jelte@nlnetlabs.nl: Make search result table headers clickable; clicking will sort on said column, see trac #484 - Legacy-Id: 2974 Note: SVN reference [2967] has been migrated to Git commit a6ef460f3a3a24b9f32f83bf8dbeffe2fa220958 --- ietf/idrfc/idrfc_wrapper.py | 46 ++++++++++++++++++++--- ietf/idrfc/views_search.py | 41 ++++++++++++++++++-- ietf/templates/idrfc/search_results.html | 7 +++- ietf/templates/idrfc/table_header.html | 15 ++++++++ static/images/sort-header-clear.png | Bin 0 -> 265 bytes static/images/sort-header-filled.png | Bin 0 -> 214 bytes 6 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 ietf/templates/idrfc/table_header.html create mode 100644 static/images/sort-header-clear.png create mode 100644 static/images/sort-header-filled.png diff --git a/ietf/idrfc/idrfc_wrapper.py b/ietf/idrfc/idrfc_wrapper.py index 6d672f738..a64725fc6 100644 --- a/ietf/idrfc/idrfc_wrapper.py +++ b/ietf/idrfc/idrfc_wrapper.py @@ -576,13 +576,47 @@ class IdRfcWrapper: return 'Active Internet-Draft' else: return 'Old Internet-Draft' - def view_sort_key(self): - if self.rfc: - return "2%04d" % self.rfc.rfc_number - elif self.id.draft_status == "Active": - return "1"+self.id.draft_name + + def view_sort_key(self, sort_by=None): + if sort_by is None: + if self.rfc: + return "2%04d" % self.rfc.rfc_number + elif self.id.draft_status == "Active": + return "1"+self.id.draft_name + else: + return "3"+self.id.draft_name else: - return "3"+self.id.draft_name + if self.rfc: + sort_key = "2" + elif self.id.draft_status == "Active": + sort_key = "1" + else: + sort_key = "3" + + # Depending on what we're sorting on, we may + # need to do some conversion. + if sort_by == "title": + sort_key += self.title() + elif sort_by == "date": + sort_key = sort_key + str(self.publication_date()) + elif sort_by == "status": + if self.rfc: + sort_key += "%04d" % self.rfc.rfc_number + else: + sort_key += self.id.draft_status + elif sort_by == "ipr": + sort_key += self.iprUrl + elif sort_by == "ad": + return self.view_sort_key_byad() + else: + # sort default or unknown sort value, revert to default + if self.rfc: + sort_key += "%04d" % self.rfc.rfc_number + else: + sort_key += self.id.draft_name + + return sort_key + def view_sort_key_byad(self): if self.rfc: return "2%04d" % self.rfc.rfc_number diff --git a/ietf/idrfc/views_search.py b/ietf/idrfc/views_search.py index ac2987c4e..435dd48e9 100644 --- a/ietf/idrfc/views_search.py +++ b/ietf/idrfc/views_search.py @@ -98,7 +98,7 @@ class SearchForm(forms.Form): q['subState'] = "" return q -def search_query(query_original): +def search_query(query_original, sort_by=None): query = dict(query_original.items()) drafts = query['activeDrafts'] or query['oldDrafts'] if (not drafts) and (not query['rfcs']): @@ -258,7 +258,8 @@ def search_query(query_original): if d or r: doc = IdRfcWrapper(d, r) results.append(doc) - results.sort(key=lambda obj: obj.view_sort_key()) + results.sort(key=lambda obj: obj.view_sort_key(sort_by)) + meta = {} if maxReached: meta['max'] = MAX @@ -266,15 +267,49 @@ def search_query(query_original): meta['advanced'] = True return (results,meta) +def genParamURL(request, ignore_list): + """Recreates the parameter string from the given request, and + returns it as a string. + Any parameter names present in ignore_list shall not be put + in the result string. + """ + params = [] + for i in request.GET: + if not i in ignore_list: + params.append(i + "=" + request.GET[i]) + return "?" + "&".join(params) + def search_results(request): if len(request.REQUEST.items()) == 0: return search_main(request) form = SearchForm(dict(request.REQUEST.items())) if not form.is_valid(): return HttpResponse("form not valid?", mimetype="text/plain") - (results,meta) = search_query(form.cleaned_data) + + sort_by = None + if "sortBy" in request.GET: + sort_by = request.GET["sortBy"] + + (results,meta) = search_query(form.cleaned_data, sort_by) + meta['searching'] = True meta['by'] = form.cleaned_data['by'] + meta['rqps'] = genParamURL(request, ['sortBy']) + # With a later Django we can do this from the template (incude with tag) + # Pass the headers and their sort key names + meta['hdrs'] = [{'htitle': 'Document', 'htype':'doc'}, + {'htitle': 'Title', 'htype':'title'}, + {'htitle': 'Date', 'htype':'date'}, + {'htitle': 'Status', 'htype':'status', 'colspan':'2'}, + {'htitle': 'IPR', 'htype':'ipr'}, + {'htitle': 'Ad', 'htype':'ad'}] + + # Make sure we know which one is selected (for visibility later) + if sort_by: + for hdr in meta['hdrs']: + if hdr['htype'] == sort_by: + hdr['selected'] = True + if 'ajax' in request.REQUEST and request.REQUEST['ajax']: return render_to_response('idrfc/search_results.html', {'docs':results, 'meta':meta}, context_instance=RequestContext(request)) elif form.cleaned_data['lucky'] and len(results)==1: diff --git a/ietf/templates/idrfc/search_results.html b/ietf/templates/idrfc/search_results.html index f0b8daf71..59fb21864 100644 --- a/ietf/templates/idrfc/search_results.html +++ b/ietf/templates/idrfc/search_results.html @@ -40,10 +40,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. {% else %} {% regroup docs by view_sort_group as grouped_docs %} - + + {% for hdr in meta.hdrs %} + {% include "idrfc/table_header.html" %} + {% endfor %} + {% for doc_group in grouped_docs %} - {% for doc in doc_group.list %} {% include "idrfc/search_result_row.html" %} {% endfor %} diff --git a/ietf/templates/idrfc/table_header.html b/ietf/templates/idrfc/table_header.html new file mode 100644 index 000000000..604a92536 --- /dev/null +++ b/ietf/templates/idrfc/table_header.html @@ -0,0 +1,15 @@ +{# Copyright The IETF Trust 2011, All Rights Reserved #} + + diff --git a/static/images/sort-header-clear.png b/static/images/sort-header-clear.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d23c90507e57bcf04cfbeea13a4dbe07dc26fd GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D90{Nxdx@v7EBkF`DL!$Iv+q}(1PXO}x;TbdoIV?T zo3}xMXOC3R|)++A?ej84|chP)f@ebTR5!luA5 zBWRMqp~Z)*`Hdf6yfY;sE#&H=WvkpjUtnfrcpekD=gFs2N3^@IeUWoGxX5(xX@%!C zn=*Xw-|u}Rdrab>?W*#W4X5^;meLKn+Fk#@HM4=&gE@$sXZHSoKu0lny85}Sb4q9e E06@!M2mk;8 literal 0 HcmV?d00001 diff --git a/static/images/sort-header-filled.png b/static/images/sort-header-filled.png new file mode 100644 index 0000000000000000000000000000000000000000..bca5f1180b69eda177582234662462b13dfb72ef GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D90{Nxdx@v7EBkF`DLyW~+Ygc-0ENOlT^vI!PAC8Q z|KFZjwV|`o$zda-PDV}8pTiwzS$mdbEQ^#d5X!dp6R-LEYieUep_|Ri2lj^R4okAt z|Np0|XTrJU$p4l@Z23BWetc|B66a~$12lla<(1Tywhqe#pbZS3u6{1-oD!M
DocumentTitleDateStatusiprArea Director
{{doc_group.grouper}}s
+ + + {% if hdr.selected %} + + {% else %} + + {% endif %} + +