From 52df0cc722717e15ca2f1865b7aca883d56cdd72 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jan 04 2018 10:41:01 +0000 Subject: Expand and document the tokenization search This basically add support for searching for priority:high in the search field at the top of the issues page. Since it adds the corresponding documentation, it also: Fixes https://pagure.io/pagure/issue/1908 Signed-off-by: Pierre-Yves Chibon --- diff --git a/doc/usage/tips_tricks.rst b/doc/usage/tips_tricks.rst index 11c92b1..3cf1ecd 100644 --- a/doc/usage/tips_tricks.rst +++ b/doc/usage/tips_tricks.rst @@ -60,3 +60,20 @@ Examples: https://pagure.io/user/pingou?acl=main admin https://pagure.io/user/pingou?acl=admin https://pagure.io/user/pingou?acl=commit + + +Filter issues by (custom) fields +-------------------------------- + +Via the project's settings page, admins can set custom keys to be used in +issues. You can search them using the URL via the arguments ``ckeys`` and +``cvalue`` or simpler, using the search field at the top of the issue page. + +This also works for the following regular fields: ``tags``, ``milestones``, +``author``, ``assignee``, ``status``, ``priority`` (but tags and milestones +despite their name only support a single value). + +Examples: +~~~~~~~~~ +https://pagure.io/SSSD/sssd/issues?status=Open&search_pattern=review%3ATrue +https://pagure.io/pagure/issues?status=Open&search_pattern=tags%3Aeasyfix diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index 3e15245..9d5fae8 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -624,6 +624,20 @@ def view_issues(repo, username=None, namespace=None): for idx, key in enumerate(custom_keys): custom_search[key] = custom_values[idx] + try: + priority = int(priority) + except (ValueError, TypeError): + priority = None + + fields = { + 'status': status, + 'priority': priority, + 'tags': tags, + 'assignee': assignee, + 'author': author, + 'milestones': milestones, + } + no_stone = None if "none" in milestones: no_stone = True @@ -632,15 +646,16 @@ def view_issues(repo, username=None, namespace=None): search_string = search_pattern extra_fields, search_pattern = pagure.lib.tokenize_search_string( search_pattern) + + for field in ['status', 'priority', 'tags', 'assignee', 'author', 'milestones']: + if field in extra_fields: + fields[field] = extra_fields[field] + del(extra_fields[field]) + custom_search.update(extra_fields) repo = flask.g.repo - try: - priority = int(priority) - except (ValueError, TypeError): - priority = None - # Hide private tickets private = False # If user is authenticated, show him/her his/her private tickets @@ -650,80 +665,78 @@ def view_issues(repo, username=None, namespace=None): if flask.g.repo_committer: private = None - if str(status).lower() in ['all']: + status = fields['status'] + del(fields['status']) + + if status.lower() in ['all']: status = None oth_issues_cnt = None total_issues_cnt = pagure.lib.search_issues( - flask.g.session, repo, tags=tags, assignee=assignee, - author=author, private=private, priority=priority, count=True) + flask.g.session, repo, private=private, count=True, + **fields) if status is not None: issues = pagure.lib.search_issues( flask.g.session, repo, closed=True if status.lower() != 'open' else False, - status=status.capitalize() if status.lower() != 'closed' else None, - tags=tags, - assignee=assignee, - author=author, private=private, - priority=priority, offset=flask.g.offset, limit=flask.g.limit, search_pattern=search_pattern, custom_search=custom_search, - milestones=milestones, no_milestones=no_stone, order=order, - order_key=order_key + order_key=order_key, + status=status.capitalize() + if status.lower() != 'closed' else None, + **fields ) issues_cnt = pagure.lib.search_issues( flask.g.session, repo, closed=True if status.lower() != 'open' else False, - status=status.capitalize() if status.lower() != 'closed' else None, - tags=tags, - assignee=assignee, - author=author, private=private, - priority=priority, search_pattern=search_pattern, custom_search=custom_search, - milestones=milestones, no_milestones=no_stone, - count=True + count=True, + status=status.capitalize() + if status.lower() != 'closed' else None, + **fields ) oth_issues_cnt = pagure.lib.search_issues( flask.g.session, repo, closed=True if status.lower() != 'open' else False, - tags=tags, - assignee=assignee, - author=author, private=private, - priority=priority, search_pattern=search_pattern, custom_search=custom_search, no_milestones=no_stone, - milestones=milestones, count=True, + **fields ) else: issues = pagure.lib.search_issues( - flask.g.session, repo, tags=tags, assignee=assignee, - author=author, private=private, priority=priority, - offset=flask.g.offset, limit=flask.g.limit, + flask.g.session, + repo, + private=private, + offset=flask.g.offset, + limit=flask.g.limit, search_pattern=search_pattern, custom_search=custom_search, order=order, - order_key=order_key + order_key=order_key, + **fields ) issues_cnt = pagure.lib.search_issues( - flask.g.session, repo, tags=tags, assignee=assignee, - author=author, private=private, priority=priority, + flask.g.session, + repo, + private=private, search_pattern=search_pattern, custom_search=custom_search, count=True, + **fields ) tag_list = pagure.lib.get_tags_of_project(flask.g.session, repo) @@ -737,20 +750,17 @@ def view_issues(repo, username=None, namespace=None): repo=repo, username=username, tag_list=tag_list, - status=status, issues=issues, issues_cnt=issues_cnt, total_issues_cnt=total_issues_cnt, oth_issues_cnt=oth_issues_cnt, - tags=tags, - assignee=assignee, - author=author, - priority=priority, total_page=total_page, add_report_form=pagure.forms.AddReportForm(), search_pattern=search_string, order=order, - order_key=order_key + order_key=order_key, + status=status, + **fields ) diff --git a/tests/test_pagure_flask_ui_issues.py b/tests/test_pagure_flask_ui_issues.py index 5f5cec5..15f78a7 100644 --- a/tests/test_pagure_flask_ui_issues.py +++ b/tests/test_pagure_flask_ui_issues.py @@ -656,8 +656,8 @@ class PagureFlaskIssuestests(tests.Modeltests): self.assertIn( 'div class="projectinfo m-t-1 m-b-1">\ntest project #1 ' '', output.data) - self.assertTrue( - '

\n 0 Open Issues' in output.data) + self.assertIn( + '

\n 0 Open Issues', output.data) repo = pagure.lib.get_authorized_project(self.session, 'test') # Create some custom fields to play with @@ -783,8 +783,8 @@ class PagureFlaskIssuestests(tests.Modeltests): output = self.app.get('/test/issues?status=cloSED') self.assertEqual(output.status_code, 200) self.assertIn('Issues - test - Pagure', output.data) - self.assertTrue( - '

\n 1 Closed Issues' in output.data) + self.assertIn( + '

\n 1 Closed Issues', output.data) self.assertIn( '
', output.data)