2012-07-26 09:08:31 +00:00
|
|
|
|
# encoding: utf-8
|
2012-09-03 04:03:06 +00:00
|
|
|
|
import os
|
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-09-07 08:14:36 +00:00
|
|
|
|
from django.utils.translation import ugettext as _
|
2012-07-26 09:08:31 +00:00
|
|
|
|
|
|
|
|
|
from auth.decorators import login_required
|
|
|
|
|
from pysearpc import SearpcError
|
2012-12-18 11:52:41 +00:00
|
|
|
|
from seaserv import ccnet_threaded_rpc, seafserv_rpc, seafserv_threaded_rpc,\
|
2012-08-29 05:40:47 +00:00
|
|
|
|
get_orgs_by_user, get_org_repos, list_org_inner_pub_repos, \
|
2012-07-27 03:39:55 +00:00
|
|
|
|
get_org_by_url_prefix, create_org, get_user_current_org, add_org_user, \
|
2012-09-01 09:46:46 +00:00
|
|
|
|
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, \
|
2012-12-18 11:52:41 +00:00
|
|
|
|
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
|
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
|
2012-09-01 09:46:46 +00:00
|
|
|
|
from utils import validate_org_repo_owner
|
2012-07-27 09:54:07 +00:00
|
|
|
|
from notifications.models import UserNotification
|
2012-10-13 09:40:06 +00:00
|
|
|
|
from profile.models import Profile
|
2012-09-03 04:03:06 +00:00
|
|
|
|
from share.models import FileShare
|
2012-09-01 09:46:46 +00:00
|
|
|
|
from share.forms import RepoShareForm
|
2012-07-27 03:39:55 +00:00
|
|
|
|
from registration.models import RegistrationProfile
|
2012-09-26 11:48:55 +00:00
|
|
|
|
from base.accounts import User
|
|
|
|
|
from contacts import Contact
|
2012-09-26 02:49:00 +00:00
|
|
|
|
from seahub.forms import RepoCreateForm, SharedRepoCreateForm
|
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, \
|
2012-10-15 13:03:42 +00:00
|
|
|
|
validate_group_name, string2list, calculate_repo_last_modify, MAX_INT, \
|
2012-10-26 11:50:36 +00:00
|
|
|
|
EVENTS_ENABLED, get_org_user_events, get_starred_files
|
2012-07-26 09:08:31 +00:00
|
|
|
|
from seahub.views import myhome
|
2012-10-15 13:03:42 +00:00
|
|
|
|
from seahub.signals import repo_created
|
|
|
|
|
|
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(\
|
2012-10-13 11:02:57 +00:00
|
|
|
|
reverse(org_personal, args=[url_prefix]))
|
2012-07-26 09:08:31 +00:00
|
|
|
|
except SearpcError, e:
|
2012-08-31 11:37:22 +00:00
|
|
|
|
return render_error(request, e.msg, extra_ctx={
|
|
|
|
|
'base_template': 'myhome_base.html',
|
|
|
|
|
})
|
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
|
2012-10-13 09:40:06 +00:00
|
|
|
|
def org_root(request, url_prefix):
|
|
|
|
|
return HttpResponseRedirect(reverse(org_personal, args=[url_prefix]))
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
def org_public(request, url_prefix):
|
2012-07-26 09:08:31 +00:00
|
|
|
|
"""
|
2012-08-29 05:40:47 +00:00
|
|
|
|
Show org info page, list org inner pub repos.
|
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-09-26 02:49:00 +00:00
|
|
|
|
repos = list_org_inner_pub_repos(org.org_id, request.user.username)
|
2012-07-28 08:41:24 +00:00
|
|
|
|
|
2012-10-13 09:40:06 +00:00
|
|
|
|
return render_to_response('organizations/org_public.html', {
|
2012-07-26 09:08:31 +00:00
|
|
|
|
'org': org,
|
|
|
|
|
'repos': repos,
|
2012-09-26 02:49:00 +00:00
|
|
|
|
'create_shared_repo': True,
|
2012-07-26 09:08:31 +00:00
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
|
|
2012-08-29 05:40:47 +00:00
|
|
|
|
@login_required
|
|
|
|
|
def org_personal(request, url_prefix):
|
|
|
|
|
"""
|
|
|
|
|
Show org personal page.
|
|
|
|
|
"""
|
|
|
|
|
org = get_user_current_org(request.user.username, url_prefix)
|
|
|
|
|
if not org:
|
|
|
|
|
return HttpResponseRedirect(reverse(myhome))
|
|
|
|
|
|
|
|
|
|
user = request.user.username
|
|
|
|
|
|
|
|
|
|
# Org repos that I own
|
|
|
|
|
owned_repos = seafserv_threaded_rpc.list_org_repos_by_owner(org.org_id,
|
|
|
|
|
user)
|
|
|
|
|
calculate_repo_last_modify(owned_repos)
|
|
|
|
|
owned_repos.sort(lambda x, y: cmp(y.latest_modify, x.latest_modify))
|
|
|
|
|
|
2012-09-03 04:03:06 +00:00
|
|
|
|
# Org groups user created
|
2012-08-31 11:50:24 +00:00
|
|
|
|
groups = get_org_groups_by_user(org.org_id, user)
|
2012-09-01 09:46:46 +00:00
|
|
|
|
|
2012-12-18 11:52:41 +00:00
|
|
|
|
# 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))
|
|
|
|
|
|
2012-09-27 09:52:04 +00:00
|
|
|
|
# All org groups used in auto complete.
|
|
|
|
|
org_groups = get_org_groups(org.org_id, -1, -1)
|
|
|
|
|
|
2012-09-03 04:03:06 +00:00
|
|
|
|
# Org members used in auto complete
|
|
|
|
|
contacts = []
|
2012-09-01 09:46:46 +00:00
|
|
|
|
org_members = get_org_users_by_url_prefix(org.url_prefix, 0, MAX_INT)
|
2012-09-03 04:03:06 +00:00
|
|
|
|
for m in org_members:
|
|
|
|
|
if m.email == user: # shouldn' show my'email in auto complete
|
|
|
|
|
continue
|
|
|
|
|
m.contact_email = m.email
|
|
|
|
|
contacts.append(m)
|
2012-10-13 09:40:06 +00:00
|
|
|
|
|
|
|
|
|
# Get nickname
|
|
|
|
|
if not Profile.objects.filter(user=request.user.username):
|
|
|
|
|
nickname = ''
|
|
|
|
|
else:
|
|
|
|
|
profile = Profile.objects.filter(user=request.user.username)[0]
|
|
|
|
|
nickname = profile.nickname
|
|
|
|
|
|
2012-10-15 13:03:42 +00:00
|
|
|
|
# events
|
|
|
|
|
if EVENTS_ENABLED:
|
|
|
|
|
events = get_org_user_events(org.org_id, user)
|
|
|
|
|
else:
|
|
|
|
|
events = None
|
2012-10-26 06:27:54 +00:00
|
|
|
|
|
|
|
|
|
quota_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org.org_id, user)
|
2012-10-26 11:50:36 +00:00
|
|
|
|
starred_files = get_starred_files(user, org_id=org.org_id)
|
2012-10-15 13:03:42 +00:00
|
|
|
|
|
2012-08-29 05:40:47 +00:00
|
|
|
|
return render_to_response('organizations/personal.html', {
|
|
|
|
|
'owned_repos': owned_repos,
|
2012-09-03 04:03:06 +00:00
|
|
|
|
"in_repos": in_repos,
|
2012-08-30 12:15:17 +00:00
|
|
|
|
'org': org,
|
2012-08-30 13:15:41 +00:00
|
|
|
|
'groups': groups,
|
2012-09-27 09:52:04 +00:00
|
|
|
|
'org_groups': org_groups,
|
2012-09-03 04:03:06 +00:00
|
|
|
|
'contacts': contacts,
|
2012-09-26 02:49:00 +00:00
|
|
|
|
'create_shared_repo': False,
|
|
|
|
|
'allow_public_share': True,
|
2012-10-13 09:40:06 +00:00
|
|
|
|
'nickname': nickname,
|
2012-10-15 13:03:42 +00:00
|
|
|
|
'events': events,
|
2012-10-26 06:27:54 +00:00
|
|
|
|
'quota_usage': quota_usage,
|
2012-10-26 11:50:36 +00:00
|
|
|
|
'starred_files': starred_files,
|
2012-08-29 05:40:47 +00:00
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
def org_inner_pub_repo_create(request, url_prefix):
|
|
|
|
|
"""
|
|
|
|
|
Handle ajax post to create org inner pub repo, this repo is accessiable by
|
|
|
|
|
all org members.
|
|
|
|
|
"""
|
|
|
|
|
if not request.is_ajax() or request.method != 'POST':
|
|
|
|
|
return Http404
|
|
|
|
|
|
|
|
|
|
result = {}
|
|
|
|
|
content_type = 'application/json; charset=utf-8'
|
|
|
|
|
|
2012-09-26 02:49:00 +00:00
|
|
|
|
form = SharedRepoCreateForm(request.POST)
|
2012-08-29 05:40:47 +00:00
|
|
|
|
if form.is_valid():
|
|
|
|
|
repo_name = form.cleaned_data['repo_name']
|
|
|
|
|
repo_desc = form.cleaned_data['repo_desc']
|
2012-09-26 02:49:00 +00:00
|
|
|
|
permission = form.cleaned_data['permission']
|
2012-08-29 05:40:47 +00:00
|
|
|
|
passwd = form.cleaned_data['passwd']
|
|
|
|
|
user = request.user.username
|
2012-08-30 12:15:17 +00:00
|
|
|
|
org = get_user_current_org(request.user.username, url_prefix)
|
|
|
|
|
if not org:
|
2012-11-01 07:45:12 +00:00
|
|
|
|
return HttpResponse(json.dumps(_(u'Failed to create the library: you has not joined this organizatioin.')),
|
2012-08-30 12:15:17 +00:00
|
|
|
|
content_type=content_type)
|
2012-08-29 05:40:47 +00:00
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
# create a org repo
|
2012-08-30 12:15:17 +00:00
|
|
|
|
repo_id = create_org_repo(repo_name, repo_desc, user, passwd,
|
|
|
|
|
org.org_id)
|
2012-08-29 05:40:47 +00:00
|
|
|
|
# set org inner pub
|
2012-09-26 02:49:00 +00:00
|
|
|
|
seafserv_threaded_rpc.set_org_inner_pub_repo(org.org_id, repo_id, permission)
|
2012-08-29 05:40:47 +00:00
|
|
|
|
except:
|
|
|
|
|
repo_id = None
|
|
|
|
|
if not repo_id:
|
2012-11-01 07:45:12 +00:00
|
|
|
|
result['error'] = _(u"Failed to create.")
|
2012-08-29 05:40:47 +00:00
|
|
|
|
else:
|
|
|
|
|
result['success'] = True
|
2012-10-15 13:03:42 +00:00
|
|
|
|
repo_created.send(sender=None,
|
|
|
|
|
org_id=org.org_id,
|
|
|
|
|
creator=user,
|
|
|
|
|
repo_id=repo_id,
|
|
|
|
|
repo_name=repo_name)
|
2012-08-29 05:40:47 +00:00
|
|
|
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
|
|
|
|
else:
|
|
|
|
|
return HttpResponseBadRequest(json.dumps(form.errors),
|
|
|
|
|
content_type=content_type)
|
2012-09-06 02:56:43 +00:00
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
def unset_org_inner_pub_repo(request, url_prefix, repo_id):
|
|
|
|
|
org = get_user_current_org(request.user.username, url_prefix)
|
|
|
|
|
if not org:
|
2012-10-13 09:40:06 +00:00
|
|
|
|
return HttpResponseRedirect(reverse(org_public, args=[url_prefix]))
|
2012-09-06 02:56:43 +00:00
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
seafserv_threaded_rpc.unset_org_inner_pub_repo(org.org_id, repo_id)
|
|
|
|
|
except SearpcError:
|
|
|
|
|
pass
|
2012-09-26 02:49:00 +00:00
|
|
|
|
|
2012-11-01 07:45:12 +00:00
|
|
|
|
messages.add_message(request, messages.INFO, _('Operation Succeeded.'))
|
2012-08-29 05:40:47 +00:00
|
|
|
|
|
2012-09-26 02:49:00 +00:00
|
|
|
|
return HttpResponseRedirect(reverse(org_shareadmin, args=[url_prefix]))
|
2012-09-06 02:56:43 +00:00
|
|
|
|
|
2012-07-26 09:08:31 +00:00
|
|
|
|
@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':
|
2012-09-06 05:20:36 +00:00
|
|
|
|
result = {}
|
|
|
|
|
content_type = 'application/json; charset=utf-8'
|
|
|
|
|
|
2012-07-26 09:08:31 +00:00
|
|
|
|
group_name = request.POST.get('group_name')
|
|
|
|
|
if not validate_group_name(group_name):
|
2012-11-01 07:45:12 +00:00
|
|
|
|
result['error'] = _(u'Group name can only contain letters, digits and underscore')
|
2012-09-06 05:20:36 +00:00
|
|
|
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
2012-07-26 09:08:31 +00:00
|
|
|
|
|
|
|
|
|
try:
|
2012-09-05 13:51:17 +00:00
|
|
|
|
e_grpname = group_name.encode('utf-8')
|
|
|
|
|
user = request.user.username
|
|
|
|
|
group_id = ccnet_threaded_rpc.create_org_group(org.org_id,
|
|
|
|
|
e_grpname,
|
|
|
|
|
user)
|
2012-07-26 09:08:31 +00:00
|
|
|
|
except SearpcError, e:
|
2012-09-07 08:14:36 +00:00
|
|
|
|
result['error'] = _(e.msg)
|
2012-09-06 05:20:36 +00:00
|
|
|
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
|
|
|
|
return HttpResponse(json.dumps({'success': True}),
|
|
|
|
|
content_type=content_type)
|
2012-09-26 11:48:55 +00:00
|
|
|
|
|
|
|
|
|
joined_groups = get_org_groups_by_user(org.org_id, request.user.username)
|
2012-09-05 13:51:17 +00:00
|
|
|
|
groups = get_org_groups(org.org_id, -1, -1)
|
2012-10-11 04:59:38 +00:00
|
|
|
|
org_members = get_org_users_by_url_prefix(url_prefix, 0, MAX_INT)
|
|
|
|
|
|
2012-07-26 09:08:31 +00:00
|
|
|
|
return render_to_response('organizations/org_groups.html', {
|
|
|
|
|
'org': org,
|
|
|
|
|
'groups': groups,
|
2012-09-26 11:48:55 +00:00
|
|
|
|
'joined_groups': joined_groups,
|
2012-10-11 04:59:38 +00:00
|
|
|
|
'org_members': org_members,
|
2012-07-26 09:08:31 +00:00
|
|
|
|
}, 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',
|
2012-10-30 11:37:47 +00:00
|
|
|
|
'site_name': seahub_settings.SITE_NAME,
|
2012-07-27 03:39:55 +00:00
|
|
|
|
}
|
2012-10-30 11:37:47 +00:00
|
|
|
|
|
2012-07-27 03:39:55 +00:00
|
|
|
|
try:
|
2012-10-30 11:37:47 +00:00
|
|
|
|
send_mail(_(u'Seafile Login Information'), t.render(Context(c)),
|
2012-07-27 03:39:55 +00:00
|
|
|
|
None, [email], fail_silently=False)
|
2012-11-01 07:45:12 +00:00
|
|
|
|
messages.add_message(request, messages.INFO, _(u'Mail sent successfully'))
|
2012-07-27 03:39:55 +00:00
|
|
|
|
except:
|
2012-11-01 07:45:12 +00:00
|
|
|
|
messages.add_message(request, messages.ERROR, _(u'Failed to send the email'))
|
2012-07-27 03:39:55 +00:00
|
|
|
|
|
|
|
|
|
@login_required
|
2012-08-03 08:37:36 +00:00
|
|
|
|
@org_staff_required
|
2012-10-26 06:27:54 +00:00
|
|
|
|
def org_admin(request, url_prefix):
|
2012-07-27 03:39:55 +00:00
|
|
|
|
"""
|
|
|
|
|
List and add org users.
|
|
|
|
|
"""
|
|
|
|
|
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
|
|
|
|
|
2012-08-10 13:16:55 +00:00
|
|
|
|
email_list = string2list(emails)
|
2012-07-27 03:39:55 +00:00
|
|
|
|
for email in email_list:
|
|
|
|
|
if not email or email.find('@') <= 0 :
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
org_id = request.user.org['org_id']
|
2012-08-07 08:48:26 +00:00
|
|
|
|
try:
|
|
|
|
|
User.objects.get(email=email)
|
2012-07-27 03:39:55 +00:00
|
|
|
|
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-08-07 08:48:26 +00:00
|
|
|
|
except User.DoesNotExist:
|
2012-07-27 03:39:55 +00:00
|
|
|
|
# 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
|
|
|
|
|
|
2012-09-01 09:46:46 +00:00
|
|
|
|
users_plus_one = get_org_users_by_url_prefix(
|
2012-07-27 03:39:55 +00:00
|
|
|
|
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
|
2012-10-26 06:27:54 +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
|
|
|
|
|
|
|
|
|
users = users_plus_one[:per_page]
|
|
|
|
|
for user in users:
|
|
|
|
|
if user.props.id == request.user.id:
|
|
|
|
|
user.is_self = True
|
2012-10-26 06:27:54 +00:00
|
|
|
|
try:
|
|
|
|
|
user.quota_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org.org_id, user.email)
|
|
|
|
|
except:
|
|
|
|
|
user.quota_usage = -1
|
2012-08-03 09:04:15 +00:00
|
|
|
|
|
|
|
|
|
# My contacts
|
|
|
|
|
contacts = Contact.objects.filter(user_email=request.user.username)
|
2012-10-26 06:27:54 +00:00
|
|
|
|
|
|
|
|
|
org_quota_usage = seafserv_threaded_rpc.get_org_quota_usage(org.org_id)
|
|
|
|
|
org_quota = seafserv_threaded_rpc.get_org_quota(org.org_id)
|
2012-07-27 03:39:55 +00:00
|
|
|
|
|
|
|
|
|
return render_to_response(
|
2012-10-26 06:27:54 +00:00
|
|
|
|
'organizations/org_admin.html', {
|
2012-07-27 03:39:55 +00:00
|
|
|
|
'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,
|
2012-10-26 06:27:54 +00:00
|
|
|
|
'org_quota_usage': org_quota_usage,
|
|
|
|
|
'org_quota': org_quota,
|
2012-07-27 03:39:55 +00:00
|
|
|
|
},
|
|
|
|
|
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)
|
|
|
|
|
|
2012-11-01 07:45:12 +00:00
|
|
|
|
messages.success(request, _(u"Successfully deleted."))
|
2012-10-15 09:04:26 +00:00
|
|
|
|
|
2012-10-30 11:37:47 +00:00
|
|
|
|
return HttpResponseRedirect(reverse('org_admin', 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:
|
2012-09-06 08:57:54 +00:00
|
|
|
|
if n.msg_type == 'org_join_msg':
|
|
|
|
|
try:
|
|
|
|
|
d = json.loads(n.detail)
|
|
|
|
|
from_email = d['from_email']
|
|
|
|
|
org_name = d['org_name']
|
|
|
|
|
org_prefix = d['org_prefix']
|
2012-10-13 09:40:06 +00:00
|
|
|
|
org_url = reverse('org_public', args=[org_prefix])
|
2012-09-06 08:57:54 +00:00
|
|
|
|
|
2012-11-01 07:45:12 +00:00
|
|
|
|
msg = _(u'%(from_email)s added you to Organization <a href="%(org_url)s">%(org_name)s</a>') % \
|
2012-10-30 11:37:47 +00:00
|
|
|
|
{'from_email':from_email,
|
|
|
|
|
'org_url': org_url,
|
|
|
|
|
'org_name': org_name}
|
2012-09-06 08:57:54 +00:00
|
|
|
|
orgmsg_list.append(msg)
|
|
|
|
|
except json.decoder.JSONDecodeError:
|
|
|
|
|
# This message is not json format, just list to user.
|
|
|
|
|
orgmsg_list.append(n.detail)
|
2012-07-27 09:54:07 +00:00
|
|
|
|
|
|
|
|
|
# remove new org msg notification
|
|
|
|
|
UserNotification.objects.filter(to_user=request.user.username,
|
2012-09-06 08:57:54 +00:00
|
|
|
|
msg_type='org_join_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-08-29 05:40:47 +00:00
|
|
|
|
"""
|
|
|
|
|
Handle ajax post to create org repo, this repo is only accessiable by owner.
|
|
|
|
|
"""
|
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
|
2012-08-30 12:15:17 +00:00
|
|
|
|
org = get_user_current_org(request.user.username, url_prefix)
|
|
|
|
|
if not org:
|
2012-11-01 07:45:12 +00:00
|
|
|
|
return HttpResponse(json.dumps(_(u'Failed to create: you has not joined this organization')),
|
2012-08-30 12:15:17 +00:00
|
|
|
|
content_type=content_type)
|
2012-07-30 02:25:46 +00:00
|
|
|
|
|
2012-08-30 12:15:17 +00:00
|
|
|
|
repo_id = create_org_repo(repo_name, repo_desc, user, passwd,
|
|
|
|
|
org.org_id)
|
2012-07-28 08:41:24 +00:00
|
|
|
|
if not repo_id:
|
2012-11-01 07:45:12 +00:00
|
|
|
|
result['error'] = _(u'Failed to create')
|
2012-07-30 02:25:46 +00:00
|
|
|
|
else:
|
|
|
|
|
result['success'] = True
|
2012-10-15 13:03:42 +00:00
|
|
|
|
repo_created.send(sender=None,
|
|
|
|
|
org_id=org.org_id,
|
|
|
|
|
creator=user,
|
|
|
|
|
repo_id=repo_id,
|
|
|
|
|
repo_name=repo_name)
|
2012-07-30 02:25:46 +00:00
|
|
|
|
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)
|
2012-09-04 13:05:20 +00:00
|
|
|
|
|
2012-08-02 11:43:20 +00:00
|
|
|
|
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))
|
|
|
|
|
|
2012-08-04 03:00:04 +00:00
|
|
|
|
@login_required
|
|
|
|
|
@org_staff_required
|
|
|
|
|
def org_group_remove(request, url_prefix, group_id):
|
|
|
|
|
# Request header may missing HTTP_REFERER, we need to handle that case.
|
|
|
|
|
next = request.META.get('HTTP_REFERER', None)
|
|
|
|
|
if not next:
|
|
|
|
|
next = seahub_settings.SITE_ROOT
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
group_id_int = int(group_id)
|
|
|
|
|
except ValueError:
|
|
|
|
|
return HttpResponseRedirect(next)
|
|
|
|
|
|
|
|
|
|
# Check whether is the org group.
|
2012-08-04 03:47:00 +00:00
|
|
|
|
org_id = get_org_id_by_group(group_id_int)
|
2012-08-04 03:00:04 +00:00
|
|
|
|
if request.user.org['org_id'] != org_id:
|
2012-11-01 07:45:12 +00:00
|
|
|
|
return render_permission_error(request, _(u"This group doesn't belong to current organazation"),
|
2012-08-31 11:37:22 +00:00
|
|
|
|
extra_ctx={'org': request.user.org,
|
|
|
|
|
'base_template': 'org_base.html'})
|
2012-08-04 03:00:04 +00:00
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
ccnet_threaded_rpc.remove_group(group_id_int, request.user.username)
|
|
|
|
|
seafserv_threaded_rpc.remove_repo_group(group_id_int, None)
|
|
|
|
|
ccnet_threaded_rpc.remove_org_group(org_id, group_id_int)
|
|
|
|
|
except SearpcError, e:
|
2012-08-31 11:37:22 +00:00
|
|
|
|
return render_error(request, e.msg, extra_ctx={
|
|
|
|
|
'org': request.user.org,
|
|
|
|
|
'base_template': 'org_base.html',
|
|
|
|
|
})
|
2012-08-04 03:00:04 +00:00
|
|
|
|
|
|
|
|
|
return HttpResponseRedirect(next)
|
2012-09-01 09:46:46 +00:00
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
def org_repo_share(request, url_prefix):
|
|
|
|
|
"""
|
2012-09-14 03:39:33 +00:00
|
|
|
|
Share org repo to members or groups in current org.
|
2012-09-01 09:46:46 +00:00
|
|
|
|
"""
|
|
|
|
|
if request.method != 'POST':
|
|
|
|
|
raise Http404
|
|
|
|
|
|
|
|
|
|
org = get_user_current_org(request.user.username, url_prefix)
|
|
|
|
|
if not org:
|
|
|
|
|
return HttpResponseRedirect(reverse(myhome))
|
|
|
|
|
|
|
|
|
|
form = RepoShareForm(request.POST)
|
|
|
|
|
if not form.is_valid():
|
|
|
|
|
# TODO: may display error msg on form
|
|
|
|
|
raise Http404
|
|
|
|
|
|
|
|
|
|
email_or_group = form.cleaned_data['email_or_group']
|
|
|
|
|
repo_id = form.cleaned_data['repo_id']
|
2012-09-26 02:49:00 +00:00
|
|
|
|
permission = form.cleaned_data['permission']
|
2012-09-01 09:46:46 +00:00
|
|
|
|
from_email = request.user.username
|
|
|
|
|
|
|
|
|
|
# Test whether user is the repo owner
|
|
|
|
|
if not validate_org_repo_owner(org.org_id, repo_id, request.user.username):
|
2012-11-01 07:45:12 +00:00
|
|
|
|
return render_permission_error(request, _(u'Only the owner of this library has permission to share it.'),
|
2012-09-01 09:46:46 +00:00
|
|
|
|
extra_ctx={
|
|
|
|
|
'org': org,
|
|
|
|
|
'base_template': 'org_base.html',
|
|
|
|
|
})
|
|
|
|
|
|
2012-09-03 04:03:06 +00:00
|
|
|
|
share_to_list = string2list(email_or_group)
|
|
|
|
|
for share_to in share_to_list:
|
2012-09-26 02:49:00 +00:00
|
|
|
|
if share_to == 'all':
|
|
|
|
|
''' Share to public '''
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
seafserv_threaded_rpc.set_org_inner_pub_repo(org.org_id,
|
|
|
|
|
repo_id, permission)
|
|
|
|
|
except:
|
2012-11-01 07:45:12 +00:00
|
|
|
|
msg = _(u'Failed to share to all members')
|
2012-10-18 13:28:15 +00:00
|
|
|
|
messages.add_message(request, messages.ERROR, msg)
|
2012-09-26 02:49:00 +00:00
|
|
|
|
continue
|
|
|
|
|
|
2012-11-01 07:45:12 +00:00
|
|
|
|
msg = _(u'Shared to all members successfully, you can go check it at <a href="%s">Share</a>.') % \
|
2012-09-26 02:49:00 +00:00
|
|
|
|
(reverse('org_shareadmin', args=[org.url_prefix]))
|
|
|
|
|
messages.add_message(request, messages.INFO, msg)
|
2012-09-26 11:48:55 +00:00
|
|
|
|
elif (share_to.find('@') == -1):
|
2012-09-03 04:03:06 +00:00
|
|
|
|
''' Share repo to group '''
|
|
|
|
|
# TODO: if we know group id, then we can simplly call group_share_repo
|
2012-09-26 11:48:55 +00:00
|
|
|
|
group_name = share_to
|
|
|
|
|
|
2012-09-27 09:52:04 +00:00
|
|
|
|
# Get all org groups.
|
|
|
|
|
groups = get_org_groups(org.org_id, -1, -1)
|
2012-09-03 04:03:06 +00:00
|
|
|
|
find = False
|
|
|
|
|
for group in groups:
|
|
|
|
|
# for every group that user joined, if group name and
|
|
|
|
|
# group creator matchs, then has finded the group
|
2012-09-26 11:48:55 +00:00
|
|
|
|
if group.props.group_name == group_name:
|
2012-09-03 04:03:06 +00:00
|
|
|
|
seafserv_threaded_rpc.add_org_group_repo(repo_id,
|
|
|
|
|
org.org_id,
|
|
|
|
|
group.id,
|
|
|
|
|
from_email,
|
2012-09-26 02:49:00 +00:00
|
|
|
|
permission)
|
2012-09-03 04:03:06 +00:00
|
|
|
|
find = True
|
2012-11-01 07:45:12 +00:00
|
|
|
|
msg = _(u'Shared to %(group)s successfully,you can go check it at <a href="%(share)s">Share</a>.') % \
|
|
|
|
|
{'group':group_name, 'share':reverse('org_shareadmin', args=[org.url_prefix])}
|
2012-09-03 04:03:06 +00:00
|
|
|
|
|
|
|
|
|
messages.add_message(request, messages.INFO, msg)
|
|
|
|
|
break
|
|
|
|
|
if not find:
|
2012-11-01 07:45:12 +00:00
|
|
|
|
msg = _(u'Failed to share to %s.') % group_name
|
2012-09-03 04:03:06 +00:00
|
|
|
|
messages.add_message(request, messages.ERROR, msg)
|
2012-09-01 09:46:46 +00:00
|
|
|
|
else:
|
|
|
|
|
''' Share repo to user '''
|
2012-09-03 04:03:06 +00:00
|
|
|
|
# Test whether share_to is in this org
|
|
|
|
|
if not org_user_exists(org.org_id, share_to):
|
2012-11-01 07:45:12 +00:00
|
|
|
|
msg = _(u'Failed to share to %s: this user does not exist in the organization.') % share_to
|
2012-09-01 09:46:46 +00:00
|
|
|
|
messages.add_message(request, messages.ERROR, msg)
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
# Record share info to db.
|
|
|
|
|
try:
|
2012-09-03 04:03:06 +00:00
|
|
|
|
seafserv_threaded_rpc.add_share(repo_id, from_email, share_to,
|
2012-09-26 02:49:00 +00:00
|
|
|
|
permission)
|
2012-11-01 07:45:12 +00:00
|
|
|
|
msg = _(u'Shared to %(share_to)s successfully,you can go check it at <a href="%(share)s">Share</a>.') % \
|
2012-11-10 05:27:01 +00:00
|
|
|
|
{"share_to":share_to,
|
|
|
|
|
"share": reverse('org_shareadmin', args=[org.url_prefix])}
|
2012-09-01 09:46:46 +00:00
|
|
|
|
messages.add_message(request, messages.INFO, msg)
|
|
|
|
|
except SearpcError, e:
|
2012-11-01 07:45:12 +00:00
|
|
|
|
msg = _(u'Failed to share to %s.') % share_to
|
2012-09-01 09:46:46 +00:00
|
|
|
|
messages.add_message(request, messages.ERROR, msg)
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
return HttpResponseRedirect(reverse(org_personal, args=[org.url_prefix]))
|
2012-09-03 04:03:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
def org_shareadmin(request, url_prefix):
|
|
|
|
|
"""
|
|
|
|
|
List personal repos I share to others, include groups and users.
|
|
|
|
|
"""
|
|
|
|
|
username = request.user.username
|
|
|
|
|
|
|
|
|
|
org = get_user_current_org(request.user.username, url_prefix)
|
|
|
|
|
if not org:
|
|
|
|
|
return HttpResponseRedirect(reverse(myhome))
|
|
|
|
|
|
2012-09-26 02:49:00 +00:00
|
|
|
|
shared_repos = []
|
|
|
|
|
|
|
|
|
|
# personal repos shared by this user
|
|
|
|
|
shared_repos += seafserv_threaded_rpc.list_org_share_repos(org.org_id,
|
|
|
|
|
username,
|
|
|
|
|
'from_email',
|
|
|
|
|
-1, -1)
|
2012-09-03 04:03:06 +00:00
|
|
|
|
|
2012-09-26 02:49:00 +00:00
|
|
|
|
# repos shared to groups
|
2012-09-03 08:14:15 +00:00
|
|
|
|
group_repos = seafserv_threaded_rpc.get_org_group_repos_by_owner(org.org_id,
|
2012-09-26 02:49:00 +00:00
|
|
|
|
username)
|
|
|
|
|
for repo in group_repos:
|
|
|
|
|
group = ccnet_threaded_rpc.get_group(int(repo.group_id))
|
2012-09-03 08:14:15 +00:00
|
|
|
|
if not group:
|
2012-09-26 02:49:00 +00:00
|
|
|
|
repo.props.user = ''
|
2012-09-03 08:14:15 +00:00
|
|
|
|
continue
|
2012-09-26 02:49:00 +00:00
|
|
|
|
repo.props.user = group.props.group_name
|
2012-10-18 13:28:15 +00:00
|
|
|
|
repo.props.user_info = repo.group_id
|
2012-09-26 02:49:00 +00:00
|
|
|
|
shared_repos += group_repos
|
|
|
|
|
|
|
|
|
|
# public repos shared by this user
|
|
|
|
|
pub_repos = seafserv_threaded_rpc.list_org_inner_pub_repos_by_owner(org.org_id,
|
|
|
|
|
username)
|
|
|
|
|
for repo in pub_repos:
|
2012-11-01 07:45:12 +00:00
|
|
|
|
repo.props.user = _(u'all members')
|
2012-10-18 13:28:15 +00:00
|
|
|
|
repo.props.user_info = 'all'
|
2012-09-26 02:49:00 +00:00
|
|
|
|
shared_repos += pub_repos
|
|
|
|
|
|
|
|
|
|
for repo in shared_repos:
|
|
|
|
|
if repo.props.permission == 'rw':
|
2012-11-01 07:45:12 +00:00
|
|
|
|
repo.share_permission = _(u'Read-Write')
|
2012-09-26 02:49:00 +00:00
|
|
|
|
elif repo.props.permission == 'r':
|
2012-11-01 07:45:12 +00:00
|
|
|
|
repo.share_permission = _(u'Read-Only')
|
2012-09-21 03:22:46 +00:00
|
|
|
|
else:
|
|
|
|
|
repo.share_permission = ''
|
|
|
|
|
|
2012-10-18 13:28:15 +00:00
|
|
|
|
if repo.props.share_type == 'personal':
|
|
|
|
|
repo.props.user_info = repo.props.user
|
|
|
|
|
|
2012-09-26 02:49:00 +00:00
|
|
|
|
shared_repos.sort(lambda x, y: cmp(x.repo_id, y.repo_id))
|
|
|
|
|
|
2012-09-03 04:03:06 +00:00
|
|
|
|
# File shared links
|
|
|
|
|
fileshares = FileShare.objects.filter(username=request.user.username)
|
|
|
|
|
o_fileshares = [] # shared files in org repos
|
|
|
|
|
for fs in fileshares:
|
|
|
|
|
if not is_personal_repo(fs.repo_id):
|
|
|
|
|
# only list files in org repos
|
|
|
|
|
fs.filename = os.path.basename(fs.path)
|
|
|
|
|
fs.repo = get_repo(fs.repo_id)
|
|
|
|
|
o_fileshares.append(fs)
|
2012-09-04 09:15:19 +00:00
|
|
|
|
|
|
|
|
|
request.base_template = 'org_base.html'
|
2012-09-03 04:03:06 +00:00
|
|
|
|
|
2012-09-04 09:15:19 +00:00
|
|
|
|
return render_to_response('repo/share_admin.html', {
|
2012-09-03 04:03:06 +00:00
|
|
|
|
"org": org,
|
2012-09-26 02:49:00 +00:00
|
|
|
|
"shared_repos": shared_repos,
|
2012-09-03 04:03:06 +00:00
|
|
|
|
"fileshares": o_fileshares,
|
|
|
|
|
"protocol": request.is_secure() and 'https' or 'http',
|
|
|
|
|
"domain": RequestSite(request).domain,
|
|
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
|
|
2012-10-18 13:28:15 +00:00
|
|
|
|
@login_required
|
|
|
|
|
def org_share_permission_admin(request, url_prefix):
|
|
|
|
|
org_id = int(request.GET.get('org_id', ''))
|
|
|
|
|
share_type = request.GET.get('share_type', '')
|
|
|
|
|
content_type = 'application/json; charset=utf-8'
|
|
|
|
|
|
|
|
|
|
form = RepoShareForm(request.POST)
|
|
|
|
|
form.is_valid()
|
|
|
|
|
|
|
|
|
|
email_or_group = form.cleaned_data['email_or_group']
|
|
|
|
|
repo_id = form.cleaned_data['repo_id']
|
|
|
|
|
permission = form.cleaned_data['permission']
|
|
|
|
|
from_email = request.user.username
|
|
|
|
|
|
|
|
|
|
if share_type == 'personal':
|
|
|
|
|
try:
|
|
|
|
|
seafserv_threaded_rpc.set_share_permission(repo_id, from_email, email_or_group, permission)
|
|
|
|
|
except:
|
|
|
|
|
return HttpResponse(json.dumps({'success': False}), content_type=content_type)
|
|
|
|
|
return HttpResponse(json.dumps({'success': True}), content_type=content_type)
|
|
|
|
|
|
|
|
|
|
if share_type == 'group':
|
|
|
|
|
group_id = int(email_or_group)
|
|
|
|
|
try:
|
|
|
|
|
seafserv_threaded_rpc.set_org_group_repo_permission(org_id, group_id, repo_id, permission)
|
|
|
|
|
except:
|
|
|
|
|
return HttpResponse(json.dumps({'success': False}), content_type=content_type)
|
|
|
|
|
return HttpResponse(json.dumps({'success': True}), content_type=content_type)
|
|
|
|
|
|
|
|
|
|
if share_type == 'public':
|
|
|
|
|
try:
|
|
|
|
|
seafserv_threaded_rpc.set_org_inner_pub_repo(org_id, repo_id, permission)
|
|
|
|
|
except:
|
|
|
|
|
return HttpResponse(json.dumps({'success': False}), content_type=content_type)
|
|
|
|
|
return HttpResponse(json.dumps({'success': True}), content_type=content_type)
|
|
|
|
|
|
2012-10-11 06:34:08 +00:00
|
|
|
|
@login_required
|
|
|
|
|
def org_pubinfo(request, url_prefix):
|
|
|
|
|
"""
|
|
|
|
|
Show org public information.
|
|
|
|
|
"""
|
|
|
|
|
org = get_user_current_org(request.user.username, url_prefix)
|
|
|
|
|
if not org:
|
|
|
|
|
return HttpResponseRedirect(reverse(myhome))
|
|
|
|
|
|
|
|
|
|
groups = get_org_groups(org.org_id, -1, -1)
|
|
|
|
|
org_members = get_org_users_by_url_prefix(url_prefix, 0, MAX_INT)
|
|
|
|
|
|
|
|
|
|
return render_to_response('organizations/org_pubinfo.html', {
|
|
|
|
|
'org': org,
|
|
|
|
|
'groups': groups,
|
|
|
|
|
'org_members': org_members,
|
|
|
|
|
}, context_instance=RequestContext(request))
|