1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-04-28 03:10:45 +00:00

Reduce redundant operations

This commit is contained in:
zming 2018-02-09 14:24:03 +08:00
parent 5b02073588
commit 16af598e16
2 changed files with 21 additions and 48 deletions

View File

@ -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, '/')

View File

@ -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)