mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-24 04:48:03 +00:00
ajax import group members
This commit is contained in:
@@ -12,48 +12,19 @@ import seaserv
|
||||
from seaserv import seafile_api
|
||||
from pysearpc import SearpcError
|
||||
|
||||
from seahub.profile.models import Profile
|
||||
from seahub.api2.utils import api_error
|
||||
from seahub.api2.throttling import UserRateThrottle
|
||||
from seahub.api2.authentication import TokenAuthentication
|
||||
from seahub.avatar.settings import AVATAR_DEFAULT_SIZE
|
||||
from seahub.avatar.templatetags.avatar_tags import api_avatar_url, \
|
||||
get_default_avatar_url
|
||||
from seahub.utils import string2list, is_org_context
|
||||
from seahub.base.templatetags.seahub_tags import email2nickname
|
||||
from seahub.base.accounts import User
|
||||
from seahub.group.utils import is_group_member, is_group_admin, \
|
||||
is_group_owner, is_group_admin_or_owner, get_group_member_info
|
||||
|
||||
from .utils import api_check_group, is_group_member, is_group_admin, \
|
||||
is_group_owner, is_group_admin_or_owner
|
||||
from .utils import api_check_group
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def get_group_member_info(request, group_id, email, avatar_size=AVATAR_DEFAULT_SIZE):
|
||||
p = Profile.objects.get_profile_by_user(email)
|
||||
if p:
|
||||
login_id = p.login_id if p.login_id else ''
|
||||
else:
|
||||
login_id = ''
|
||||
|
||||
try:
|
||||
avatar_url, is_default, date_uploaded = api_avatar_url(email, avatar_size)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
avatar_url = get_default_avatar_url()
|
||||
|
||||
is_admin = seaserv.check_group_staff(group_id, email)
|
||||
member_info = {
|
||||
"name": email2nickname(email),
|
||||
'email': email,
|
||||
"contact_email": Profile.objects.get_contact_email_by_user(email),
|
||||
"login_id": login_id,
|
||||
"avatar_url": request.build_absolute_uri(avatar_url),
|
||||
"is_admin": is_admin,
|
||||
}
|
||||
|
||||
return member_info
|
||||
|
||||
|
||||
class GroupMembers(APIView):
|
||||
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
||||
permission_classes = (IsAuthenticated,)
|
||||
|
@@ -22,13 +22,13 @@ from seahub.avatar.templatetags.group_avatar_tags import api_grp_avatar_url, \
|
||||
get_default_group_avatar_url
|
||||
from seahub.utils import is_org_context, is_valid_username
|
||||
from seahub.utils.timeutils import dt, utc_to_local
|
||||
from seahub.group.utils import validate_group_name, check_group_name_conflict
|
||||
from seahub.group.utils import validate_group_name, check_group_name_conflict, \
|
||||
is_group_member, is_group_admin, is_group_owner, is_group_admin_or_owner
|
||||
from seahub.group.views import remove_group_common
|
||||
from seahub.base.templatetags.seahub_tags import email2nickname, \
|
||||
translate_seahub_time
|
||||
|
||||
from .utils import api_check_group, is_group_member, is_group_admin, \
|
||||
is_group_owner, is_group_admin_or_owner
|
||||
from .utils import api_check_group
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@@ -29,23 +29,3 @@ def api_check_group(func):
|
||||
return func(view, request, group_id, *args, **kwargs)
|
||||
|
||||
return _decorated
|
||||
|
||||
def is_group_member(group_id, email):
|
||||
return seaserv.is_group_user(group_id, email)
|
||||
|
||||
def is_group_admin(group_id, email):
|
||||
return seaserv.check_group_staff(group_id, email)
|
||||
|
||||
def is_group_owner(group_id, email):
|
||||
group = seaserv.get_group(group_id)
|
||||
if email == group.creator_name:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def is_group_admin_or_owner(group_id, email):
|
||||
if is_group_admin(group_id, email) or \
|
||||
is_group_owner(group_id, email):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
@@ -1,9 +1,17 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import re
|
||||
import logging
|
||||
|
||||
import seaserv
|
||||
|
||||
from seahub.utils import is_org_context
|
||||
from seahub.profile.models import Profile
|
||||
from seahub.base.templatetags.seahub_tags import email2nickname
|
||||
from seahub.avatar.settings import AVATAR_DEFAULT_SIZE
|
||||
from seahub.avatar.templatetags.avatar_tags import api_avatar_url, \
|
||||
get_default_avatar_url
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class BadGroupNameError(Exception):
|
||||
pass
|
||||
@@ -42,3 +50,48 @@ def check_group_name_conflict(request, new_group_name):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def is_group_member(group_id, email):
|
||||
return seaserv.is_group_user(group_id, email)
|
||||
|
||||
def is_group_admin(group_id, email):
|
||||
return seaserv.check_group_staff(group_id, email)
|
||||
|
||||
def is_group_owner(group_id, email):
|
||||
group = seaserv.get_group(group_id)
|
||||
if email == group.creator_name:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def is_group_admin_or_owner(group_id, email):
|
||||
if is_group_admin(group_id, email) or \
|
||||
is_group_owner(group_id, email):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def get_group_member_info(request, group_id, email, avatar_size=AVATAR_DEFAULT_SIZE):
|
||||
p = Profile.objects.get_profile_by_user(email)
|
||||
if p:
|
||||
login_id = p.login_id if p.login_id else ''
|
||||
else:
|
||||
login_id = ''
|
||||
|
||||
try:
|
||||
avatar_url, is_default, date_uploaded = api_avatar_url(email, avatar_size)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
avatar_url = get_default_avatar_url()
|
||||
|
||||
is_admin = seaserv.check_group_staff(group_id, email)
|
||||
member_info = {
|
||||
"name": email2nickname(email),
|
||||
'email': email,
|
||||
"contact_email": Profile.objects.get_contact_email_by_user(email),
|
||||
"login_id": login_id,
|
||||
"avatar_url": request.build_absolute_uri(avatar_url),
|
||||
"is_admin": is_admin,
|
||||
}
|
||||
|
||||
return member_info
|
||||
|
@@ -161,6 +161,7 @@ urlpatterns = patterns(
|
||||
url(r'^ajax/group/(?P<group_id>\d+)/repos/$', get_unenc_group_repos, name='get_group_repos'),
|
||||
url(r'^ajax/group/(?P<group_id>\d+)/basic-info/$', get_group_basic_info, name='get_group_basic_info'),
|
||||
url(r'^ajax/group/(?P<group_id>\d+)/toggle-modules/$', toggle_group_modules, name='toggle_group_modules'),
|
||||
url(r'^ajax/group/(?P<group_id>\d+)/members/import/$', ajax_group_members_import, name='ajax_group_members_import'),
|
||||
url(r'^ajax/toggle-personal-modules/$', toggle_personal_modules, name='toggle_personal_modules'),
|
||||
url(r'^ajax/my-unenc-repos/$', get_my_unenc_repos, name='get_my_unenc_repos'),
|
||||
url(r'^ajax/unenc-rw-repos/$', unenc_rw_repos, name='unenc_rw_repos'),
|
||||
|
@@ -4,6 +4,9 @@ import stat
|
||||
import logging
|
||||
import json
|
||||
import posixpath
|
||||
import csv
|
||||
import chardet
|
||||
import StringIO
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.http import HttpResponse, Http404, HttpResponseBadRequest
|
||||
@@ -47,6 +50,8 @@ from seahub.views.modules import get_enabled_mods_by_group, \
|
||||
disable_mod_for_group, MOD_GROUP_WIKI, MOD_PERSONAL_WIKI, \
|
||||
enable_mod_for_user, disable_mod_for_user
|
||||
from seahub.group.views import is_group_staff
|
||||
from seahub.group.utils import is_group_member, is_group_admin_or_owner, \
|
||||
get_group_member_info
|
||||
import seahub.settings as settings
|
||||
from seahub.settings import ENABLE_THUMBNAIL, THUMBNAIL_ROOT, \
|
||||
THUMBNAIL_DEFAULT_SIZE, ENABLE_SUB_LIBRARY, ENABLE_REPO_HISTORY_SETTING, \
|
||||
@@ -2724,3 +2729,117 @@ def ajax_unset_inner_pub_repo(request, repo_id):
|
||||
except SearpcError:
|
||||
return HttpResponse(json.dumps({"error": _('Internal server error')}),
|
||||
status=500, content_type=content_type)
|
||||
|
||||
@login_required_ajax
|
||||
def ajax_group_members_import(request, group_id):
|
||||
"""Import users to group.
|
||||
"""
|
||||
|
||||
result = {}
|
||||
username = request.user.username
|
||||
content_type = 'application/json; charset=utf-8'
|
||||
|
||||
group_id = int(group_id)
|
||||
try:
|
||||
group = seaserv.get_group(group_id)
|
||||
|
||||
if not group:
|
||||
result['error'] = 'Group %s not found.' % group_id
|
||||
return HttpResponse(json.dumps(result), status=404,
|
||||
content_type=content_type)
|
||||
# check permission
|
||||
if not is_group_admin_or_owner(group_id, username):
|
||||
result['error'] = 'Permission denied.'
|
||||
return HttpResponse(json.dumps(result), status=403,
|
||||
content_type=content_type)
|
||||
|
||||
except SearpcError as e:
|
||||
logger.error(e)
|
||||
result['error'] = 'Internal Server Error'
|
||||
return HttpResponse(json.dumps(result), status=500,
|
||||
content_type=content_type)
|
||||
|
||||
|
||||
# get and convert uploaded file
|
||||
uploaded_file = request.FILES['file']
|
||||
if uploaded_file.size > 10 * 1024 * 1024:
|
||||
result['error'] = _(u'Failed, file is too large')
|
||||
return HttpResponse(json.dumps(result), status=403,
|
||||
content_type=content_type)
|
||||
|
||||
try:
|
||||
content = uploaded_file.read()
|
||||
encoding = chardet.detect(content)['encoding']
|
||||
if encoding != 'utf-8':
|
||||
content = content.decode(encoding, 'replace').encode('utf-8')
|
||||
|
||||
filestream = StringIO.StringIO(content)
|
||||
reader = csv.reader(filestream)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
result['error'] = 'Internal Server Error'
|
||||
return HttpResponse(json.dumps(result), status=500,
|
||||
content_type=content_type)
|
||||
|
||||
# prepare email list from uploaded file
|
||||
emails_list = []
|
||||
for row in reader:
|
||||
if not row:
|
||||
continue
|
||||
|
||||
email = row[0].strip().lower()
|
||||
emails_list.append(email)
|
||||
|
||||
org_id = None
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
|
||||
result = {}
|
||||
result['failed'] = []
|
||||
result['success'] = []
|
||||
emails_need_add = []
|
||||
|
||||
# check email validation
|
||||
for email in emails_list:
|
||||
try:
|
||||
User.objects.get(email=email)
|
||||
except User.DoesNotExist:
|
||||
result['failed'].append({
|
||||
'email': email,
|
||||
'error_msg': 'User %s not found.' % email
|
||||
})
|
||||
continue
|
||||
|
||||
if is_group_member(group_id, email):
|
||||
result['failed'].append({
|
||||
'email': email,
|
||||
'error_msg': _(u'User %s is already a group member.') % email
|
||||
})
|
||||
continue
|
||||
|
||||
# Can only invite organization users to group
|
||||
if org_id and not \
|
||||
seaserv.ccnet_threaded_rpc.org_user_exists(org_id, email):
|
||||
result['failed'].append({
|
||||
'email': email,
|
||||
'error_msg': _(u'User %s not found in organization.') % email
|
||||
})
|
||||
continue
|
||||
|
||||
emails_need_add.append(email)
|
||||
|
||||
# Add email to group.
|
||||
for email in emails_need_add:
|
||||
try:
|
||||
seaserv.ccnet_threaded_rpc.group_add_member(group_id,
|
||||
username, email)
|
||||
member_info = get_group_member_info(request, group_id, email)
|
||||
result['success'].append(member_info)
|
||||
except SearpcError as e:
|
||||
logger.error(e)
|
||||
result['failed'].append({
|
||||
'email': email,
|
||||
'error_msg': 'Internal Server Error'
|
||||
})
|
||||
|
||||
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||
|
Reference in New Issue
Block a user