2012-07-26 09:08:31 +00:00
|
|
|
# encoding: utf-8
|
2012-07-30 02:25:46 +00:00
|
|
|
import simplejson as json
|
2012-07-26 09:08:31 +00:00
|
|
|
import sys
|
|
|
|
from django.core.urlresolvers import reverse
|
2012-07-27 03:39:55 +00:00
|
|
|
from django.contrib import messages
|
|
|
|
from django.core.mail import send_mail
|
|
|
|
from django.contrib.sites.models import Site, RequestSite
|
2012-07-30 02:25:46 +00:00
|
|
|
from django.http import HttpResponse, HttpResponseBadRequest, Http404, \
|
|
|
|
HttpResponseRedirect
|
2012-07-26 09:08:31 +00:00
|
|
|
from django.shortcuts import render_to_response
|
2012-07-27 03:39:55 +00:00
|
|
|
from django.template import Context, loader, RequestContext
|
2012-07-26 09:08:31 +00:00
|
|
|
|
|
|
|
from auth.decorators import login_required
|
|
|
|
from pysearpc import SearpcError
|
|
|
|
from seaserv import ccnet_threaded_rpc, get_orgs_by_user, get_org_repos, \
|
2012-07-27 03:39:55 +00:00
|
|
|
get_org_by_url_prefix, create_org, get_user_current_org, add_org_user, \
|
2012-07-30 02:25:46 +00:00
|
|
|
get_ccnetuser, remove_org_user, get_org_groups, is_valid_filename, \
|
|
|
|
create_org_repo
|
2012-07-26 09:08:31 +00:00
|
|
|
|
2012-08-03 08:37:36 +00:00
|
|
|
from decorators import org_staff_required
|
2012-07-26 09:08:31 +00:00
|
|
|
from forms import OrgCreateForm
|
2012-07-27 09:54:07 +00:00
|
|
|
from signals import org_user_added
|
|
|
|
from notifications.models import UserNotification
|
2012-07-27 03:39:55 +00:00
|
|
|
from registration.models import RegistrationProfile
|
2012-08-03 09:04:15 +00:00
|
|
|
from seahub.contacts import Contact
|
2012-07-30 02:25:46 +00:00
|
|
|
from seahub.forms import RepoCreateForm
|
2012-07-27 03:39:55 +00:00
|
|
|
import seahub.settings as seahub_settings
|
2012-08-02 09:50:16 +00:00
|
|
|
from seahub.utils import render_error, render_permission_error, gen_token, \
|
|
|
|
validate_group_name, emails2list, set_cur_ctx, calculate_repo_last_modify
|
2012-07-26 09:08:31 +00:00
|
|
|
from seahub.views import myhome
|
2012-07-27 03:39:55 +00:00
|
|
|
|
2012-07-26 09:08:31 +00:00
|
|
|
@login_required
|
|
|
|
def create_org(request):
|
|
|
|
"""
|
2012-07-28 08:41:24 +00:00
|
|
|
Create org account.
|
2012-07-26 09:08:31 +00:00
|
|
|
"""
|
|
|
|
if request.method == 'POST':
|
|
|
|
form = OrgCreateForm(request.POST)
|
|
|
|
if form.is_valid():
|
|
|
|
org_name = form.cleaned_data['org_name']
|
|
|
|
url_prefix = form.cleaned_data['url_prefix']
|
|
|
|
username = request.user.username
|
|
|
|
|
|
|
|
try:
|
|
|
|
# create_org(org_name, url_prefix, username)
|
|
|
|
ccnet_threaded_rpc.create_org(org_name, url_prefix, username)
|
|
|
|
return HttpResponseRedirect(\
|
|
|
|
reverse(org_info, args=[url_prefix]))
|
|
|
|
except SearpcError, e:
|
2012-07-30 12:44:32 +00:00
|
|
|
return render_error(request, e.msg)
|
2012-07-26 09:08:31 +00:00
|
|
|
|
|
|
|
else:
|
|
|
|
form = OrgCreateForm()
|
|
|
|
|
|
|
|
return render_to_response('organizations/create_org.html', {
|
|
|
|
'form': form,
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def org_info(request, url_prefix):
|
|
|
|
"""
|
2012-07-28 08:41:24 +00:00
|
|
|
Show org info page.
|
2012-07-26 09:08:31 +00:00
|
|
|
"""
|
|
|
|
org = get_user_current_org(request.user.username, url_prefix)
|
|
|
|
if not org:
|
|
|
|
return HttpResponseRedirect(reverse(myhome))
|
|
|
|
|
2012-08-02 09:50:16 +00:00
|
|
|
ctx_dict = {'base_template': 'org_base.html',
|
|
|
|
'org_dict': org._dict}
|
|
|
|
set_cur_ctx(request, ctx_dict)
|
2012-07-26 09:08:31 +00:00
|
|
|
|
|
|
|
org_members = ccnet_threaded_rpc.get_org_emailusers(url_prefix,
|
|
|
|
0, sys.maxint)
|
|
|
|
repos = get_org_repos(org.org_id, 0, sys.maxint)
|
2012-08-02 09:50:16 +00:00
|
|
|
calculate_repo_last_modify(repos)
|
|
|
|
repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
|
2012-07-28 08:41:24 +00:00
|
|
|
|
|
|
|
url = 'organizations/%s/repo/create/' % org.url_prefix
|
2012-07-26 09:08:31 +00:00
|
|
|
return render_to_response('organizations/org_info.html', {
|
|
|
|
'org': org,
|
|
|
|
'org_users': org_members,
|
|
|
|
'repos': repos,
|
2012-07-28 08:41:24 +00:00
|
|
|
'url': seahub_settings.SITE_ROOT + url,
|
2012-07-26 09:08:31 +00:00
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def org_groups(request, url_prefix):
|
|
|
|
"""
|
2012-07-28 08:41:24 +00:00
|
|
|
List org groups and add org group.
|
2012-07-26 09:08:31 +00:00
|
|
|
"""
|
|
|
|
org = get_user_current_org(request.user.username, url_prefix)
|
|
|
|
if not org:
|
|
|
|
return HttpResponseRedirect(reverse(myhome))
|
|
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
group_name = request.POST.get('group_name')
|
|
|
|
if not validate_group_name(group_name):
|
2012-07-30 12:44:32 +00:00
|
|
|
return render_error(request, u'小组名称只能包含中英文字符,数字及下划线')
|
2012-07-26 09:08:31 +00:00
|
|
|
|
|
|
|
try:
|
|
|
|
group_id = ccnet_threaded_rpc.create_group(group_name.encode('utf-8'),
|
|
|
|
request.user.username)
|
|
|
|
ccnet_threaded_rpc.add_org_group(org.org_id, group_id)
|
|
|
|
except SearpcError, e:
|
|
|
|
error_msg = e.msg
|
2012-07-30 12:44:32 +00:00
|
|
|
return render_error(request, error_msg)
|
2012-07-26 09:08:31 +00:00
|
|
|
|
2012-07-27 03:39:55 +00:00
|
|
|
groups = get_org_groups(org.org_id, 0, sys.maxint)
|
2012-07-26 09:08:31 +00:00
|
|
|
return render_to_response('organizations/org_groups.html', {
|
|
|
|
'org': org,
|
|
|
|
'groups': groups,
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
|
2012-07-27 03:39:55 +00:00
|
|
|
def send_org_user_add_mail(request, email, password, org_name):
|
|
|
|
"""
|
|
|
|
Send email when add new user.
|
|
|
|
"""
|
|
|
|
use_https = request.is_secure()
|
|
|
|
domain = RequestSite(request).domain
|
|
|
|
|
|
|
|
t = loader.get_template('organizations/org_user_add_email.html')
|
|
|
|
c = {
|
|
|
|
'user': request.user.username,
|
|
|
|
'org_name': org_name,
|
|
|
|
'email': email,
|
|
|
|
'password': password,
|
|
|
|
'domain': domain,
|
|
|
|
'protocol': use_https and 'https' or 'http',
|
|
|
|
}
|
|
|
|
|
|
|
|
try:
|
|
|
|
send_mail(u'SeaCloud注册信息', t.render(Context(c)),
|
|
|
|
None, [email], fail_silently=False)
|
|
|
|
messages.add_message(request, messages.INFO, email)
|
|
|
|
except:
|
|
|
|
messages.add_message(request, messages.ERROR, email)
|
|
|
|
|
|
|
|
@login_required
|
2012-08-03 08:37:36 +00:00
|
|
|
@org_staff_required
|
2012-07-27 03:39:55 +00:00
|
|
|
def org_useradmin(request, url_prefix):
|
|
|
|
"""
|
|
|
|
List and add org users.
|
|
|
|
"""
|
2012-08-03 08:37:36 +00:00
|
|
|
org = get_user_current_org(request.user.username, url_prefix)
|
|
|
|
if not org:
|
|
|
|
return HttpResponseRedirect(reverse(myhome))
|
2012-07-27 03:39:55 +00:00
|
|
|
|
2012-08-02 09:50:16 +00:00
|
|
|
ctx_dict = {'base_template': 'org_admin_base.html',
|
|
|
|
'org_dict': request.user.org}
|
|
|
|
set_cur_ctx(request, ctx_dict)
|
|
|
|
|
2012-07-27 03:39:55 +00:00
|
|
|
if request.method == 'POST':
|
2012-07-27 09:54:07 +00:00
|
|
|
emails = request.POST.get('added-member-name')
|
2012-07-27 03:39:55 +00:00
|
|
|
|
|
|
|
email_list = emails2list(emails)
|
|
|
|
for email in email_list:
|
|
|
|
if not email or email.find('@') <= 0 :
|
|
|
|
continue
|
|
|
|
|
|
|
|
org_id = request.user.org['org_id']
|
|
|
|
if get_ccnetuser(username=email):
|
|
|
|
email = email.strip(' ')
|
|
|
|
org_id = request.user.org['org_id']
|
|
|
|
add_org_user(org_id, email, 0)
|
2012-07-27 09:54:07 +00:00
|
|
|
|
|
|
|
# send signal
|
|
|
|
org_user_added.send(sender=None, org_id=org_id,
|
|
|
|
from_email=request.user.username,
|
|
|
|
to_email=email)
|
2012-07-27 03:39:55 +00:00
|
|
|
else:
|
|
|
|
# User is not registered, just create account and
|
|
|
|
# add that account to org
|
|
|
|
password = gen_token(max_length=6)
|
|
|
|
if Site._meta.installed:
|
|
|
|
site = Site.objects.get_current()
|
|
|
|
else:
|
|
|
|
site = RequestSite(request)
|
|
|
|
RegistrationProfile.objects.create_active_user(\
|
|
|
|
email, email, password, site, send_email=False)
|
|
|
|
add_org_user(org_id, email, 0)
|
|
|
|
if hasattr(seahub_settings, 'EMAIL_HOST'):
|
|
|
|
org_name = request.user.org['org_name']
|
|
|
|
send_org_user_add_mail(request, email, password, org_name)
|
|
|
|
|
|
|
|
# Make sure page request is an int. If not, deliver first page.
|
|
|
|
try:
|
|
|
|
current_page = int(request.GET.get('page', '1'))
|
|
|
|
per_page= int(request.GET.get('per_page', '25'))
|
|
|
|
except ValueError:
|
|
|
|
current_page = 1
|
|
|
|
per_page = 25
|
|
|
|
|
|
|
|
url_prefix = request.user.org['url_prefix']
|
|
|
|
users_plus_one = ccnet_threaded_rpc.get_org_emailusers(\
|
|
|
|
url_prefix, per_page * (current_page - 1), per_page + 1)
|
|
|
|
if len(users_plus_one) == per_page + 1:
|
|
|
|
page_next = True
|
|
|
|
else:
|
|
|
|
page_next = False
|
|
|
|
|
|
|
|
users = users_plus_one[:per_page]
|
|
|
|
for user in users:
|
|
|
|
if user.props.id == request.user.id:
|
|
|
|
user.is_self = True
|
2012-08-03 09:04:15 +00:00
|
|
|
|
|
|
|
# My contacts
|
|
|
|
contacts = Contact.objects.filter(user_email=request.user.username)
|
2012-07-27 03:39:55 +00:00
|
|
|
|
|
|
|
return render_to_response(
|
|
|
|
'organizations/org_useradmin.html', {
|
|
|
|
'users': users,
|
2012-08-03 09:04:15 +00:00
|
|
|
'contacts': contacts,
|
2012-07-27 03:39:55 +00:00
|
|
|
'current_page': current_page,
|
|
|
|
'prev_page': current_page-1,
|
|
|
|
'next_page': current_page+1,
|
|
|
|
'per_page': per_page,
|
|
|
|
'page_next': page_next,
|
|
|
|
},
|
|
|
|
context_instance=RequestContext(request))
|
|
|
|
|
|
|
|
@login_required
|
2012-08-03 08:37:36 +00:00
|
|
|
@org_staff_required
|
|
|
|
def org_user_remove(request, url_prefix, user):
|
2012-07-27 03:39:55 +00:00
|
|
|
"""
|
2012-08-03 08:37:36 +00:00
|
|
|
Remove org user.
|
2012-07-27 03:39:55 +00:00
|
|
|
"""
|
|
|
|
org_id = request.user.org['org_id']
|
|
|
|
url_prefix = request.user.org['url_prefix']
|
|
|
|
remove_org_user(org_id, user)
|
|
|
|
|
|
|
|
return HttpResponseRedirect(reverse('org_useradmin', args=[url_prefix]))
|
2012-07-27 09:54:07 +00:00
|
|
|
|
|
|
|
def org_msg(request):
|
|
|
|
"""
|
2012-08-03 08:37:36 +00:00
|
|
|
Show organization user added messages.
|
2012-07-27 09:54:07 +00:00
|
|
|
"""
|
|
|
|
orgmsg_list = []
|
|
|
|
notes = UserNotification.objects.filter(to_user=request.user.username)
|
|
|
|
for n in notes:
|
|
|
|
if n.msg_type == 'org_msg':
|
|
|
|
orgmsg_list.append(n.detail)
|
|
|
|
|
|
|
|
# remove new org msg notification
|
|
|
|
UserNotification.objects.filter(to_user=request.user.username,
|
|
|
|
msg_type='org_msg').delete()
|
2012-07-28 08:41:24 +00:00
|
|
|
|
2012-07-27 09:54:07 +00:00
|
|
|
return render_to_response('organizations/new_msg.html', {
|
|
|
|
'orgmsg_list': orgmsg_list,
|
|
|
|
}, context_instance=RequestContext(request))
|
2012-07-28 08:41:24 +00:00
|
|
|
|
|
|
|
@login_required
|
2012-07-30 02:25:46 +00:00
|
|
|
def org_repo_create(request, url_prefix):
|
2012-07-28 08:41:24 +00:00
|
|
|
'''
|
|
|
|
Handle ajax post to create org repo.
|
2012-07-27 09:54:07 +00:00
|
|
|
|
2012-07-28 08:41:24 +00:00
|
|
|
'''
|
2012-07-30 02:25:46 +00:00
|
|
|
if not request.is_ajax() or request.method != 'POST':
|
2012-07-28 08:41:24 +00:00
|
|
|
return Http404
|
|
|
|
|
|
|
|
result = {}
|
|
|
|
content_type = 'application/json; charset=utf-8'
|
2012-07-30 02:25:46 +00:00
|
|
|
|
|
|
|
form = RepoCreateForm(request.POST)
|
|
|
|
if form.is_valid():
|
|
|
|
repo_name = form.cleaned_data['repo_name']
|
|
|
|
repo_desc = form.cleaned_data['repo_desc']
|
|
|
|
encrypted = form.cleaned_data['encryption']
|
|
|
|
passwd = form.cleaned_data['passwd']
|
|
|
|
passwd_again = form.cleaned_data['passwd_again']
|
|
|
|
|
2012-07-28 08:41:24 +00:00
|
|
|
user = request.user.username
|
|
|
|
org_id = request.user.org['org_id']
|
2012-07-30 02:25:46 +00:00
|
|
|
|
2012-07-28 08:41:24 +00:00
|
|
|
repo_id = create_org_repo(repo_name, repo_desc, user, passwd, org_id)
|
|
|
|
if not repo_id:
|
|
|
|
result['error'] = u"创建目录失败"
|
2012-07-30 02:25:46 +00:00
|
|
|
else:
|
|
|
|
result['success'] = True
|
|
|
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
|
|
|
else:
|
|
|
|
return HttpResponseBadRequest(json.dumps(form.errors),
|
|
|
|
content_type=content_type)
|
2012-08-02 11:43:20 +00:00
|
|
|
|
|
|
|
@login_required
|
2012-08-03 08:37:36 +00:00
|
|
|
@org_staff_required
|
2012-08-02 11:43:20 +00:00
|
|
|
def org_seafadmin(request, url_prefix):
|
|
|
|
# Make sure page request is an int. If not, deliver first page.
|
|
|
|
try:
|
|
|
|
current_page = int(request.GET.get('page', '1'))
|
|
|
|
per_page= int(request.GET.get('per_page', '25'))
|
|
|
|
except ValueError:
|
|
|
|
current_page = 1
|
|
|
|
per_page = 25
|
|
|
|
|
|
|
|
repos_all = get_org_repos(request.user.org['org_id'],
|
|
|
|
per_page * (current_page -1),
|
|
|
|
per_page + 1)
|
|
|
|
|
|
|
|
repos = repos_all[:per_page]
|
|
|
|
|
|
|
|
if len(repos_all) == per_page + 1:
|
|
|
|
page_next = True
|
|
|
|
else:
|
|
|
|
page_next = False
|
|
|
|
|
|
|
|
return render_to_response(
|
|
|
|
'organizations/org_seafadmin.html', {
|
|
|
|
'repos': repos,
|
|
|
|
'current_page': current_page,
|
|
|
|
'prev_page': current_page-1,
|
|
|
|
'next_page': current_page+1,
|
|
|
|
'per_page': per_page,
|
|
|
|
'page_next': page_next,
|
|
|
|
},
|
|
|
|
context_instance=RequestContext(request))
|
|
|
|
|
2012-08-03 08:37:36 +00:00
|
|
|
@login_required
|
|
|
|
@org_staff_required
|
|
|
|
def org_group_admin(request, url_prefix):
|
2012-08-02 11:43:20 +00:00
|
|
|
# Make sure page request is an int. If not, deliver first page.
|
|
|
|
try:
|
|
|
|
current_page = int(request.GET.get('page', '1'))
|
|
|
|
per_page= int(request.GET.get('per_page', '25'))
|
|
|
|
except ValueError:
|
|
|
|
current_page = 1
|
|
|
|
per_page = 25
|
|
|
|
|
|
|
|
groups_plus_one = get_org_groups (request.user.org['org_id'],
|
|
|
|
per_page * (current_page -1),
|
|
|
|
per_page +1)
|
|
|
|
|
|
|
|
groups = groups_plus_one[:per_page]
|
|
|
|
|
|
|
|
if len(groups_plus_one) == per_page + 1:
|
|
|
|
page_next = True
|
|
|
|
else:
|
|
|
|
page_next = False
|
|
|
|
|
|
|
|
return render_to_response('organizations/org_group_admin.html', {
|
|
|
|
'groups': groups,
|
|
|
|
'current_page': current_page,
|
|
|
|
'prev_page': current_page-1,
|
|
|
|
'next_page': current_page+1,
|
|
|
|
'per_page': per_page,
|
|
|
|
'page_next': page_next,
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
|