diff --git a/tugboat/tests/tests_unit/test_search_redirect.py b/tugboat/tests/tests_unit/test_search_redirect.py index b91aa39..cc84d46 100644 --- a/tugboat/tests/tests_unit/test_search_redirect.py +++ b/tugboat/tests/tests_unit/test_search_redirect.py @@ -104,38 +104,48 @@ def test_object(self): req.args = MultiDict([('object', urllib.quote('M31'))]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() - object_search = view.translate(req) + search = view.translate(req) self.assertEqual('q=' + urllib.quote('object:') + '(' + urllib.quote('"M31"') + ')' + - '&sort=' + urllib.quote('date desc, bibcode desc') + '/', object_search) # single object + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # single object req.args = MultiDict([('object', urllib.quote('M31\r\nM32'))]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() - object_search = view.translate(req) + search = view.translate(req) self.assertEqual('q=' + urllib.quote('object:') + '(' + urllib.quote('"M31" AND "M32"') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', - object_search) # objects, newline separator + search) # objects, newline separator req.args = MultiDict([('object', urllib.quote('M31;M32;M33'))]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() - object_search = view.translate(req) + search = view.translate(req) self.assertEqual('q=' + urllib.quote('object:') + '(' + urllib.quote('"M31" AND "M32" AND "M33"') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', - object_search) # object, semicolor separator + search) # object, semicolor separator def test_title(self): """title field""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None + req.args = MultiDict([('title', urllib.quote('ADS'))]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() - object_search = view.translate(req) + search = view.translate(req) self.assertEqual('q=' + urllib.quote('title:') + '(' + urllib.quote('ADS') + ')' + - '&sort=' + urllib.quote('date desc, bibcode desc') + '/', object_search) # single object + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # single object + + req.args = MultiDict([('title', urllib.quote('ADS Kurtz')), ('ttl_logic', 'OR')]) + req.args.update(self.append_defaults()) + view = ClassicSearchRedirectView() + search = view.translate(req) + self.assertEqual('q=' + + urllib.quote('title:') + '(' + urllib.quote('ADS Kurtz') + ')' + + '&sort=' + urllib.quote('date desc, bibcode desc') + + '&warning_message=' + 'TITLE_ANDED_WARNING' + '/', search) # single object def test_text(self): """text search""" @@ -145,10 +155,19 @@ def test_text(self): req.args = MultiDict([('text', urllib.quote('M31'))]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() - object_search = view.translate(req) + search = view.translate(req) self.assertEqual('q=' + urllib.quote('abs:') + '(' + urllib.quote('M31') + ')' + - '&sort=' + urllib.quote('date desc, bibcode desc') + '/', object_search) # single object + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # single object + + req.args = MultiDict([('text', urllib.quote('foo bar')), ('txt_logic', 'OR')]) + req.args.update(self.append_defaults()) + view = ClassicSearchRedirectView() + search = view.translate(req) + self.assertEqual('q=' + + urllib.quote('abs:') + '(' + urllib.quote('foo bar') + ')' + + '&sort=' + urllib.quote('date desc, bibcode desc') + + '&warning_message=' + 'ABSTRACT_ANDED_WARNING' + '/', search) # single object def test_pubdate(self): """test pubdate""" @@ -727,6 +746,7 @@ def test_abstract(self): req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None + req.args = MultiDict([('data_and', 'YES'), ('abstract', 'YES')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() diff --git a/tugboat/views.py b/tugboat/views.py index e468ddb..c4e42d5 100644 --- a/tugboat/views.py +++ b/tugboat/views.py @@ -358,7 +358,7 @@ def translate_authors(self, args): self.translation.warning_message.append(urllib.quote('AUTHOR_ANDED_WARNING')) def translate_simple(self, args, classic_param, bbb_param): - """process easy to translate fields like title + """process easy to translate fields including title, abstract, and object simply change name of parameter and use boolean connector """ @@ -370,16 +370,24 @@ def translate_simple(self, args, classic_param, bbb_param): # one lone parameter should hold all authors from classic classic_str = args.pop(classic_param, None) if classic_str: + # note that only for object we allow multiple tokens and apply connector + # hence for title and abstract no connector is applied if classic_param == 'object': terms = self.classic_field_to_array(classic_str) else: terms = self.classic_field_to_string(classic_str) + # issue a warning for title and abstract if multiple words are specified and OR is selected + if len(''.join(terms).split(' ')) > 1 and logic == 'OR': + if classic_param == 'title': + self.translation.warning_message.append(urllib.quote('TITLE_ANDED_WARNING')) + elif classic_param == 'text': + self.translation.warning_message.append(urllib.quote('ABSTRACT_ANDED_WARNING')) search += urllib.quote(bbb_param + ':') + '(' for term in terms: search += urllib.quote(term + connector) search = search[:-len(urllib.quote(connector))] # remove final connector search += ')' - # fields in search are ANDed as of 5/9 + # multiple fields in search are ANDed as of 5/9/2018 if len(self.translation.search) > 0: self.translation.search.append('AND') self.translation.search.append(search)