From 91211a683bc4fc270a2c7a802db94536e016706b Mon Sep 17 00:00:00 2001 From: lian Date: Fri, 8 Jan 2016 15:26:15 +0800 Subject: [PATCH] ajax import group members --- seahub/api2/endpoints/group_members.py | 35 +------- seahub/api2/endpoints/groups.py | 6 +- seahub/api2/endpoints/utils.py | 20 ----- seahub/group/utils.py | 53 +++++++++++ seahub/urls.py | 1 + seahub/views/ajax.py | 119 +++++++++++++++++++++++++ 6 files changed, 179 insertions(+), 55 deletions(-) diff --git a/seahub/api2/endpoints/group_members.py b/seahub/api2/endpoints/group_members.py index 32577ed4ec..96ff624308 100644 --- a/seahub/api2/endpoints/group_members.py +++ b/seahub/api2/endpoints/group_members.py @@ -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,) diff --git a/seahub/api2/endpoints/groups.py b/seahub/api2/endpoints/groups.py index e6da4945bb..5af8a20389 100644 --- a/seahub/api2/endpoints/groups.py +++ b/seahub/api2/endpoints/groups.py @@ -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__) diff --git a/seahub/api2/endpoints/utils.py b/seahub/api2/endpoints/utils.py index 9206a0cdd1..6f4058df8a 100644 --- a/seahub/api2/endpoints/utils.py +++ b/seahub/api2/endpoints/utils.py @@ -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 diff --git a/seahub/group/utils.py b/seahub/group/utils.py index be6f9aeaa2..1c1cb5a9bc 100644 --- a/seahub/group/utils.py +++ b/seahub/group/utils.py @@ -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 diff --git a/seahub/urls.py b/seahub/urls.py index 82fcc59a8d..171b81c2a7 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -161,6 +161,7 @@ urlpatterns = patterns( url(r'^ajax/group/(?P\d+)/repos/$', get_unenc_group_repos, name='get_group_repos'), url(r'^ajax/group/(?P\d+)/basic-info/$', get_group_basic_info, name='get_group_basic_info'), url(r'^ajax/group/(?P\d+)/toggle-modules/$', toggle_group_modules, name='toggle_group_modules'), + url(r'^ajax/group/(?P\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'), diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py index bd882062be..af84ba3107 100644 --- a/seahub/views/ajax.py +++ b/seahub/views/ajax.py @@ -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)