From 309275dd7f1319057b24017925368abe0c39cd01 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Wed, 21 Oct 2015 19:21:52 +0000 Subject: [PATCH] Enhanced the partial-match URL feature introduced in [10158], merged in [10253], so that it now handles other document types than drafts/rfcs if the partial string has the proper prefix, and also handles partial strings which don't match at the start of the document name. - Legacy-Id: 10255 Note: SVN reference [10158] has been migrated to Git commit 4ac99a9dc497926f11a87df86aa74e9e79afc32f Note: SVN reference [10253] has been migrated to Git commit 083abf7516f26849473442d324bb941f9fbee296 --- ietf/doc/tests.py | 36 ++++++++++++++++++++++++++++++++++++ ietf/doc/views_search.py | 22 +++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py index 4061c0b40..726222287 100644 --- a/ietf/doc/tests.py +++ b/ietf/doc/tests.py @@ -122,6 +122,42 @@ class SearchTests(TestCase): self.assertEqual(r.status_code, 302) self.assertEqual(urlparse.urlparse(r["Location"]).path, urlreverse("doc_view", kwargs=dict(name=draft.name))) + # non-prefix match + r = self.client.get(urlreverse("doc_search_for_name", kwargs=dict(name="-".join(draft.name.split("-")[1:])))) + self.assertEqual(r.status_code, 302) + self.assertEqual(urlparse.urlparse(r["Location"]).path, urlreverse("doc_view", kwargs=dict(name=draft.name))) + + # other doctypes than drafts + doc = Document.objects.get(name='charter-ietf-mars') + r = self.client.get(urlreverse("doc_search_for_name", kwargs=dict(name='charter-ietf-ma'))) + self.assertEqual(r.status_code, 302) + self.assertEqual(urlparse.urlparse(r["Location"]).path, urlreverse("doc_view", kwargs=dict(name=doc.name))) + + doc = Document.objects.filter(name__startswith='conflict-review-').first() + r = self.client.get(urlreverse("doc_search_for_name", kwargs=dict(name="-".join(doc.name.split("-")[:-1])))) + self.assertEqual(r.status_code, 302) + self.assertEqual(urlparse.urlparse(r["Location"]).path, urlreverse("doc_view", kwargs=dict(name=doc.name))) + + doc = Document.objects.filter(name__startswith='status-change-').first() + r = self.client.get(urlreverse("doc_search_for_name", kwargs=dict(name="-".join(doc.name.split("-")[:-1])))) + self.assertEqual(r.status_code, 302) + self.assertEqual(urlparse.urlparse(r["Location"]).path, urlreverse("doc_view", kwargs=dict(name=doc.name))) + + doc = Document.objects.filter(name__startswith='agenda-').first() + r = self.client.get(urlreverse("doc_search_for_name", kwargs=dict(name="-".join(doc.name.split("-")[:-1])))) + self.assertEqual(r.status_code, 302) + self.assertEqual(urlparse.urlparse(r["Location"]).path, urlreverse("doc_view", kwargs=dict(name=doc.name))) + + doc = Document.objects.filter(name__startswith='minutes-').first() + r = self.client.get(urlreverse("doc_search_for_name", kwargs=dict(name="-".join(doc.name.split("-")[:-1])))) + self.assertEqual(r.status_code, 302) + self.assertEqual(urlparse.urlparse(r["Location"]).path, urlreverse("doc_view", kwargs=dict(name=doc.name))) + + doc = Document.objects.filter(name__startswith='slides-').first() + r = self.client.get(urlreverse("doc_search_for_name", kwargs=dict(name="-".join(doc.name.split("-")[:-1])))) + self.assertEqual(r.status_code, 302) + self.assertEqual(urlparse.urlparse(r["Location"]).path, urlreverse("doc_view", kwargs=dict(name=doc.name))) + # match with revision r = self.client.get(urlreverse("doc_search_for_name", kwargs=dict(name=draft.name + "-" + prev_rev))) self.assertEqual(r.status_code, 302) diff --git a/ietf/doc/views_search.py b/ietf/doc/views_search.py index f5c07664c..a4f0c1d40 100644 --- a/ietf/doc/views_search.py +++ b/ietf/doc/views_search.py @@ -401,6 +401,11 @@ def search_for_name(request, name): aliases = DocAlias.objects.filter(name__startswith=n)[:2] if len(aliases) == 1: return aliases[0].name + + aliases = DocAlias.objects.filter(name__contains=n)[:2] + if len(aliases) == 1: + return aliases[0].name + return None n = name @@ -427,7 +432,22 @@ def search_for_name(request, name): else: return HttpResponseRedirect(urlreverse("doc_view", kwargs={ "name": redirect_to })) - return HttpResponseRedirect(urlreverse("doc_search") + "?name=%s&rfcs=on&activedrafts=on" % n) + # build appropriate flags based on string prefix + doctypenames = DocTypeName.objects.filter(used=True) + # This would have been more straightforward if document prefixes couldn't + # contain a dash. Probably, document prefixes shouldn't contain a dash ... + search_args = "?name=%s" % n + if n.startswith("draft"): + search_args += "&rfcs=on&activedrafts=on&olddrafts=on" + else: + for t in doctypenames: + if n.startswith(t.prefix): + search_args += "&include-%s=on" % t.slug + break + else: + search_args += "&rfcs=on&activedrafts=on&olddrafts=on" + + return HttpResponseRedirect(urlreverse("doc_search") + search_args) def ad_dashboard_group(doc):