From 0435083239d5c74d0ca36e1c43a84195c834e76b Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Mar 03 2017 15:51:42 +0000 Subject: [PATCH 1/2] Allow report to filter for a key multiple times When we had an url with a query such as: ?milestone=none&milestone=1.0.1 We were saving it as: {'milestone': '1.0.1'} therefore loosing half of the information and that due to the code assuming one value per key. With this commit the url query: milestone=none&milestone=1.0.1 is saved as: {'milestone': ['none', '1.0.1']} as desired. Fixes https://pagure.io/pagure/issue/2012 --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 42d1c19..55300e0 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -3715,7 +3715,15 @@ def save_report(session, repo, name, url, username): """ url_obj = urlparse.urlparse(url) url = url_obj.geturl().replace(url_obj.query, '') - query = dict(urlparse.parse_qsl(url_obj.query)) + query = {} + for k, v in urlparse.parse_qsl(url_obj.query): + if k in query: + if isinstance(query[k], list): + query[k].append(v) + else: + query[k] = [query[k], v] + else: + query[k] = v reports = repo.reports reports[name] = query repo.reports = reports From 2ecb113ea5bdd0a20cd5b14737281c9023222424 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Mar 03 2017 15:51:42 +0000 Subject: [PATCH 2/2] Add unit-tests for pagure.lib.save_report --- diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 2c8d5c1..a773f7f 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -4091,6 +4091,51 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(pagure.lib.tokenize_search_string(inp), (flds, rem)) + def test_save_report(self): + """ Test the save_report function. """ + # Create the projects + tests.create_projects(self.session) + + project = pagure.lib.get_project(self.session, name='test') + self.assertEqual(project.reports, {}) + + name = 'test report' + url = '?foo=bar&baz=biz' + + pagure.lib.save_report( + self.session, + repo=project, + name=name, + url=url, + username=None + ) + + project = pagure.lib.get_project(self.session, name='test') + self.assertEqual( + project.reports, + {'test report': {'baz': 'biz', 'foo': 'bar'}} + ) + + name = 'test report #2' + url = '?foo=bar&foo=none&foo=baz' + + pagure.lib.save_report( + self.session, + repo=project, + name=name, + url=url, + username=None + ) + + project = pagure.lib.get_project(self.session, name='test') + self.assertEqual( + project.reports, + { + 'test report': {'baz': 'biz', 'foo': 'bar'}, + 'test report #2': {'foo': ['bar', 'none', 'baz']} + } + ) + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureLibtests)