diff --git a/api/views.py b/api/views.py index 5ad41b3afa..ec762a963f 100644 --- a/api/views.py +++ b/api/views.py @@ -25,7 +25,7 @@ from pysearpc import SearpcError from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, \ get_repo, get_commits, get_branches, \ seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, \ - get_group_repoids, check_group_staff + check_group_staff from seahub.utils import list_to_string, \ get_httpserver_root, gen_token, \ diff --git a/avatar/views.py b/avatar/views.py index db61c0b92a..c58e3b5cf6 100644 --- a/avatar/views.py +++ b/avatar/views.py @@ -13,7 +13,8 @@ from avatar.settings import AVATAR_MAX_AVATARS_PER_USER, AVATAR_DEFAULT_SIZE from avatar.signals import avatar_updated from avatar.util import get_primary_avatar, get_default_avatar_url, \ invalidate_cache -from seahub.utils import render_error, render_permission_error +from seahub.utils import render_error, render_permission_error, \ + check_and_get_org_by_group from auth.decorators import login_required from seaserv import ccnet_threaded_rpc, check_group_staff @@ -103,6 +104,9 @@ def group_add(request): if not group: return HttpResponseRedirect(reverse('group_list', args=[])) + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_group(group_id_int) + form = GroupAvatarForm(request.POST or None, request.FILES or None) if request.method == 'POST' and 'avatar' in request.FILES: @@ -116,6 +120,8 @@ def group_add(request): return render_to_response('avatar/set_avatar.html', { 'group' : group, 'form' : form, + 'org': org, + 'base_template': base_template, }, context_instance=RequestContext(request)) @login_required diff --git a/base/templatetags/seahub_tags.py b/base/templatetags/seahub_tags.py index 968baf2a57..6d8c00f33e 100644 --- a/base/templatetags/seahub_tags.py +++ b/base/templatetags/seahub_tags.py @@ -118,6 +118,9 @@ def translate_remain_time(value): @register.filter(name='email2nickname') def email2nickname(value): + if not value: + return '' + nickname = cache.get(NICKNAME_CACHE_PREFIX+value) if not nickname: profile = get_first_object_or_none(Profile.objects.filter(user=value)) diff --git a/group/templates/group/group_info.html b/group/templates/group/group_info.html index 4d43f31b20..4fb11267fc 100644 --- a/group/templates/group/group_info.html +++ b/group/templates/group/group_info.html @@ -1,4 +1,5 @@ {% extends base_template %} + {% load seahub_tags avatar_tags %} {% load url from future %} @@ -69,11 +70,11 @@ {% else %} —— —— {% endif %} - {{ repo.share_from|email2nickname }} + {{ repo.owner|email2nickname }} 同步 {% if is_staff or repo.share_from_me %} - 取消共享 + 取消共享 {% endif %} diff --git a/group/templates/group/new_msg_reply.html b/group/templates/group/new_msg_reply.html index 8bd2693702..697925334e 100644 --- a/group/templates/group/new_msg_reply.html +++ b/group/templates/group/new_msg_reply.html @@ -1,4 +1,4 @@ -{% extends base_template %} +{% extends "myhome_base.html" %} {% load seahub_tags avatar_tags %} {% load url from future %} diff --git a/group/views.py b/group/views.py index 621048638b..af06d7d4ed 100644 --- a/group/views.py +++ b/group/views.py @@ -11,8 +11,9 @@ from django.template.loader import render_to_string from auth.decorators import login_required from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, \ - get_repo, get_group_repoids, check_group_staff, get_commits, \ - get_personal_groups, get_group, get_group_members + get_repo, get_group_repos, check_group_staff, get_commits, \ + get_personal_groups, get_group, get_group_members, create_org_repo, \ + get_org_group_repos from pysearpc import SearpcError from models import GroupMessage, MessageReply, MessageAttachment @@ -25,7 +26,7 @@ from seahub.profile.models import Profile from seahub.settings import SITE_ROOT from seahub.shortcuts import get_first_object_or_none from seahub.utils import render_error, render_permission_error, \ - validate_group_name, string2list + validate_group_name, string2list, check_and_get_org_by_group from seahub.views import is_registered_user from seahub.forms import RepoCreateForm @@ -138,6 +139,9 @@ def render_group_info(request, group_id, form): except ValueError: return HttpResponseRedirect(reverse('group_list', args=[])) + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_group(group_id_int) + # Check whether user belong to the group or admin joined = False groups = ccnet_threaded_rpc.get_groups(request.user.username) @@ -145,7 +149,10 @@ def render_group_info(request, group_id, form): if group.id == group_id_int: joined = True if not joined and not request.user.is_staff: - return render_error(request, u'未加入该小组') + return render_error(request, u'未加入该小组', extra_ctx={ + 'org': org, + 'base_template': base_template, + }) # if request.user.org and not request.user.org.is_staff: # return render_error(request, u'未加入该小组') @@ -169,25 +176,11 @@ def render_group_info(request, group_id, form): else: common_members.append(member) - repos = [] - repo_ids = get_group_repoids(group_id=group_id_int) - for repo_id in repo_ids: - if not repo_id: - continue - repo = get_repo(repo_id) - if not repo: - continue - - repo.share_from = seafserv_threaded_rpc.get_group_repo_share_from(repo_id) - repo.share_from_me = True if request.user.username == repo.share_from else False - - try: - repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime - except: - repo.latest_modify = None - - repos.append(repo) - repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) + if org: + repos = get_org_group_repos(org.org_id, group_id_int, + request.user.username) + else: + repos = get_group_repos(group_id_int, request.user.username) # remove user notifications UserNotification.objects.filter(to_user=request.user.username, @@ -259,6 +252,8 @@ def render_group_info(request, group_id, form): 'per_page': per_page, 'page_next': page_next, 'url': reverse('create_group_repo', args=[group_id]), + 'org': org, + 'base_template': base_template, }, context_instance=RequestContext(request)); @login_required @@ -447,11 +442,16 @@ def group_members(request, group_id): members = ccnet_threaded_rpc.get_group_members(group_id_int) contacts = Contact.objects.filter(user_email=request.user.username) + + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_group(group_id_int) return render_to_response('group/group_manage.html', { 'group' : group, 'members': members, 'contacts': contacts, + 'org': org, + 'base_template': base_template, }, context_instance=RequestContext(request)) @login_required @@ -598,7 +598,7 @@ def group_recommend(request): else: # TODO: need more clear error message messages.add_message(request, messages.ERROR, '推荐失败') - return HttpResponseRedirect(next) + return HttpResponseRedirect(next) @login_required def create_group_repo(request, group_id): @@ -612,7 +612,7 @@ def create_group_repo(request, group_id): content_type=content_type) group_id = int(group_id) if not get_group(group_id): - return json_error(u'共享失败:小组不存在') + return json_error(u'创建失败:小组不存在') # Check whether user belong to the group groups = ccnet_threaded_rpc.get_groups(request.user.username) @@ -620,7 +620,7 @@ def create_group_repo(request, group_id): if group.props.id == group_id: break else: - return json_error(u"共享失败:未加入该小组") + return json_error(u"创建失败:未加入该小组") form = RepoCreateForm(request.POST) if not form.is_valid(): @@ -631,25 +631,56 @@ def create_group_repo(request, group_id): encrypted = form.cleaned_data['encryption'] passwd = form.cleaned_data['passwd'] user = request.user.username - try: - repo_id = seafserv_threaded_rpc.create_repo(repo_name, repo_desc, - user, passwd) - except: - repo_id = None - if not repo_id: - return json_error(u"创建目录失败") - try: - status = seafserv_threaded_rpc.group_share_repo(repo_id, group_id, user, 'rw') - except SearpcError, e: + org, base_template = check_and_get_org_by_group(group_id) + if org: + # create group repo in org context + try: + repo_id = create_org_repo(repo_name, repo_desc, user, passwd, + org.org_id) + except: + repo_id = None + if not repo_id: + return json_error(u"创建目录失败") + + try: + status = seafserv_threaded_rpc.add_org_group_repo(repo_id, + org.org_id, + group_id, + user, 'rw') + except SearpcError, e: + status = -1 + # if share failed, remove the newly created repo - seafserv_threaded_rpc.remove_repo(repo_id) - - return json_error(u'共享失败:内部错误') - else: if status != 0: seafserv_threaded_rpc.remove_repo(repo_id) - return json_error(u'共享失败:内部错误') + return json_error(u'创建目录失败:内部错误') + else: + result = {'success': True} + return HttpResponse(json.dumps(result), + content_type=content_type) + else: + # create group repo in user context + try: + repo_id = seafserv_threaded_rpc.create_repo(repo_name, + repo_desc, + user, passwd) + except: + repo_id = None + if not repo_id: + return json_error(u"创建目录失败") + + try: + status = seafserv_threaded_rpc.group_share_repo(repo_id, + group_id, + user, 'rw') + except SearpcError, e: + status = -1 + + # if share failed, remove the newly created repo + if status != 0: + seafserv_threaded_rpc.remove_repo(repo_id) + return json_error(u'创建目录失败:内部错误') else: result = {'success': True} return HttpResponse(json.dumps(result), diff --git a/organizations/context_processors.py b/organizations/context_processors.py index 4f30518c5a..4fdfb96d3d 100644 --- a/organizations/context_processors.py +++ b/organizations/context_processors.py @@ -1,12 +1,12 @@ -from seahub.utils import get_cur_ctx +# from seahub.utils import get_cur_ctx -def org(request): - """ - Add org info and base template that html page will extends to context. - """ - ctx_dict = get_cur_ctx(request) - base_template = ctx_dict['base_template'] - org_dict = ctx_dict['org_dict'] - return {'base_template': base_template, - 'org': org_dict} +# def org(request): +# """ +# Add org info and base template that html page will extends to context. +# """ +# ctx_dict = get_cur_ctx(request) +# base_template = ctx_dict['base_template'] +# org_dict = ctx_dict['org_dict'] +# return {'base_template': base_template, +# 'org': org_dict} diff --git a/organizations/middleware.py b/organizations/middleware.py index 567339d74f..8b27f8f319 100644 --- a/organizations/middleware.py +++ b/organizations/middleware.py @@ -7,7 +7,7 @@ try: from seahub.settings import CLOUD_MODE except ImportError: CLOUD_MODE = False -from seahub.utils import get_cur_ctx +# from seahub.utils import get_cur_ctx class OrganizationMiddleware(object): """ @@ -20,8 +20,8 @@ class OrganizationMiddleware(object): request.cloud_mode = True # Get current org context - ctx_dict = get_cur_ctx(request) - request.user.org = ctx_dict.get('org_dict', None) + # ctx_dict = get_cur_ctx(request) + # request.user.org = ctx_dict.get('org_dict', None) # Get all orgs user created. orgs = get_orgs_by_user(request.user.username) diff --git a/organizations/templates/organizations/create_org.html b/organizations/templates/organizations/create_org.html index 5e132427b6..01457b0fa4 100644 --- a/organizations/templates/organizations/create_org.html +++ b/organizations/templates/organizations/create_org.html @@ -1,4 +1,4 @@ -{% extends base_template %} +{% extends "myhome_base.html" %} {% block main_panel %}

创建团体

diff --git a/organizations/templates/organizations/personal.html b/organizations/templates/organizations/personal.html index 3f5d7a51c7..ae7309e62d 100644 --- a/organizations/templates/organizations/personal.html +++ b/organizations/templates/organizations/personal.html @@ -57,7 +57,7 @@ {% endif %} 同步 - 共享 + 删除 diff --git a/organizations/views.py b/organizations/views.py index bd81f77134..168b96179d 100644 --- a/organizations/views.py +++ b/organizations/views.py @@ -28,7 +28,7 @@ from seahub.contacts import Contact from seahub.forms import RepoCreateForm import seahub.settings as seahub_settings from seahub.utils import render_error, render_permission_error, gen_token, \ - validate_group_name, string2list, set_cur_ctx, calculate_repo_last_modify,\ + validate_group_name, string2list, calculate_repo_last_modify,\ MAX_INT from seahub.views import myhome @@ -68,9 +68,9 @@ def org_info(request, url_prefix): if not org: return HttpResponseRedirect(reverse(myhome)) - ctx_dict = {'base_template': 'org_base.html', - 'org_dict': org._dict} - set_cur_ctx(request, ctx_dict) + # ctx_dict = {'base_template': 'org_base.html', + # 'org_dict': org._dict} + # set_cur_ctx(request, ctx_dict) org_members = ccnet_threaded_rpc.get_org_emailusers(url_prefix, 0, MAX_INT) @@ -103,6 +103,7 @@ def org_personal(request, url_prefix): return render_to_response('organizations/personal.html', { 'owned_repos': owned_repos, 'url': reverse('org_repo_create', args=[url_prefix]), + 'org': org, }, context_instance=RequestContext(request)) @login_required @@ -123,15 +124,17 @@ def org_inner_pub_repo_create(request, url_prefix): repo_desc = form.cleaned_data['repo_desc'] passwd = form.cleaned_data['passwd'] user = request.user.username - org_id = request.user.org['org_id'] + org = get_user_current_org(request.user.username, url_prefix) + if not org: + return HttpResponse(json.dumps(u'创建目录失败:未加入该团体'), + content_type=content_type) try: # create a org repo - repo_id = seafserv_threaded_rpc.create_org_repo(repo_name, - repo_desc, - user, passwd,org_id) + repo_id = create_org_repo(repo_name, repo_desc, user, passwd, + org.org_id) # set org inner pub - seafserv_threaded_rpc.set_org_inner_pub_repo(org_id, repo_id) + seafserv_threaded_rpc.set_org_inner_pub_repo(org.org_id, repo_id) except: repo_id = None if not repo_id: @@ -155,7 +158,11 @@ def org_groups(request, url_prefix): if request.method == 'POST': group_name = request.POST.get('group_name') if not validate_group_name(group_name): - return render_error(request, u'小组名称只能包含中英文字符,数字及下划线') + return render_error(request, u'小组名称只能包含中英文字符,数字及下划线', + extra_ctx={ + 'org': org, + 'base_template': 'org_base.html', + }) try: group_id = ccnet_threaded_rpc.create_group(group_name.encode('utf-8'), @@ -163,7 +170,10 @@ def org_groups(request, url_prefix): ccnet_threaded_rpc.add_org_group(org.org_id, group_id) except SearpcError, e: error_msg = e.msg - return render_error(request, error_msg) + return render_error(request, error_msg, extra_ctx={ + 'org': org, + 'base_template': 'org_base.html', + }) groups = get_org_groups(org.org_id, 0, MAX_INT) return render_to_response('organizations/org_groups.html', { @@ -205,9 +215,9 @@ def org_useradmin(request, url_prefix): if not org: return HttpResponseRedirect(reverse(myhome)) - ctx_dict = {'base_template': 'org_admin_base.html', - 'org_dict': request.user.org} - set_cur_ctx(request, ctx_dict) + # ctx_dict = {'base_template': 'org_admin_base.html', + # 'org_dict': request.user.org} + # set_cur_ctx(request, ctx_dict) if request.method == 'POST': emails = request.POST.get('added-member-name') @@ -329,9 +339,13 @@ def org_repo_create(request, url_prefix): passwd_again = form.cleaned_data['passwd_again'] user = request.user.username - org_id = request.user.org['org_id'] + org = get_user_current_org(request.user.username, url_prefix) + if not org: + return HttpResponse(json.dumps(u'创建目录失败:未加入该团体'), + content_type=content_type) - repo_id = create_org_repo(repo_name, repo_desc, user, passwd, org_id) + repo_id = create_org_repo(repo_name, repo_desc, user, passwd, + org.org_id) if not repo_id: result['error'] = u"创建目录失败" else: diff --git a/profile/templates/profile/profile_base.html b/profile/templates/profile/profile_base.html index 16fcf438ac..a6bdda9cf7 100644 --- a/profile/templates/profile/profile_base.html +++ b/profile/templates/profile/profile_base.html @@ -1,4 +1,4 @@ -{% extends base_template %} +{% extends "myhome_base.html" %} {% block title %}帐号设置{% endblock %} diff --git a/settings.py b/settings.py index fcb8552149..e2159acefa 100644 --- a/settings.py +++ b/settings.py @@ -94,7 +94,7 @@ TEMPLATE_CONTEXT_PROCESSORS = ( 'django.core.context_processors.request', 'django.contrib.messages.context_processors.messages', 'seahub.base.context_processors.base', - 'seahub.organizations.context_processors.org', +# 'seahub.organizations.context_processors.org', ) diff --git a/templates/myhome.html b/templates/myhome.html index 9bebc5d265..d911601186 100644 --- a/templates/myhome.html +++ b/templates/myhome.html @@ -1,5 +1,6 @@ {% extends "myhome_base.html" %} {% load seahub_tags avatar_tags group_avatar_tags %} +{% load url from future %} {% block nav_myhome_class %}class="cur"{% endblock %} {% block left_panel %} @@ -21,7 +22,7 @@
  • 小组 {% for grp in grpmsg_list %} - {{ grp.group_name }} + {{ grp.group_name }} {% endfor %} 有新留言
  • @@ -30,7 +31,7 @@
  • {{ grpmsg_reply_list|length }}条留言有新回复
  • {% endif %} {% if orgmsg_list %} -
  • {{ orgmsg_list|length }}条团体消息
  • +
  • {{ orgmsg_list|length }}条团体消息
  • {% endif %} {% endif %} diff --git a/templates/myhome_base.html b/templates/myhome_base.html index 1624b42218..b9ae3574a6 100644 --- a/templates/myhome_base.html +++ b/templates/myhome_base.html @@ -10,11 +10,6 @@ 公共页面 {% endif %} - {% if request.user.org %} -
  • - 企业 -
  • - {% endif %}
  • 小组
  • diff --git a/templates/org_info.html b/templates/org_info.html index a4b338edfa..da3e15a2f2 100644 --- a/templates/org_info.html +++ b/templates/org_info.html @@ -44,11 +44,11 @@ {{ repo.props.name }} {{ repo.props.desc }} - {{ repo.share_from }} + {{ repo.owner }} 下载 {% if is_staff or repo.share_from_me %} - 取消共享 + 取消共享 {% endif %} diff --git a/templates/repo_update_file.html b/templates/repo_update_file.html index baaf167903..5ef09b0ca5 100644 --- a/templates/repo_update_file.html +++ b/templates/repo_update_file.html @@ -1,4 +1,4 @@ -{% extends "myhome_base.html" %} +{% extends base_template %} {% load seahub_tags %} {% block main_panel %} diff --git a/thirdpart/seaserv/__init__.py b/thirdpart/seaserv/__init__.py index 11659d0218..cb27d811bd 100644 --- a/thirdpart/seaserv/__init__.py +++ b/thirdpart/seaserv/__init__.py @@ -6,10 +6,11 @@ from service import send_command from service import get_emailusers from service import get_org_groups, get_personal_groups, get_group_repoids, \ 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_group_members, get_shared_groups_by_repo, is_group_user, \ + get_org_group_repos, get_group_repos from service import get_repos, get_repo, get_commits, get_branches, \ get_org_repos, is_repo_owner, create_org_repo, is_inner_pub_repo, \ - list_org_inner_pub_repos + list_org_inner_pub_repos, get_org_id_by_repo_id from service import get_binding_peerids, is_valid_filename, check_permission from service import create_org, get_orgs_by_user, get_org_by_url_prefix, \ get_user_current_org, add_org_user, remove_org_user, get_org_by_id, \ diff --git a/thirdpart/seaserv/service.py b/thirdpart/seaserv/service.py index 4e151c4038..a100688c4a 100644 --- a/thirdpart/seaserv/service.py +++ b/thirdpart/seaserv/service.py @@ -331,8 +331,8 @@ def get_binding_peerids(email): peerid_list.append(peer_id) return peerid_list -def get_group_repoids(group_id=None): - """Get repo ids of a given group id or username""" +def get_group_repoids(group_id): + """Get repo ids of a given group id.""" try: repo_ids = seafserv_threaded_rpc.get_group_repoids(group_id) except SearpcError: @@ -348,6 +348,82 @@ def get_group_repoids(group_id=None): repoid_list.append(repo_id) return repoid_list +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) + + repos = [] + for repo_id in repoid_list: + if not repo_id: + continue + repo = get_repo(repo_id) + if not repo: + continue + + repo.owner = seafserv_threaded_rpc.get_group_repo_share_from(repo_id) + repo.share_from_me = True if user == repo.owner else False + + try: + repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime + except: + repo.latest_modify = None + + repos.append(repo) + repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) + + return repos + +def get_org_group_repos(org_id, group_id, user): + """Get org repos of a given group id.""" + try: + repo_ids = seafserv_threaded_rpc.get_org_group_repoids(org_id, 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) + + repos = [] + for repo_id in repoid_list: + if not repo_id: + continue + repo = get_repo(repo_id) + if not repo: + continue + + repo.owner = seafserv_threaded_rpc.get_org_group_repo_owner(org_id, + group_id, + repo_id) + repo.sharecd_from_me = True if user == repo.owner else False + + try: + repo.latest_modify = get_commits(repo.id, 0, 1)[0].ctime + except: + repo.latest_modify = None + + repos.append(repo) + repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify)) + + return repos + def is_valid_filename(file_or_dir): """ Check whether file name or directory name is valid. @@ -381,3 +457,14 @@ def check_permission(repo_id, user): except SearpcError: ret = -1 return True if ret == 0 else False + +def get_org_id_by_repo(repo_id): + """ + Check whether repo is org repo. + """ + try: + org_id = seafserv_threaded_rpc.get_org_id_by_repo_id(repo_id) + except SearpcError: + org_id = -1 + return org_id + diff --git a/utils.py b/utils.py index 0e9e3b276c..30b6841128 100644 --- a/utils.py +++ b/utils.py @@ -14,7 +14,9 @@ from django.core.files.uploadhandler import FileUploadHandler, StopFutureHandler from django.core.cache import cache from seaserv import seafserv_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, \ - get_repo, get_commits, get_group_repoids, CCNET_SERVER_ADDR, CCNET_SERVER_PORT + get_repo, get_commits, get_group_repoids, CCNET_SERVER_ADDR, \ + CCNET_SERVER_PORT, get_org_id_by_repo_id, get_org_by_id, \ + get_org_id_by_group try: from settings import CROCODOC_API_TOKEN except ImportError: @@ -47,23 +49,37 @@ def gen_fileext_type_map(): return d FILEEXT_TYPE_MAP = gen_fileext_type_map() -def render_permission_error(request, msg=None): +def render_permission_error(request, msg=None, extra_ctx=None): """ Return permisson error page. """ - return render_to_response('permission_error.html', { - 'error_msg': msg or u'权限错误', - }, context_instance=RequestContext(request)) + ctx = {} + ctx['error_msg'] = msg or u'权限错误' + ctx['base_template'] = 'myhome_base.html' -def render_error(request, msg=None): + if extra_ctx: + for k in extra_ctx: + ctx[k] = extra_ctx[k] + + return render_to_response('permission_error.html', ctx, + context_instance=RequestContext(request)) + +def render_error(request, msg=None, extra_ctx=None): """ Return normal error page. """ - return render_to_response('error.html', { - 'error_msg': msg or u'内部错误', - }, context_instance=RequestContext(request)) + ctx = {} + ctx['error_msg'] = msg or u'内部错误' + ctx['base_template'] = 'myhome_base.html' + + if extra_ctx: + for k in extra_ctx: + ctx[k] = extra_ctx[k] + + return render_to_response('error.html', ctx, + context_instance=RequestContext(request)) def list_to_string(l): """ @@ -232,7 +248,7 @@ def get_accessible_repos(request, repo): groups_repos = [] groups = ccnet_threaded_rpc.get_groups(email) for group in groups: - group_repo_ids = get_group_repoids(group_id=group.id) + group_repo_ids = get_group_repoids(group.id) for repo_id in group_repo_ids: if not repo_id: continue @@ -318,13 +334,44 @@ def string2list(string): s.add(e) return [ x for x in s ] -def get_cur_ctx(request): - ctx_dict = request.session.get('current_context', { - 'base_template': 'myhome_base.html', - 'org_dict': None}) - return ctx_dict +# def get_cur_ctx(request): +# ctx_dict = request.session.get('current_context', { +# 'base_template': 'myhome_base.html', +# 'org_dict': None}) +# return ctx_dict -def set_cur_ctx(request, ctx_dict): - request.session['current_context'] = ctx_dict - request.user.org = ctx_dict.get('org_dict', None) +# def set_cur_ctx(request, ctx_dict): +# request.session['current_context'] = ctx_dict +# request.user.org = ctx_dict.get('org_dict', None) +def check_and_get_org_by_repo(repo_id): + """ + Check whether repo is org repo, get org info if it is, and set + base template. + """ + org_id = get_org_id_by_repo_id(repo_id) + if org_id > 0: + # this repo is org repo, get org info + org = get_org_by_id(org_id) + base_template = 'org_base.html' + else: + org = None + base_template = 'myhome_base.html' + + return org, base_template + +def check_and_get_org_by_group(group_id): + """ + Check whether repo is org repo, get org info if it is, and set + base template. + """ + org_id = get_org_id_by_group(group_id) + if org_id > 0: + # this repo is org repo, get org info + org = get_org_by_id(org_id) + base_template = 'org_base.html' + else: + org = None + base_template = 'myhome_base.html' + + return org, base_template diff --git a/views.py b/views.py index d95e9113e7..d39c837c25 100644 --- a/views.py +++ b/views.py @@ -31,7 +31,7 @@ from share.models import FileShare from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, get_emailusers, \ get_repo, get_commits, get_branches, is_valid_filename, remove_group_user,\ seafserv_threaded_rpc, seafserv_rpc, get_binding_peerids, is_inner_pub_repo, \ - get_group_repoids, check_group_staff, get_personal_groups, is_repo_owner, \ + check_group_staff, get_personal_groups, is_repo_owner, \ get_group, get_shared_groups_by_repo, is_group_user, check_permission from pysearpc import SearpcError @@ -51,8 +51,8 @@ from utils import render_permission_error, render_error, list_to_string, \ calculate_repo_last_modify, valid_previewed_file, \ check_filename_with_rename, get_accessible_repos, EMPTY_SHA1, \ get_file_revision_id_size, get_ccnet_server_addr_port, \ - gen_file_get_url, string2list, set_cur_ctx, MAX_INT, \ - gen_file_upload_url + gen_file_get_url, string2list, MAX_INT, \ + gen_file_upload_url, check_and_get_org_by_repo from seahub.profile.models import Profile try: from settings import CROCODOC_API_TOKEN @@ -133,6 +133,9 @@ def render_repo(request, repo_id, error=''): if not repo: return render_error(request, u'该同步目录不存在') + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_repo(repo_id) + # query whether set password if repo is encrypted password_set = False if repo.props.encrypted: @@ -221,11 +224,17 @@ def render_repo(request, repo_id, error=''): "accessible_repos": accessible_repos, "applet_root": get_ccnetapplet_root(), "groups": groups, + "org": org, + "base_template": base_template, }, context_instance=RequestContext(request)) @login_required def repo_upload_file(request, repo_id): repo = get_repo(repo_id) + + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_repo(repo_id) + if request.method == 'GET': parent_dir = request.GET.get('p', '/') zipped = gen_path_link (parent_dir, repo.name) @@ -254,11 +263,17 @@ def repo_upload_file(request, repo_id): "zipped": zipped, "max_upload_file_size": settings.MAX_UPLOAD_FILE_SIZE, "no_quota": no_quota, + "base_template": base_template, + "org": org, }, context_instance=RequestContext(request)) @login_required def repo_update_file(request, repo_id): repo = get_repo(repo_id) + + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_repo(repo_id) + if request.method == 'GET': target_file = request.GET.get('p') if not target_file: @@ -289,6 +304,8 @@ def repo_update_file(request, repo_id): "zipped": zipped, "max_upload_file_size": settings.MAX_UPLOAD_FILE_SIZE, "no_quota": no_quota, + "org": org, + "base_template": base_template, }, context_instance=RequestContext(request)) def upload_error_msg (code): @@ -308,6 +325,9 @@ def upload_error_msg (code): return err_msg def upload_file_error(request, repo_id): + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_repo(repo_id) + if request.method == 'GET': repo = get_repo(repo_id) parent_dir = request.GET.get('p') @@ -325,10 +345,15 @@ def upload_file_error(request, repo_id): 'repo': repo, 'zipped': zipped, 'filename': filename, - 'err_msg': err_msg + 'err_msg': err_msg, + 'org': org, + 'base_template': base_template, }, context_instance=RequestContext(request)) def update_file_error(request, repo_id): + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_repo(repo_id) + if request.method == 'GET': repo = get_repo(repo_id) target_file = request.GET.get('p') @@ -344,7 +369,9 @@ def update_file_error(request, repo_id): return render_to_response('upload_file_error.html', { 'repo': repo, 'zipped': zipped, - 'err_msg': err_msg + 'err_msg': err_msg, + 'org': org, + 'base_template': base_template, }, context_instance=RequestContext(request)) def get_subdir(request): @@ -418,13 +445,16 @@ def repo(request, repo_id): @login_required def repo_history(request, repo_id): """ - View repo history + View repo history. """ if not access_to_repo(request, repo_id, ''): return render_permission_error(request, u'无法浏览该同步目录修改历史') - + repo = get_repo(repo_id) + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_repo(repo_id) + password_set = False if repo.props.encrypted: try: @@ -467,6 +497,8 @@ def repo_history(request, repo_id): 'per_page': per_page, 'page_next': page_next, 'is_owner': is_owner, + 'org': org, + 'base_template': base_template, }, context_instance=RequestContext(request)) @login_required @@ -582,6 +614,12 @@ def modify_token(request, repo_id): @login_required def remove_repo(request, repo_id): + # FIXME: no org in request.user, check whether repo is org repo, and then + # check permission + + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_repo(repo_id) + if not validate_owner(request, repo_id) and not request.user.is_staff \ and not request.user.org['is_staff']: err_msg = u'删除同步目录失败, 只有管理员或目录创建者有权删除目录。' @@ -620,7 +658,10 @@ def myhome(request): notes = UserNotification.objects.filter(to_user=request.user.username) for n in notes: if n.msg_type == 'group_msg': - grpmsg_list.append(get_group(n.detail)) + grp = get_group(n.detail) + if not grp: + continue + grpmsg_list.append(grp) elif n.msg_type == 'grpmsg_reply': grpmsg_reply_list.append(n.detail) elif n.msg_type == 'org_msg': @@ -636,9 +677,9 @@ def myhome(request): profile = Profile.objects.filter(user=request.user.username)[0] nickname = profile.nickname - ctx_dict = {'base_template': 'myhome_base.html', - 'org_dict': None} - set_cur_ctx(request, ctx_dict) + # ctx_dict = {'base_template': 'myhome_base.html', + # 'org_dict': None} + # set_cur_ctx(request, ctx_dict) return render_to_response('myhome.html', { "myname": email, @@ -749,6 +790,9 @@ def repo_view_file(request, repo_id): """ Preview file on web, including files in current worktree and history. """ + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_repo(repo_id) + if request.method == 'POST': # handle post request to leave comment on file path = request.GET.get('p', '/') @@ -907,6 +951,8 @@ def repo_view_file(request, repo_id): 'next_page': current_page+1, 'per_page': per_page, 'page_next': page_next, + 'org': org, + 'base_template': base_template, }, context_instance=RequestContext(request)) def repo_file_get(raw_path): @@ -1019,10 +1065,12 @@ def update_file_after_edit(request, repo_id): @login_required def repo_file_edit(request, repo_id): - if request.method == 'POST': return update_file_after_edit(request, repo_id) + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_repo(repo_id) + path = request.GET.get('p', '/') if path[-1] == '/': path = path[:-1] @@ -1066,7 +1114,9 @@ def repo_file_edit(request, repo_id): 'err':err, 'file_content':file_content, 'encoding': encoding, - 'newline_mode': newline_mode + 'newline_mode': newline_mode, + 'org': org, + 'base_template': base_template, }, context_instance=RequestContext(request)) @@ -1742,6 +1792,9 @@ def render_file_revisions (request, repo_id): zipped = gen_path_link(path, repo.name) + # change navigator when user in diffent context + org, base_template = check_and_get_org_by_repo(repo_id) + return render_to_response('file_revisions.html', { 'repo': repo, 'path': path, @@ -1749,6 +1802,8 @@ def render_file_revisions (request, repo_id): 'zipped': zipped, 'commits': commits, 'is_owner': is_owner, + 'org': org, + 'base_template': base_template, }, context_instance=RequestContext(request)) @login_required