mirror of
https://github.com/haiwen/seahub.git
synced 2025-10-22 03:16:34 +00:00
Remove session storage in context switch
This commit is contained in:
@@ -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, \
|
||||
|
@@ -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
|
||||
|
@@ -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))
|
||||
|
@@ -1,4 +1,5 @@
|
||||
{% extends base_template %}
|
||||
|
||||
{% load seahub_tags avatar_tags %}
|
||||
{% load url from future %}
|
||||
|
||||
@@ -69,11 +70,11 @@
|
||||
{% else %}
|
||||
<td>—— ——</td>
|
||||
{% endif %}
|
||||
<td>{{ repo.share_from|email2nickname }}</td>
|
||||
<td>{{ repo.owner|email2nickname }}</td>
|
||||
<td>
|
||||
<img src="{{ MEDIA_URL }}img/sync-20.png" class="download vh" data="{{ SITE_ROOT }}seafile_access_check/?repo_id={{ repo.props.id }}" alt="同步" title="同步到本地" />
|
||||
{% if is_staff or repo.share_from_me %}
|
||||
<img src="{{ MEDIA_URL }}img/delete-20.png" class="cancel-share vh" data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.props.id }}&from={{ repo.share_from }}&gid={{ group.id }}" title="取消共享" alt="取消共享" />
|
||||
<img src="{{ MEDIA_URL }}img/delete-20.png" class="cancel-share vh" data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.props.id }}&from={{ repo.owner }}&gid={{ group.id }}" title="取消共享" alt="取消共享" />
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
|
@@ -1,4 +1,4 @@
|
||||
{% extends base_template %}
|
||||
{% extends "myhome_base.html" %}
|
||||
{% load seahub_tags avatar_tags %}
|
||||
{% load url from future %}
|
||||
|
||||
|
@@ -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
|
||||
@@ -448,10 +443,15 @@ 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
|
||||
@@ -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,8 +631,39 @@ def create_group_repo(request, group_id):
|
||||
encrypted = form.cleaned_data['encryption']
|
||||
passwd = form.cleaned_data['passwd']
|
||||
user = request.user.username
|
||||
|
||||
org, base_template = check_and_get_org_by_group(group_id)
|
||||
if org:
|
||||
# create group repo in org context
|
||||
try:
|
||||
repo_id = seafserv_threaded_rpc.create_repo(repo_name, repo_desc,
|
||||
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
|
||||
if status != 0:
|
||||
seafserv_threaded_rpc.remove_repo(repo_id)
|
||||
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
|
||||
@@ -640,16 +671,16 @@ def create_group_repo(request, group_id):
|
||||
return json_error(u"创建目录失败")
|
||||
|
||||
try:
|
||||
status = seafserv_threaded_rpc.group_share_repo(repo_id, group_id, user, 'rw')
|
||||
status = seafserv_threaded_rpc.group_share_repo(repo_id,
|
||||
group_id,
|
||||
user, 'rw')
|
||||
except SearpcError, e:
|
||||
# if share failed, remove the newly created repo
|
||||
seafserv_threaded_rpc.remove_repo(repo_id)
|
||||
status = -1
|
||||
|
||||
return json_error(u'共享失败:内部错误')
|
||||
else:
|
||||
# if share failed, remove the newly created repo
|
||||
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),
|
||||
|
@@ -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}
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
{% extends base_template %}
|
||||
{% extends "myhome_base.html" %}
|
||||
{% block main_panel %}
|
||||
<div class="narrow-panel">
|
||||
<h2>创建团体</h2>
|
||||
|
@@ -57,7 +57,7 @@
|
||||
{% endif %}
|
||||
<td>
|
||||
<img src="{{ MEDIA_URL }}img/sync-20.png" data="{{ repo.props.id }}" class="download-btn vh" title="同步到本地" alt="同步" />
|
||||
<img src="{{ MEDIA_URL }}img/share-20.png" data="{{ repo.props.id }}" class="repo-share-btn vh" title="共享" alt="共享" />
|
||||
<!-- <img src="{{ MEDIA_URL }}img/share-20.png" data="{{ repo.props.id }}" class="repo-share-btn vh" title="共享" alt="共享" /> -->
|
||||
<img src="{{ MEDIA_URL }}img/delete-20.png" data="{{ SITE_ROOT }}repo/remove/{{ repo.props.id }}/?next={{ request.path }}" class="repo-delete-btn vh" title="删除" alt="删除" />
|
||||
</td>
|
||||
</tr>
|
||||
|
@@ -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:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
{% extends base_template %}
|
||||
{% extends "myhome_base.html" %}
|
||||
|
||||
{% block title %}帐号设置{% endblock %}
|
||||
|
||||
|
@@ -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',
|
||||
)
|
||||
|
||||
|
||||
|
@@ -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 @@
|
||||
<li>
|
||||
小组
|
||||
{% for grp in grpmsg_list %}
|
||||
<a href="{% url group_info grp.id %}" class="no-bold">{{ grp.group_name }}</a>
|
||||
<a href="{% url 'group_info' grp.id %}" class="no-bold">{{ grp.group_name }}</a>
|
||||
{% endfor %}
|
||||
有新留言
|
||||
</li>
|
||||
@@ -30,7 +31,7 @@
|
||||
<li><a href="{{ SITE_ROOT }}group/reply/new/" class="no-bold">{{ grpmsg_reply_list|length }}条留言有新回复</a></li>
|
||||
{% endif %}
|
||||
{% if orgmsg_list %}
|
||||
<li><a href="{% url org_msg %}" class="no-bold">{{ orgmsg_list|length }}条团体消息</a></li>
|
||||
<li><a href="{% url 'org_msg' %}" class="no-bold">{{ orgmsg_list|length }}条团体消息</a></li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
@@ -10,11 +10,6 @@
|
||||
<a href="{% url public_home %}" {% block nav_publichome_class %}{% endblock %}>公共页面</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if request.user.org %}
|
||||
<li>
|
||||
<a href="{{ SITE_ROOT }}org/" {% block nav_org_class %}{% endblock %}>企业</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li>
|
||||
<a href="{{ SITE_ROOT }}groups/" {% block nav_group_class %}{% endblock %}>小组</a>
|
||||
</li>
|
||||
|
@@ -44,11 +44,11 @@
|
||||
<tr>
|
||||
<td><a href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/">{{ repo.props.name }}</a></td>
|
||||
<td>{{ repo.props.desc }}</td>
|
||||
<td>{{ repo.share_from }}</td>
|
||||
<td>{{ repo.owner }}</td>
|
||||
<td>
|
||||
<img src="{{ MEDIA_URL }}img/download-20.png" class="download vh" data="{{ SITE_ROOT }}seafile_access_check/?repo_id={{ repo.props.id }}" alt="下载" title="下载" />
|
||||
{% if is_staff or repo.share_from_me %}
|
||||
<img src="{{ MEDIA_URL }}img/delete-20.png" class="cancel-share vh" data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.props.id }}&from={{ repo.share_from }}&gid={{ group.id }}" title="取消共享" alt="取消共享" />
|
||||
<img src="{{ MEDIA_URL }}img/delete-20.png" class="cancel-share vh" data="{{ SITE_ROOT }}shareadmin/removeshare/?repo_id={{ repo.props.id }}&from={{ repo.owner }}&gid={{ group.id }}" title="取消共享" alt="取消共享" />
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
|
@@ -1,4 +1,4 @@
|
||||
{% extends "myhome_base.html" %}
|
||||
{% extends base_template %}
|
||||
{% load seahub_tags %}
|
||||
|
||||
{% block main_panel %}
|
||||
|
@@ -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, \
|
||||
|
@@ -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
|
||||
|
||||
|
83
utils.py
83
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
|
||||
|
79
views.py
79
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
|
||||
|
Reference in New Issue
Block a user