diff --git a/seahub/api2/endpoints/admin/org_groups.py b/seahub/api2/endpoints/admin/org_groups.py index 8ca8cfd29c..583eec23dc 100644 --- a/seahub/api2/endpoints/admin/org_groups.py +++ b/seahub/api2/endpoints/admin/org_groups.py @@ -12,7 +12,9 @@ from seahub.api2.authentication import TokenAuthentication from seahub.api2.throttling import UserRateThrottle from seahub.api2.utils import api_error from seahub.api2.permissions import IsProVersion +from seahub.utils import is_pro_version from seahub.utils.timeutils import timestamp_to_isoformat_timestr +from seahub.base.templatetags.seahub_tags import email2nickname, email2contact_email try: from seahub.settings import ORG_MEMBER_QUOTA_ENABLED @@ -22,16 +24,6 @@ except ImportError: logger = logging.getLogger(__name__) -def get_org_group_info(group): - group_info = {} - group_info['group_name'] = group.group_name - group_info['creator_name'] = group.creator_name - group_info['created_at'] = timestamp_to_isoformat_timestr(group.timestamp) - group_info['group_id'] = group.id - - return group_info - - class AdminOrgGroups(APIView): authentication_classes = (TokenAuthentication, SessionAuthentication) @@ -61,8 +53,27 @@ class AdminOrgGroups(APIView): error_msg = "Internal Server Error" return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) + # Use dict to reduce memcache fetch cost in large for-loop. + nickname_dict = {} + contact_email_dict = {} + creator_name_set = set([g.creator_name for g in groups]) + for e in creator_name_set: + if e not in nickname_dict: + nickname_dict[e] = email2nickname(e) + if e not in contact_email_dict: + contact_email_dict[e] = email2contact_email(e) + groups_info = [] for group in groups: - groups_info.append(get_org_group_info(group)) + group_info = {} + group_info['group_name'] = group.group_name + group_info['creator_email'] = group.creator_name + group_info['creator_name'] = nickname_dict.get(group.creator_name, '') + group_info['creator_contact_email'] = contact_email_dict.get(group.creator_name, '') + group_info['created_at'] = timestamp_to_isoformat_timestr(group.timestamp) + group_info['parent_group_id'] = group.parent_group_id if is_pro_version() else 0 + group_info['group_id'] = group.id + + groups_info.append(group_info) return Response({'group_list': groups_info}) diff --git a/seahub/api2/endpoints/admin/org_repos.py b/seahub/api2/endpoints/admin/org_repos.py index c181e4a8cb..84112d57eb 100644 --- a/seahub/api2/endpoints/admin/org_repos.py +++ b/seahub/api2/endpoints/admin/org_repos.py @@ -22,15 +22,6 @@ except ImportError: logger = logging.getLogger(__name__) -def get_org_repo_info(repo): - repo_info = {} - repo_info['repo_name'] = repo.repo_name - repo_info['owner_email'] = seafile_api.get_org_repo_owner(repo.id) - repo_info['repo_id'] = repo.id - - return repo_info - - class AdminOrgRepos(APIView): authentication_classes = (TokenAuthentication, SessionAuthentication) @@ -60,8 +51,27 @@ class AdminOrgRepos(APIView): error_msg = "Internal Server Error" return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) + # Use dict to reduce memcache fetch cost in large for-loop. + repo_id_2_email_dict = {repo.id: seafile_api.get_org_repo_owner(repo.id) for repo in repos} + owner_email_set = set(repo_id_2_email_dict.values()) + nickname_dict = {} + contact_email_dict = {} + for e in owner_email_set: + if e not in nickname_dict: + nickname_dict[e] = email2nickname(e) + if e not in contact_email_dict: + contact_email_dict[e] = email2contact_email(e) + repos_info = [] for repo in repos: - repos_info.append(get_org_repo_info(repo)) + repo_info = {} + repo_info['repo_name'] = repo.repo_name + owner_email = repo_id_2_email_dict.get(repo.id, '') + repo_info['owner_email'] = owner_email + repo_info['owner_name'] = nickname_dict.get(owner_email, '') + repo_info['owner_contact_email'] = contact_email_dict.get(owner_email, '') + repo_info['repo_id'] = repo.id + + repos_info.append(repo_info) return Response({'repo_list': repos_info})