pull-requests: added quick filter to grid view.
This commit is contained in:
parent
f914f28831
commit
ecebee8eeb
4 changed files with 65 additions and 28 deletions
|
|
@ -76,28 +76,28 @@ class RepoPullRequestsView(RepoAppView, DataGridAppView):
|
|||
|
||||
if filter_type == 'awaiting_review':
|
||||
pull_requests = PullRequestModel().get_awaiting_review(
|
||||
repo_name, source=source, opened_by=opened_by,
|
||||
repo_name, search_q=search_q, source=source, opened_by=opened_by,
|
||||
statuses=statuses, offset=start, length=limit,
|
||||
order_by=order_by, order_dir=order_dir)
|
||||
pull_requests_total_count = PullRequestModel().count_awaiting_review(
|
||||
repo_name, source=source, statuses=statuses,
|
||||
repo_name, search_q=search_q, source=source, statuses=statuses,
|
||||
opened_by=opened_by)
|
||||
elif filter_type == 'awaiting_my_review':
|
||||
pull_requests = PullRequestModel().get_awaiting_my_review(
|
||||
repo_name, source=source, opened_by=opened_by,
|
||||
repo_name, search_q=search_q, source=source, opened_by=opened_by,
|
||||
user_id=self._rhodecode_user.user_id, statuses=statuses,
|
||||
offset=start, length=limit, order_by=order_by,
|
||||
order_dir=order_dir)
|
||||
pull_requests_total_count = PullRequestModel().count_awaiting_my_review(
|
||||
repo_name, source=source, user_id=self._rhodecode_user.user_id,
|
||||
repo_name, search_q=search_q, source=source, user_id=self._rhodecode_user.user_id,
|
||||
statuses=statuses, opened_by=opened_by)
|
||||
else:
|
||||
pull_requests = PullRequestModel().get_all(
|
||||
repo_name, source=source, opened_by=opened_by,
|
||||
repo_name, search_q=search_q, source=source, opened_by=opened_by,
|
||||
statuses=statuses, offset=start, length=limit,
|
||||
order_by=order_by, order_dir=order_dir)
|
||||
pull_requests_total_count = PullRequestModel().count_all(
|
||||
repo_name, source=source, statuses=statuses,
|
||||
repo_name, search_q=search_q, source=source, statuses=statuses,
|
||||
opened_by=opened_by)
|
||||
|
||||
data = []
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ import traceback
|
|||
import collections
|
||||
|
||||
from sqlalchemy import (
|
||||
or_, and_, not_, func, TypeDecorator, event,
|
||||
or_, and_, not_, func, cast, TypeDecorator, event,
|
||||
Index, Sequence, UniqueConstraint, ForeignKey, CheckConstraint, Column,
|
||||
Boolean, String, Unicode, UnicodeText, DateTime, Integer, LargeBinary,
|
||||
Text, Float, PickleType, BigInteger)
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ from rhodecode.model import BaseModel
|
|||
from rhodecode.model.changeset_status import ChangesetStatusModel
|
||||
from rhodecode.model.comment import CommentsModel
|
||||
from rhodecode.model.db import (
|
||||
or_, PullRequest, PullRequestReviewers, ChangesetStatus,
|
||||
or_, String, cast, PullRequest, PullRequestReviewers, ChangesetStatus,
|
||||
PullRequestVersion, ChangesetComment, Repository, RepoReviewRule)
|
||||
from rhodecode.model.meta import Session
|
||||
from rhodecode.model.notification import NotificationModel, \
|
||||
|
|
@ -137,8 +137,8 @@ class PullRequestModel(BaseModel):
|
|||
def get(self, pull_request):
|
||||
return self.__get_pull_request(pull_request)
|
||||
|
||||
def _prepare_get_all_query(self, repo_name, source=False, statuses=None,
|
||||
opened_by=None, order_by=None,
|
||||
def _prepare_get_all_query(self, repo_name, search_q=None, source=False,
|
||||
statuses=None, opened_by=None, order_by=None,
|
||||
order_dir='desc', only_created=False):
|
||||
repo = None
|
||||
if repo_name:
|
||||
|
|
@ -146,6 +146,14 @@ class PullRequestModel(BaseModel):
|
|||
|
||||
q = PullRequest.query()
|
||||
|
||||
if search_q:
|
||||
like_expression = u'%{}%'.format(safe_unicode(search_q))
|
||||
q = q.filter(or_(
|
||||
cast(PullRequest.pull_request_id, String).ilike(like_expression),
|
||||
PullRequest.title.ilike(like_expression),
|
||||
PullRequest.description.ilike(like_expression),
|
||||
))
|
||||
|
||||
# source or target
|
||||
if repo and source:
|
||||
q = q.filter(PullRequest.source_repo == repo)
|
||||
|
|
@ -179,28 +187,31 @@ class PullRequestModel(BaseModel):
|
|||
|
||||
return q
|
||||
|
||||
def count_all(self, repo_name, source=False, statuses=None,
|
||||
def count_all(self, repo_name, search_q=None, source=False, statuses=None,
|
||||
opened_by=None):
|
||||
"""
|
||||
Count the number of pull requests for a specific repository.
|
||||
|
||||
:param repo_name: target or source repo
|
||||
:param search_q: filter by text
|
||||
:param source: boolean flag to specify if repo_name refers to source
|
||||
:param statuses: list of pull request statuses
|
||||
:param opened_by: author user of the pull request
|
||||
:returns: int number of pull requests
|
||||
"""
|
||||
q = self._prepare_get_all_query(
|
||||
repo_name, source=source, statuses=statuses, opened_by=opened_by)
|
||||
repo_name, search_q=search_q, source=source, statuses=statuses,
|
||||
opened_by=opened_by)
|
||||
|
||||
return q.count()
|
||||
|
||||
def get_all(self, repo_name, source=False, statuses=None, opened_by=None,
|
||||
offset=0, length=None, order_by=None, order_dir='desc'):
|
||||
def get_all(self, repo_name, search_q=None, source=False, statuses=None,
|
||||
opened_by=None, offset=0, length=None, order_by=None, order_dir='desc'):
|
||||
"""
|
||||
Get all pull requests for a specific repository.
|
||||
|
||||
:param repo_name: target or source repo
|
||||
:param search_q: filter by text
|
||||
:param source: boolean flag to specify if repo_name refers to source
|
||||
:param statuses: list of pull request statuses
|
||||
:param opened_by: author user of the pull request
|
||||
|
|
@ -211,8 +222,8 @@ class PullRequestModel(BaseModel):
|
|||
:returns: list of pull requests
|
||||
"""
|
||||
q = self._prepare_get_all_query(
|
||||
repo_name, source=source, statuses=statuses, opened_by=opened_by,
|
||||
order_by=order_by, order_dir=order_dir)
|
||||
repo_name, search_q=search_q, source=source, statuses=statuses,
|
||||
opened_by=opened_by, order_by=order_by, order_dir=order_dir)
|
||||
|
||||
if length:
|
||||
pull_requests = q.limit(length).offset(offset).all()
|
||||
|
|
@ -221,24 +232,25 @@ class PullRequestModel(BaseModel):
|
|||
|
||||
return pull_requests
|
||||
|
||||
def count_awaiting_review(self, repo_name, source=False, statuses=None,
|
||||
def count_awaiting_review(self, repo_name, search_q=None, source=False, statuses=None,
|
||||
opened_by=None):
|
||||
"""
|
||||
Count the number of pull requests for a specific repository that are
|
||||
awaiting review.
|
||||
|
||||
:param repo_name: target or source repo
|
||||
:param search_q: filter by text
|
||||
:param source: boolean flag to specify if repo_name refers to source
|
||||
:param statuses: list of pull request statuses
|
||||
:param opened_by: author user of the pull request
|
||||
:returns: int number of pull requests
|
||||
"""
|
||||
pull_requests = self.get_awaiting_review(
|
||||
repo_name, source=source, statuses=statuses, opened_by=opened_by)
|
||||
repo_name, search_q=search_q, source=source, statuses=statuses, opened_by=opened_by)
|
||||
|
||||
return len(pull_requests)
|
||||
|
||||
def get_awaiting_review(self, repo_name, source=False, statuses=None,
|
||||
def get_awaiting_review(self, repo_name, search_q=None, source=False, statuses=None,
|
||||
opened_by=None, offset=0, length=None,
|
||||
order_by=None, order_dir='desc'):
|
||||
"""
|
||||
|
|
@ -246,6 +258,7 @@ class PullRequestModel(BaseModel):
|
|||
review.
|
||||
|
||||
:param repo_name: target or source repo
|
||||
:param search_q: filter by text
|
||||
:param source: boolean flag to specify if repo_name refers to source
|
||||
:param statuses: list of pull request statuses
|
||||
:param opened_by: author user of the pull request
|
||||
|
|
@ -256,8 +269,8 @@ class PullRequestModel(BaseModel):
|
|||
:returns: list of pull requests
|
||||
"""
|
||||
pull_requests = self.get_all(
|
||||
repo_name, source=source, statuses=statuses, opened_by=opened_by,
|
||||
order_by=order_by, order_dir=order_dir)
|
||||
repo_name, search_q=search_q, source=source, statuses=statuses,
|
||||
opened_by=opened_by, order_by=order_by, order_dir=order_dir)
|
||||
|
||||
_filtered_pull_requests = []
|
||||
for pr in pull_requests:
|
||||
|
|
@ -270,13 +283,14 @@ class PullRequestModel(BaseModel):
|
|||
else:
|
||||
return _filtered_pull_requests
|
||||
|
||||
def count_awaiting_my_review(self, repo_name, source=False, statuses=None,
|
||||
def count_awaiting_my_review(self, repo_name, search_q=None, source=False, statuses=None,
|
||||
opened_by=None, user_id=None):
|
||||
"""
|
||||
Count the number of pull requests for a specific repository that are
|
||||
awaiting review from a specific user.
|
||||
|
||||
:param repo_name: target or source repo
|
||||
:param search_q: filter by text
|
||||
:param source: boolean flag to specify if repo_name refers to source
|
||||
:param statuses: list of pull request statuses
|
||||
:param opened_by: author user of the pull request
|
||||
|
|
@ -284,12 +298,12 @@ class PullRequestModel(BaseModel):
|
|||
:returns: int number of pull requests
|
||||
"""
|
||||
pull_requests = self.get_awaiting_my_review(
|
||||
repo_name, source=source, statuses=statuses, opened_by=opened_by,
|
||||
user_id=user_id)
|
||||
repo_name, search_q=search_q, source=source, statuses=statuses,
|
||||
opened_by=opened_by, user_id=user_id)
|
||||
|
||||
return len(pull_requests)
|
||||
|
||||
def get_awaiting_my_review(self, repo_name, source=False, statuses=None,
|
||||
def get_awaiting_my_review(self, repo_name, search_q=None, source=False, statuses=None,
|
||||
opened_by=None, user_id=None, offset=0,
|
||||
length=None, order_by=None, order_dir='desc'):
|
||||
"""
|
||||
|
|
@ -297,6 +311,7 @@ class PullRequestModel(BaseModel):
|
|||
review from a specific user.
|
||||
|
||||
:param repo_name: target or source repo
|
||||
:param search_q: filter by text
|
||||
:param source: boolean flag to specify if repo_name refers to source
|
||||
:param statuses: list of pull request statuses
|
||||
:param opened_by: author user of the pull request
|
||||
|
|
@ -308,8 +323,8 @@ class PullRequestModel(BaseModel):
|
|||
:returns: list of pull requests
|
||||
"""
|
||||
pull_requests = self.get_all(
|
||||
repo_name, source=source, statuses=statuses, opened_by=opened_by,
|
||||
order_by=order_by, order_dir=order_dir)
|
||||
repo_name, search_q=search_q, source=source, statuses=statuses,
|
||||
opened_by=opened_by, order_by=order_by, order_dir=order_dir)
|
||||
|
||||
_my = PullRequestModel().get_not_reviewed(user_id)
|
||||
my_participation = []
|
||||
|
|
|
|||
|
|
@ -42,6 +42,20 @@
|
|||
</span>
|
||||
</li>
|
||||
% endif
|
||||
|
||||
<li>
|
||||
<div class="grid-quick-filter">
|
||||
<ul class="grid-filter-box">
|
||||
<li class="grid-filter-box-icon">
|
||||
<i class="icon-search"></i>
|
||||
</li>
|
||||
<li class="grid-filter-box-input">
|
||||
<input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" placeholder="${_('quick filter...')}" value=""/>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
|
@ -54,7 +68,6 @@
|
|||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
|
||||
var $pullRequestListTable = $('#pull_request_list_table');
|
||||
|
||||
// object list
|
||||
|
|
@ -115,6 +128,15 @@ $(document).ready(function() {
|
|||
$pullRequestListTable.css('opacity', 0.3);
|
||||
});
|
||||
|
||||
// filter
|
||||
$('#q_filter').on('keyup',
|
||||
$.debounce(250, function() {
|
||||
$pullRequestListTable.DataTable().search(
|
||||
$('#q_filter').val()
|
||||
).draw();
|
||||
})
|
||||
);
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue