1
0
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:
lian
2016-01-08 15:26:15 +08:00
parent 7897bf55f6
commit 91211a683b
6 changed files with 179 additions and 55 deletions

View File

@@ -12,48 +12,19 @@ import seaserv
from seaserv import seafile_api from seaserv import seafile_api
from pysearpc import SearpcError from pysearpc import SearpcError
from seahub.profile.models import Profile
from seahub.api2.utils import api_error from seahub.api2.utils import api_error
from seahub.api2.throttling import UserRateThrottle from seahub.api2.throttling import UserRateThrottle
from seahub.api2.authentication import TokenAuthentication from seahub.api2.authentication import TokenAuthentication
from seahub.avatar.settings import AVATAR_DEFAULT_SIZE 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.utils import string2list, is_org_context
from seahub.base.templatetags.seahub_tags import email2nickname
from seahub.base.accounts import User 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, \ from .utils import api_check_group
is_group_owner, is_group_admin_or_owner
logger = logging.getLogger(__name__) 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): class GroupMembers(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication) authentication_classes = (TokenAuthentication, SessionAuthentication)
permission_classes = (IsAuthenticated,) permission_classes = (IsAuthenticated,)

View File

@@ -22,13 +22,13 @@ from seahub.avatar.templatetags.group_avatar_tags import api_grp_avatar_url, \
get_default_group_avatar_url get_default_group_avatar_url
from seahub.utils import is_org_context, is_valid_username from seahub.utils import is_org_context, is_valid_username
from seahub.utils.timeutils import dt, utc_to_local 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.group.views import remove_group_common
from seahub.base.templatetags.seahub_tags import email2nickname, \ from seahub.base.templatetags.seahub_tags import email2nickname, \
translate_seahub_time translate_seahub_time
from .utils import api_check_group, is_group_member, is_group_admin, \ from .utils import api_check_group
is_group_owner, is_group_admin_or_owner
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@@ -29,23 +29,3 @@ def api_check_group(func):
return func(view, request, group_id, *args, **kwargs) return func(view, request, group_id, *args, **kwargs)
return _decorated 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

View File

@@ -1,9 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import re import re
import logging
import seaserv import seaserv
from seahub.utils import is_org_context 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): class BadGroupNameError(Exception):
pass pass
@@ -42,3 +50,48 @@ def check_group_name_conflict(request, new_group_name):
return True return True
return False 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

View File

@@ -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+)/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+)/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+)/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/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/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'), url(r'^ajax/unenc-rw-repos/$', unenc_rw_repos, name='unenc_rw_repos'),

View File

@@ -4,6 +4,9 @@ import stat
import logging import logging
import json import json
import posixpath import posixpath
import csv
import chardet
import StringIO
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.http import HttpResponse, Http404, HttpResponseBadRequest 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, \ disable_mod_for_group, MOD_GROUP_WIKI, MOD_PERSONAL_WIKI, \
enable_mod_for_user, disable_mod_for_user enable_mod_for_user, disable_mod_for_user
from seahub.group.views import is_group_staff 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 import seahub.settings as settings
from seahub.settings import ENABLE_THUMBNAIL, THUMBNAIL_ROOT, \ from seahub.settings import ENABLE_THUMBNAIL, THUMBNAIL_ROOT, \
THUMBNAIL_DEFAULT_SIZE, ENABLE_SUB_LIBRARY, ENABLE_REPO_HISTORY_SETTING, \ 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: except SearpcError:
return HttpResponse(json.dumps({"error": _('Internal server error')}), return HttpResponse(json.dumps({"error": _('Internal server error')}),
status=500, content_type=content_type) 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)