From b4970fae52d238273dec31838549c67358fafd48 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Oct 11 2016 10:31:26 +0000 Subject: Allow filtering issues using the custom fields set-up --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 54c64ff..d3227b3 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1685,7 +1685,7 @@ def search_issues( session, repo, issueid=None, issueuid=None, status=None, closed=False, tags=None, assignee=None, author=None, private=None, priority=None, milestones=None, count=False, offset=None, - limit=None, search_pattern=None): + limit=None, search_pattern=None, custom_search=None): ''' Retrieve one or more issues associated to a project with the given criterias. @@ -1734,6 +1734,9 @@ def search_issues( :type count: boolean :kwarg search_pattern: a string to search in issues title :type search_pattern: str or None + :kwarg custom_search: a dictionary of key/values to be used when + searching issues with a custom key constraint + :type custom_search: dict or None :return: A single Issue object if issueid is specified, a list of Project objects otherwise. @@ -1875,6 +1878,37 @@ def search_issues( model.Issue.milestone.in_(milestones) ) + if custom_search: + constraints = [] + for key in custom_search: + value = custom_search[key] + if '*' in value: + value = value.replace('*', '%') + constraints.append( + sqlalchemy.and_( + model.IssueKeys.name == key, + model.IssueValues.value.ilike(value) + ) + ) + else: + constraints.append( + sqlalchemy.and_( + model.IssueKeys.name == key, + model.IssueValues.value == value + ) + ) + if constraints: + query = query.filter( + model.Issue.uid == model.IssueValues.issue_uid + ).filter( + model.IssueValues.key_id == model.IssueKeys.id + ) + query = query.filter( + sqlalchemy.or_( + (const for const in constraints) + ) + ) + query = session.query( model.Issue ).filter( diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index f879bbb..aee72dc 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -446,6 +446,14 @@ def view_issues(repo, username=None, namespace=None): author = flask.request.args.get('author', None) search_pattern = flask.request.args.get('search_pattern', None) + # Custom fields + custom_keys = flask.request.args.getlist('ckeys') + custom_values = flask.request.args.getlist('cvalue') + custom_search = {} + if len(custom_keys) == len(custom_values): + for idx, key in enumerate(custom_keys): + custom_search[key] = custom_values[idx] + repo = flask.g.repo if not repo.settings.get('issue_tracker', True): @@ -483,6 +491,7 @@ def view_issues(repo, username=None, namespace=None): offset=flask.g.offset, limit=flask.g.limit, search_pattern=search_pattern, + custom_search=custom_search, ) issues_cnt = pagure.lib.search_issues( SESSION, @@ -507,6 +516,7 @@ def view_issues(repo, username=None, namespace=None): priority=priority, count=True, search_pattern=search_pattern, + custom_search=custom_search, ) else: issues = pagure.lib.search_issues( @@ -514,6 +524,7 @@ def view_issues(repo, username=None, namespace=None): author=author, private=private, priority=priority, offset=flask.g.offset, limit=flask.g.limit, search_pattern=search_pattern, + custom_search=custom_search, ) issues_cnt = pagure.lib.search_issues( SESSION, repo, tags=tags, assignee=assignee,