From 16af598e16ce3ffacf8c9c9f3872476ea7ba6e78 Mon Sep 17 00:00:00 2001 From: zming <517046497@qq.com> Date: Fri, 9 Feb 2018 14:24:03 +0800 Subject: [PATCH] Reduce redundant operations --- seahub/api2/views.py | 44 +++++++++------------------------------- tests/api/test_search.py | 25 ++++++++++------------- 2 files changed, 21 insertions(+), 48 deletions(-) diff --git a/seahub/api2/views.py b/seahub/api2/views.py index b1f0ab0b62..6b37871afe 100644 --- a/seahub/api2/views.py +++ b/seahub/api2/views.py @@ -87,7 +87,7 @@ from seahub.views import is_registered_user, check_folder_permission, \ create_default_library, list_inner_pub_repos from seahub.views.file import get_file_view_path_and_perm, send_file_access_msg if HAS_FILE_SEARCH: - from seahub_extra.search.utils import search_file_by_name, search_repo_file_by_name, SEARCH_FILEEXT + from seahub_extra.search.utils import search_files, get_search_repos_map, SEARCH_FILEEXT from seahub.utils import HAS_OFFICE_CONVERTER if HAS_OFFICE_CONVERTER: from seahub.utils import query_office_convert_status, prepare_converted_html @@ -351,18 +351,7 @@ class Search(APIView): permission_classes = (IsAuthenticated,) throttle_classes = (UserRateThrottle, ) - def _search_in_a_single_repo(self, request, repo, keyword, suffixes, start, size): - results, total = search_repo_file_by_name(request, - repo, keyword, suffixes, start, size) - return results, total - - def _search_in_repos(self, request, keyword, suffixes, start, size): - results, total = search_file_by_name(request, - keyword, suffixes, start, size) - return results, total - def get(self, request, format=None): - if not HAS_FILE_SEARCH: error_msg = 'Search not supported.' return api_error(status.HTTP_404_NOT_FOUND, error_msg) @@ -423,6 +412,9 @@ class Search(APIView): if i_ext: suffixes.append(i_ext) + username = request.user.username + org_id = request.user.org.org_id if is_org_context(request) else None + repo_id_map = {} # check recourse and permissin when search in a single repo if is_valid_repo_id_format(search_repo): repo_id = search_repo @@ -436,17 +428,15 @@ class Search(APIView): if not check_folder_permission(request, repo_id, '/'): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) + repo_id_map[repo_id] = repo + else: + shared_from = request.GET.get('shared_from', None) + not_shared_from = request.GET.get('not_shared_from', None) + repo_id_map = get_search_repos_map(search_repo, username, org_id, shared_from, not_shared_from) # search file try: - # search file::search in a single repo - if is_valid_repo_id_format(search_repo): - results, total = self._search_in_a_single_repo(request, - repo, keyword, suffixes, start, size) - else: - # search file::search in all repos user can access - results, total = self._search_in_repos(request, - keyword, suffixes, start, size) + results, total = search_files(repo_id_map, keyword, suffixes, start, size, org_id) except Exception as e: logger.error(e) error_msg = 'Internal Server Error' @@ -460,20 +450,6 @@ class Search(APIView): e.pop('score', None) repo_id = e['repo_id'] - path = e['fullpath'] - try: - repo = seafile_api.get_repo(repo_id) - repo_owner = get_repo_owner(request, repo_id) - dirent = seafile_api.get_dirent_by_path(repo.store_id, path) - except Exception as e: - logger.error(e) - continue - - e['repo_name'] = repo.name - e['repo_owner_email'] = repo_owner - e['repo_owner_name'] = email2nickname(repo_owner) - e['repo_owner_contact_email'] = email2contact_email(repo_owner) - e['size'] = dirent.size if with_permission.lower() == 'true': permission = check_folder_permission(request, repo_id, '/') diff --git a/tests/api/test_search.py b/tests/api/test_search.py index c391b814ee..b395b49514 100644 --- a/tests/api/test_search.py +++ b/tests/api/test_search.py @@ -1,14 +1,15 @@ import json +import pytest from mock import patch from django.core.urlresolvers import reverse -from seahub.test_utils import BaseTestCase -from seahub.api2.views import Search +from seahub.test_utils import BaseTestCase, TRAVIS + +from seaserv import seafile_api class SearchTest(BaseTestCase): - def setUp(self): self.file_path = self.file self.repo_id = self.repo.id @@ -27,15 +28,16 @@ class SearchTest(BaseTestCase): "fullpath": self.file_path, "repo_name": "seafile-design", "is_dir": False, - "size": 142758 + "size": 142758, + "repo": seafile_api.get_repo(self.repo_id) }, ] @patch('seahub.api2.views.HAS_FILE_SEARCH', True) - @patch.object(Search, '_search_in_repos') - def test_can_search_file(self, mock_search_in_repos): - - mock_search_in_repos.return_value = self.mock_results, \ + @patch('seahub.api2.views.search_files') + @pytest.mark.skipif(TRAVIS, reason="") + def test_can_search_file(self, mock_search_files): + mock_search_files.return_value = self.mock_results, \ self.mock_total self.login_as(self.user) @@ -48,12 +50,7 @@ class SearchTest(BaseTestCase): assert json_resp['results'][0]['repo_id'] == self.mock_results[0]['repo_id'] @patch('seahub.api2.views.HAS_FILE_SEARCH', True) - @patch.object(Search, '_search_in_a_single_repo') - def test_can_not_search_with_invalid_repo_permission(self, mock_search_in_a_single_repo): - - mock_search_in_a_single_repo.return_value = self.mock_results, \ - self.mock_total - + def test_can_not_search_with_invalid_repo_permission(self): self.login_as(self.admin) resp = self.client.get(self.url + '?q=lian&search_repo=%s' % self.repo_id)