From b14a8d0cee78e10a1694e42e612580a766791aca Mon Sep 17 00:00:00 2001 From: Adam Roach Date: Sat, 27 Jul 2013 12:26:24 +0000 Subject: [PATCH] Fixed bug #838 - Legacy-Id: 5898 --- ietf/idrfc/views_search.py | 83 ++++++++++++++++-------- ietf/templates/idrfc/search_form.html | 10 +++ ietf/templates/idrfc/search_results.html | 2 +- 3 files changed, 66 insertions(+), 29 deletions(-) diff --git a/ietf/idrfc/views_search.py b/ietf/idrfc/views_search.py index e311f7e43..0d708ea57 100644 --- a/ietf/idrfc/views_search.py +++ b/ietf/idrfc/views_search.py @@ -62,6 +62,8 @@ class SearchForm(forms.Form): sort = forms.ChoiceField(choices=(("document", "Document"), ("title", "Title"), ("date", "Date"), ("status", "Status"), ("ipr", "Ipr"), ("ad", "AD")), required=False, widget=forms.HiddenInput) + doctypes = DocTypeName.objects.exclude(slug='draft').order_by('name'); + def __init__(self, *args, **kwargs): super(SearchForm, self).__init__(*args, **kwargs) responsible = Document.objects.values_list('ad', flat=True).distinct() @@ -155,12 +157,16 @@ def fill_in_search_attributes(docs): else: d.latest_revision_date = d.time - if d.get_state_slug() == "rfc": - d.search_heading = "RFCs" - elif d.get_state_slug() == "active": - d.search_heading = "Active Internet-Drafts" + if d.type_id == "draft": + if d.get_state_slug() == "rfc": + d.search_heading = "RFCs" + elif d.get_state_slug() in ("ietf-rm", "auth-rm"): + d.search_heading = "Internet-Drafts %s" % d.get_state() + else: + d.search_heading = "%s Internet-Drafts" % d.get_state() else: - d.search_heading = "Old Internet-Drafts" + d.search_heading = "%s (%s)" % (d.type,d.get_state()); + d.expirable = expirable_draft(d) @@ -196,22 +202,38 @@ def fill_in_search_attributes(docs): l.sort() -def retrieve_search_results(form, types=['draft']): +def retrieve_search_results(form, all_types=False): + """Takes a validated SearchForm and return the results.""" if not form.is_valid(): raise ValueError("SearchForm doesn't validate: %s" % form.errors) query = form.cleaned_data - if not (query['activedrafts'] or query['olddrafts'] or query['rfcs']): + types=[]; + meta = {} + + if (query['activedrafts'] or query['olddrafts'] or query['rfcs']): + types.append('draft') + + # Advanced document types are data-driven, so we need to read them from the + # raw form.data field (and track their checked/unchecked state ourselves) + meta['checked'] = {} + alltypes = DocTypeName.objects.exclude(slug='draft').order_by('name'); + for doctype in alltypes: + if form.data.__contains__('include-' + doctype.slug): + types.append(doctype.slug) + meta['checked'][doctype.slug] = True + + if len(types) == 0 and not all_types: return ([], {}) MAX = 500 - if types and len(types) > 0: - docs = Document.objects.filter(type__in=types) - else: + if all_types: docs = Document.objects.all() + else: + docs = Document.objects.filter(type__in=types) # name if query["name"]: @@ -219,16 +241,16 @@ def retrieve_search_results(form, types=['draft']): Q(title__icontains=query["name"])).distinct() # rfc/active/old check buttons - if types == ['draft']: - allowed_states = [] - if query["rfcs"]: - allowed_states.append("rfc") - if query["activedrafts"]: - allowed_states.append("active") - if query["olddrafts"]: - allowed_states.extend(['repl', 'expired', 'auth-rm', 'ietf-rm']) + allowed_draft_states = [] + if query["rfcs"]: + allowed_draft_states.append("rfc") + if query["activedrafts"]: + allowed_draft_states.append("active") + if query["olddrafts"]: + allowed_draft_states.extend(['repl', 'expired', 'auth-rm', 'ietf-rm']) - docs = docs.filter(states__type="draft", states__slug__in=allowed_states) + docs = docs.filter(Q(states__slug__in=allowed_draft_states) | + ~Q(type__slug='draft')).distinct() # radio choices by = query["by"] @@ -259,12 +281,19 @@ def retrieve_search_results(form, types=['draft']): rfc_num = d.rfc_number() - if rfc_num != None: - res.append(2) - elif d.get_state_slug() == "active": - res.append(1) + + if d.type_id == "draft": + if rfc_num != None: + res.append(2) + elif d.get_state_slug() == "active": + res.append(1) + else: + res.append(3) else: - res.append(3) + res.append(d.type_id); + res.append("-"); + res.append(d.get_state_slug()); + res.append("-"); if query["sort"] == "title": res.append(d.title) @@ -296,11 +325,10 @@ def retrieve_search_results(form, types=['draft']): results.sort(key=sort_key) # fill in a meta dict with some information for rendering the result table - meta = {} if len(results) == MAX: meta['max'] = MAX meta['by'] = query['by'] - meta['advanced'] = bool(query['by']) + meta['advanced'] = bool(query['by'] or len(meta['checked'])) meta['headers'] = [{'title': 'Document', 'key':'document'}, {'title': 'Title', 'key':'title'}, @@ -316,7 +344,6 @@ def retrieve_search_results(form, types=['draft']): h["sort_url"] = "?" + d.urlencode() if h['key'] == query.get('sort'): h['sorted'] = True - return (results, meta) @@ -477,7 +504,7 @@ def docs_for_ad(request, name): form = SearchForm({'by':'ad','ad': ad.id, 'rfcs':'on', 'activedrafts':'on', 'olddrafts':'on', 'sort': 'status'}) - results, meta = retrieve_search_results(form, types=None) + results, meta = retrieve_search_results(form, all_types=True) results.sort(key=ad_dashboard_sort_key) del meta["headers"][-1] # diff --git a/ietf/templates/idrfc/search_form.html b/ietf/templates/idrfc/search_form.html index 69a24b089..4c7497c58 100644 --- a/ietf/templates/idrfc/search_form.html +++ b/ietf/templates/idrfc/search_form.html @@ -52,6 +52,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Advanced
+ +
+ + +{% for doc_type in form.doctypes %} + +{% endfor %} +
+
+ Additional search criteria:
diff --git a/ietf/templates/idrfc/search_results.html b/ietf/templates/idrfc/search_results.html index c8ff1098f..17c9ce28c 100644 --- a/ietf/templates/idrfc/search_results.html +++ b/ietf/templates/idrfc/search_results.html @@ -61,7 +61,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. {% regroup docs by search_heading as grouped_docs %} {% for doc_group in grouped_docs %} - {{ doc_group.grouper }}{{doc_group.list|length|pluralize}} + {{ doc_group.grouper }} {% for doc in doc_group.list %} {% include "idrfc/search_result_row.html" %}