Show More
@@ -35,8 +35,8 b' from rhodecode.lib.index import searcher' | |||
|
35 | 35 | from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int |
|
36 | 36 | from rhodecode.lib.vcs.nodes import FileNode |
|
37 | 37 | from rhodecode.model.db import ( |
|
38 | func, true, or_, case, in_filter_generator, Session, | |
|
39 | Repository, RepoGroup, User, UserGroup) | |
|
38 | func, true, or_, case, cast, in_filter_generator, String, Session, | |
|
39 | Repository, RepoGroup, User, UserGroup, PullRequest) | |
|
40 | 40 | from rhodecode.model.repo import RepoModel |
|
41 | 41 | from rhodecode.model.repo_group import RepoGroupModel |
|
42 | 42 | from rhodecode.model.user import UserModel |
@@ -111,7 +111,7 b' class HomeView(BaseAppView, DataGridAppV' | |||
|
111 | 111 | org_query = name_contains |
|
112 | 112 | allowed_ids = self._rhodecode_user.repo_acl_ids( |
|
113 | 113 | ['repository.read', 'repository.write', 'repository.admin'], |
|
114 |
cache= |
|
|
114 | cache=True, name_filter=name_contains) or [-1] | |
|
115 | 115 | |
|
116 | 116 | query = Session().query( |
|
117 | 117 | Repository.repo_name, |
@@ -162,7 +162,7 b' class HomeView(BaseAppView, DataGridAppV' | |||
|
162 | 162 | org_query = name_contains |
|
163 | 163 | allowed_ids = self._rhodecode_user.repo_group_acl_ids( |
|
164 | 164 | ['group.read', 'group.write', 'group.admin'], |
|
165 |
cache= |
|
|
165 | cache=True, name_filter=name_contains) or [-1] | |
|
166 | 166 | |
|
167 | 167 | query = Session().query( |
|
168 | 168 | RepoGroup.group_id, |
@@ -282,6 +282,61 b' class HomeView(BaseAppView, DataGridAppV' | |||
|
282 | 282 | } |
|
283 | 283 | for obj in acl_iter], True |
|
284 | 284 | |
|
285 | def _get_pull_request_list(self, name_contains=None, limit=20): | |
|
286 | org_query = name_contains | |
|
287 | if not name_contains: | |
|
288 | return [], False | |
|
289 | ||
|
290 | # TODO(marcink): should all logged in users be allowed to search others? | |
|
291 | allowed_user_search = self._rhodecode_user.username != User.DEFAULT_USER | |
|
292 | if not allowed_user_search: | |
|
293 | return [], False | |
|
294 | ||
|
295 | name_contains = re.compile('(?:pr:[ ]?)(.+)').findall(name_contains) | |
|
296 | if len(name_contains) != 1: | |
|
297 | return [], False | |
|
298 | ||
|
299 | name_contains = name_contains[0] | |
|
300 | ||
|
301 | allowed_ids = self._rhodecode_user.repo_acl_ids( | |
|
302 | ['repository.read', 'repository.write', 'repository.admin'], | |
|
303 | cache=True) or [-1] | |
|
304 | ||
|
305 | query = Session().query( | |
|
306 | PullRequest.pull_request_id, | |
|
307 | PullRequest.title, | |
|
308 | ) | |
|
309 | query = query.join(Repository, Repository.repo_id == PullRequest.target_repo_id) | |
|
310 | ||
|
311 | query = query.filter(or_( | |
|
312 | # generate multiple IN to fix limitation problems | |
|
313 | *in_filter_generator(Repository.repo_id, allowed_ids) | |
|
314 | )) | |
|
315 | ||
|
316 | query = query.order_by(PullRequest.pull_request_id) | |
|
317 | ||
|
318 | if name_contains: | |
|
319 | ilike_expression = u'%{}%'.format(safe_unicode(name_contains)) | |
|
320 | query = query.filter(or_( | |
|
321 | cast(PullRequest.pull_request_id, String).ilike(ilike_expression), | |
|
322 | PullRequest.title.ilike(ilike_expression), | |
|
323 | PullRequest.description.ilike(ilike_expression), | |
|
324 | )) | |
|
325 | ||
|
326 | query = query.limit(limit) | |
|
327 | ||
|
328 | acl_iter = query | |
|
329 | ||
|
330 | return [ | |
|
331 | { | |
|
332 | 'id': obj.pull_request_id, | |
|
333 | 'value': org_query, | |
|
334 | 'value_display': 'pull request: `!{} - {}`'.format(obj.pull_request_id, obj.title[:50]), | |
|
335 | 'type': 'pull_request', | |
|
336 | 'url': h.route_path('pull_requests_global', pull_request_id=obj.pull_request_id) | |
|
337 | } | |
|
338 | for obj in acl_iter], True | |
|
339 | ||
|
285 | 340 | def _get_hash_commit_list(self, auth_user, searcher, query, repo=None, repo_group=None): |
|
286 | 341 | repo_name = repo_group_name = None |
|
287 | 342 | if repo: |
@@ -624,6 +679,17 b' class HomeView(BaseAppView, DataGridAppV' | |||
|
624 | 679 | has_specialized_search = True |
|
625 | 680 | res.append(no_match('No matching user groups found')) |
|
626 | 681 | |
|
682 | # pr: type search | |
|
683 | if not prefix_match: | |
|
684 | pull_requests, prefix_match = self._get_pull_request_list(query) | |
|
685 | if pull_requests: | |
|
686 | has_specialized_search = True | |
|
687 | for serialized_pull_request in pull_requests: | |
|
688 | res.append(serialized_pull_request) | |
|
689 | elif prefix_match: | |
|
690 | has_specialized_search = True | |
|
691 | res.append(no_match('No matching pull requests found')) | |
|
692 | ||
|
627 | 693 | # FTS commit: type search |
|
628 | 694 | if not prefix_match: |
|
629 | 695 | commits, prefix_match = self._get_hash_commit_list( |
@@ -783,6 +783,8 b'' | |||
|
783 | 783 | |
|
784 | 784 | user_group:devops, to search for user groups, always global |
|
785 | 785 | |
|
786 | pr:303, to search for pull request number, title, or description, always global | |
|
787 | ||
|
786 | 788 | commit:efced4, to search for commits, scoped to repositories or groups |
|
787 | 789 | |
|
788 | 790 | file:models.py, to search for file paths, scoped to repositories or groups |
@@ -975,6 +977,10 b'' | |||
|
975 | 977 | else if (searchType === 'user') { |
|
976 | 978 | icon += '<img class="gravatar" src="{0}"/>'.format(data['icon_link']); |
|
977 | 979 | } |
|
980 | // pull request | |
|
981 | else if (searchType === 'pull_request') { | |
|
982 | icon += '<i class="icon-merge"></i> '; | |
|
983 | } | |
|
978 | 984 | // commit |
|
979 | 985 | else if (searchType === 'commit') { |
|
980 | 986 | var repo_data = data['repo_data']; |
General Comments 0
You need to be logged in to leave comments.
Login now