diff --git a/organizations/views.py b/organizations/views.py index 1d0f9d521b..7a432043fb 100644 --- a/organizations/views.py +++ b/organizations/views.py @@ -14,12 +14,14 @@ from django.utils.translation import ugettext as _ from auth.decorators import login_required from pysearpc import SearpcError -from seaserv import ccnet_threaded_rpc, seafserv_rpc, seafserv_threaded_rpc, get_repo, \ +from seaserv import ccnet_threaded_rpc, seafserv_rpc, seafserv_threaded_rpc,\ get_orgs_by_user, get_org_repos, list_org_inner_pub_repos, \ get_org_by_url_prefix, create_org, get_user_current_org, add_org_user, \ remove_org_user, get_org_groups, is_valid_filename, org_user_exists, \ create_org_repo, get_org_id_by_group, get_org_groups_by_user, \ - get_org_users_by_url_prefix, list_org_shared_repos, is_personal_repo + get_org_users_by_url_prefix, list_org_shared_repos, is_personal_repo, \ + get_org_group_repoids, is_org_repo_owner, get_repo, get_commits, \ + check_permission, get_org_repo_owner from decorators import org_staff_required from forms import OrgCreateForm @@ -108,12 +110,36 @@ def org_personal(request, url_prefix): calculate_repo_last_modify(owned_repos) owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) - # Org repos others shared to me - in_repos = list_org_shared_repos(org.org_id, user,'to_email', -1, -1) - # Org groups user created groups = get_org_groups_by_user(org.org_id, user) + # Org repos others shared to me + in_repos = list_org_shared_repos(org.org_id, user,'to_email', -1, -1) + # For each org group I joined... + for grp in groups: + # Get org group repos, and for each group repos... + for r_id in get_org_group_repoids(org.org_id, grp.id): + # No need to list my own repo + if is_org_repo_owner(org.org_id, r_id, user): + continue + # Convert repo properties due to the different collumns in Repo + # and SharedRepo + r = get_repo(r_id) + if not r: + continue + r.repo_id = r.id + r.repo_name = r.name + r.repo_desc = r.desc + try: + r.last_modified = get_commits(r_id, 0, 1)[0].ctime + except: + r.last_modified = 0 + r.share_type = 'group' + r.user = get_org_repo_owner(r_id) + r.user_perm = check_permission(r_id, user) + in_repos.append(r) + in_repos.sort(lambda x, y: cmp(y.last_modified, x.last_modified)) + # All org groups used in auto complete. org_groups = get_org_groups(org.org_id, -1, -1) diff --git a/templates/snippets/my_owned_repos.html b/templates/snippets/my_owned_repos.html index 11e8296ce2..2ff2f437d1 100644 --- a/templates/snippets/my_owned_repos.html +++ b/templates/snippets/my_owned_repos.html @@ -69,17 +69,19 @@ {% trans {% endif %} - {{ repo.props.repo_name }} - {{ repo.props.repo_desc }} - {% if repo.props.last_modified %} - {{ repo.props.last_modified|translate_seahub_time }} + {{ repo.repo_name }} + {{ repo.repo_desc }} + {% if repo.last_modified %} + {{ repo.last_modified|translate_seahub_time }} {% else %} -- {% endif %} - {{ repo.props.user|email2nickname }} + {{ repo.user|email2nickname }} - {% trans - {% trans + {% trans + {% if repo.share_type == 'personal' %} + {% trans + {% endif %} {% endfor %} @@ -87,7 +89,7 @@ {% else %}

{% trans "No library is shared to you" %}

-

{% trans "Libraries shared to you will be listed here. Libraries shared as writable can be downloaded and synced. Read only libraries can only be downloaded, updates on local files will not be uploaded." %}

+

{% trans "Libraries shared to you or shared to groups you joined will be listed here. Libraries shared as writable can be downloaded and synced. Read only libraries can only be downloaded, updates on local files will not be uploaded." %}

{% endif %} diff --git a/thirdpart/seaserv/__init__.py b/thirdpart/seaserv/__init__.py index b821b75186..c0e2633823 100644 --- a/thirdpart/seaserv/__init__.py +++ b/thirdpart/seaserv/__init__.py @@ -9,13 +9,13 @@ from service import get_org_groups, get_personal_groups_by_user, \ check_group_staff, remove_group_user, get_group, get_org_id_by_group, \ get_group_members, get_shared_groups_by_repo, is_group_user, \ get_org_group_repos, get_group_repos, get_org_groups_by_user, is_org_group,\ - del_org_group_repo, get_org_groups_by_repo + del_org_group_repo, get_org_groups_by_repo, get_org_group_repoids from service import get_repos, get_repo, get_commits, get_branches, remove_repo, \ get_org_repos, is_repo_owner, create_org_repo, is_inner_pub_repo, \ list_org_inner_pub_repos, get_org_id_by_repo_id, list_org_shared_repos, \ list_personal_shared_repos, is_personal_repo, list_inner_pub_repos, \ is_org_repo_owner, get_org_repo_owner, is_org_repo, get_file_size,\ - list_personal_repos_by_owner, get_repo_token_nonnull + list_personal_repos_by_owner, get_repo_token_nonnull, get_repo_owner from service import get_binding_peerids, is_valid_filename, check_permission,\ is_passwd_set diff --git a/thirdpart/seaserv/service.py b/thirdpart/seaserv/service.py index 9b307e5cb3..1e001b9b0f 100644 --- a/thirdpart/seaserv/service.py +++ b/thirdpart/seaserv/service.py @@ -314,6 +314,16 @@ def list_personal_repos_by_owner(owner): def get_repo_token_nonnull(repo_id, username): return seafserv_threaded_rpc.get_repo_token_nonnull (repo_id, username) + +def get_repo_owner(repo_id): + """ + Get owner of a repo. + """ + try: + ret = seafserv_threaded_rpc.get_repo_owner(repo_id) + except SearpcError: + ret = '' + return ret def is_repo_owner(user, repo_id): """ @@ -387,7 +397,7 @@ def is_org_repo_owner(org_id, repo_id, user): def get_org_repo_owner(repo_id): """ - Get owner of repo repo. + Get owner of org repo. """ try: owner = seafserv_threaded_rpc.get_org_repo_owner(repo_id) @@ -423,6 +433,20 @@ def get_shared_groups_by_repo(repo_id): groups.append(group) return groups +def conv_repoids_to_list(repo_ids): + """ + Convert repo ids seperated by "\n" to list. + """ + if not repo_ids: + return [] + + repoid_list = [] + for repo_id in repo_ids.split("\n"): + if repo_id == '': + continue + repoid_list.append(repo_id) + return repoid_list + def get_group_repoids(group_id): """Get repo ids of a given group id.""" try: @@ -430,31 +454,11 @@ def get_group_repoids(group_id): except SearpcError: return [] - if not repo_ids: - return [] - - repoid_list = [] - for repo_id in repo_ids.split("\n"): - if repo_id == '': - continue - repoid_list.append(repo_id) - return repoid_list + return conv_repoids_to_list(repo_ids) def get_group_repos(group_id, user): """Get repos of a given group id.""" - try: - repo_ids = seafserv_threaded_rpc.get_group_repoids(group_id) - except SearpcError: - return [] - - if not repo_ids: - return [] - - repoid_list = [] - for repo_id in repo_ids.split("\n"): - if repo_id == '': - continue - repoid_list.append(repo_id) + repoid_list = get_group_repoids(group_id) repos = [] for repo_id in repoid_list: @@ -480,23 +484,21 @@ def get_group_repos(group_id, user): # org group repo def del_org_group_repo(repo_id, org_id, group_id): seafserv_threaded_rpc.del_org_group_repo(repo_id, org_id, group_id) - -def get_org_group_repos(org_id, group_id, user): - """Get org repos of a given group id.""" + +def get_org_group_repoids(org_id, group_id): try: repo_ids = seafserv_threaded_rpc.get_org_group_repoids(org_id, group_id) except SearpcError: - return [] + repo_ids = '' - if not repo_ids: + return conv_repoids_to_list(repo_ids) + +def get_org_group_repos(org_id, group_id, user): + """Get org repos of a given group id.""" + repoid_list = get_org_group_repoids(org_id, group_id) + if not repoid_list: return [] - repoid_list = [] - for repo_id in repo_ids.split("\n"): - if repo_id == '': - continue - repoid_list.append(repo_id) - repos = [] for repo_id in repoid_list: if not repo_id: diff --git a/views.py b/views.py index 4e134a6225..cdbca1356f 100644 --- a/views.py +++ b/views.py @@ -44,7 +44,7 @@ from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, get_emailusers, \ list_inner_pub_repos, get_org_groups_by_repo, is_org_repo_owner, \ get_org_repo_owner, is_passwd_set, get_file_size, check_quota, \ get_related_users_by_repo, get_related_users_by_org_repo, HtmlDiff, \ - get_session_info + get_session_info, get_group_repoids, get_repo_owner from pysearpc import SearpcError from signals import repo_created, repo_deleted @@ -838,14 +838,41 @@ def myhome(request): quota = seafserv_threaded_rpc.get_user_quota(email) quota_usage = seafserv_threaded_rpc.get_user_quota_usage(email) - # Personal repos that I own + # Get all personal groups I joined. + joined_groups = get_personal_groups_by_user(request.user.username) + + # Personal repos that I owned. owned_repos = seafserv_threaded_rpc.list_owned_repos(email) calculate_repo_last_modify(owned_repos) owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) # Personal repos others shared to me in_repos = list_personal_shared_repos(email,'to_email', -1, -1) - + # For each group I joined... + for grp in joined_groups: + # Get group repos, and for each group repos... + for r_id in get_group_repoids(grp.id): + # No need to list my own repo + if is_repo_owner(email, r_id): + continue + # Convert repo properties due to the different collumns in Repo + # and SharedRepo + r = get_repo(r_id) + if not r: + continue + r.repo_id = r.id + r.repo_name = r.name + r.repo_desc = r.desc + try: + r.last_modified = get_commits(r_id, 0, 1)[0].ctime + except: + r.last_modified = 0 + r.share_type = 'group' + r.user = get_repo_owner(r_id) + r.user_perm = check_permission(r_id, email) + in_repos.append(r) + in_repos.sort(lambda x, y: cmp(y.last_modified, x.last_modified)) + # user notifications grpmsg_list = [] grpmsg_reply_list = [] @@ -862,9 +889,6 @@ def myhome(request): elif n.msg_type == 'org_join_msg': orgmsg_list.append(n.detail) - # Get all personal groups I joined. - joined_groups = get_personal_groups_by_user(request.user.username) - # get nickname profiles = Profile.objects.filter(user=request.user.username) nickname = profiles[0].nickname if profiles else '' @@ -1732,10 +1756,7 @@ def sys_seafadmin(request): if is_org_repo(repo.id): repo.owner = get_org_repo_owner(repo.id) else: - try: - repo.owner = seafserv_threaded_rpc.get_repo_owner(repo.id) - except: - repo.owner = None + repo.owner = get_repo_owner(repo.id) return render_to_response( 'sys_seafadmin.html', {