diff --git a/seahub/templates/sys_group_admin.html b/seahub/templates/sysadmin/sys_group_admin.html similarity index 100% rename from seahub/templates/sys_group_admin.html rename to seahub/templates/sysadmin/sys_group_admin.html diff --git a/seahub/templates/sys_org_admin.html b/seahub/templates/sysadmin/sys_org_admin.html similarity index 100% rename from seahub/templates/sys_org_admin.html rename to seahub/templates/sysadmin/sys_org_admin.html diff --git a/seahub/templates/sys_seafadmin.html b/seahub/templates/sysadmin/sys_repo_admin.html similarity index 100% rename from seahub/templates/sys_seafadmin.html rename to seahub/templates/sysadmin/sys_repo_admin.html diff --git a/seahub/templates/sys_useradmin.html b/seahub/templates/sysadmin/sys_useradmin.html similarity index 96% rename from seahub/templates/sys_useradmin.html rename to seahub/templates/sysadmin/sys_useradmin.html index 429ce73dc1..ce33828c45 100644 --- a/seahub/templates/sys_useradmin.html +++ b/seahub/templates/sysadmin/sys_useradmin.html @@ -38,9 +38,9 @@ {% endif %} {% if CALC_SHARE_USAGE %} - {{ user.self_usage|filesizeformat }} + {{ user.share_usage|filesizeformat }} / {{ user.quota|filesizeformat }} + {{ user.self_usage|filesizeformat }} + {{ user.share_usage|filesizeformat }} {% if user.quota > 0 %} / {{ user.quota|filesizeformat }} {% endif %} {% else %} - {{ user.self_usage|filesizeformat }} / {{ user.quota|filesizeformat }} + {{ user.self_usage|filesizeformat }} {% if user.quota > 0 %} / {{ user.quota|filesizeformat }} {% endif %} {% endif %} {{ user.ctime|tsstr_sec }} @@ -139,14 +139,14 @@ $('#add-user-form').submit(function() { $.ajax({ url: '{% url 'user_add' %}', type: 'POST', - dataType: 'json', + datatype: 'json', cache: 'false', beforeSend: prepareCSRFToken, data: { 'email': email, 'password1': pwd1, 'password2': pwd2 - }, + }, success: function(data) { if (data['success']) { location.reload(true); diff --git a/seahub/templates/user_add_email.html b/seahub/templates/sysadmin/user_add_email.html similarity index 100% rename from seahub/templates/user_add_email.html rename to seahub/templates/sysadmin/user_add_email.html diff --git a/seahub/templates/user_reset_email.html b/seahub/templates/sysadmin/user_reset_email.html similarity index 100% rename from seahub/templates/user_reset_email.html rename to seahub/templates/sysadmin/user_reset_email.html diff --git a/seahub/templates/userinfo.html b/seahub/templates/sysadmin/userinfo.html similarity index 98% rename from seahub/templates/userinfo.html rename to seahub/templates/sysadmin/userinfo.html index 51512d6a1b..f8aa8b8d48 100644 --- a/seahub/templates/userinfo.html +++ b/seahub/templates/sysadmin/userinfo.html @@ -108,7 +108,7 @@ $('#set-quota-form .submit').click(function() { var self = $(this); self.attr('disabled', 'disabled'); $.ajax({ - url: '{% url 'views.user_info' email %}', + url: '{% url 'user_info' email %}', type: 'POST', dataType: 'json', cache: 'false', diff --git a/seahub/urls.py b/seahub/urls.py index e533f8d329..5b3a7016c0 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -12,6 +12,9 @@ from group.views import group_list from seahub.views.wiki import personal_wiki, personal_wiki_pages, \ personal_wiki_create, personal_wiki_page_new, personal_wiki_page_edit, \ personal_wiki_page_delete +from seahub.views.sysadmin import sys_repo_admin, sys_user_admin, sys_group_admin, \ + user_info, user_add, user_remove, user_make_admin, \ + user_remove_admin, user_reset, user_activate # Uncomment the next two lines to enable the admin: #from django.contrib import admin @@ -88,16 +91,8 @@ urlpatterns = patterns('', (r'^download/repo/$', repo_download), (r'^file/move/get_subdir/$', get_subdir), (r'^file/move/$', file_move), - (r'^seafile_access_check/$', seafile_access_check), - url(r'^org/remove/(?P[\d]+)/$', org_remove, name="org_remove"), + (r'^seafile_access_check/$', seafile_access_check), - url(r'^useradmin/add/$', user_add, name="user_add"), - (r'^useradmin/remove/(?P[^/]+)/$', user_remove), - url(r'^useradmin/makeadmin/(?P[^/]+)/$', user_make_admin, name='user_make_admin'), - url(r'^useradmin/removeadmin/(?P[^/]+)/$', user_remove_admin, name='user_remove_admin'), - (r'^useradmin/info/(?P[^/]+)/$', user_info), - (r'^useradmin/activate/(?P[^/]+)/$', activate_user), - url(r'^useradmin/password/reset/(?P[^/]+)/$', user_reset, name='user_reset'), ### Apps ### (r'^api2/', include('seahub.api2.urls')), @@ -110,11 +105,18 @@ urlpatterns = patterns('', (r'^share/', include('seahub.share.urls')), ### system admin ### - (r'^sys/seafadmin/$', sys_seafadmin), - url(r'^sys/useradmin/$', sys_useradmin, name='sys_useradmin'), - url(r'^sys/orgadmin/$', sys_org_admin, name='sys_org_admin'), - url(r'^sys/notificationadmin/', notification_list, name='notification_list'), + (r'^sys/seafadmin/$', sys_repo_admin), + url(r'^sys/useradmin/$', sys_user_admin, name='sys_useradmin'), url(r'^sys/groupadmin/$', sys_group_admin, name='sys_group_admin'), + url(r'^sys/notificationadmin/', notification_list, name='notification_list'), + url(r'^useradmin/add/$', user_add, name="user_add"), + (r'^useradmin/remove/(?P[^/]+)/$', user_remove), + url(r'^useradmin/makeadmin/(?P[^/]+)/$', user_make_admin, name='user_make_admin'), + url(r'^useradmin/removeadmin/(?P[^/]+)/$', user_remove_admin, name='user_remove_admin'), + url(r'^useradmin/info/(?P[^/]+)/$', user_info, name='user_info'), + (r'^useradmin/activate/(?P[^/]+)/$', user_activate), + url(r'^useradmin/password/reset/(?P[^/]+)/$', user_reset, name='user_reset'), + ) diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py index 5f4c4c7274..62f9a19456 100644 --- a/seahub/views/__init__.py +++ b/seahub/views/__init__.py @@ -1295,382 +1295,6 @@ def seafile_access_check(request): }, context_instance=RequestContext(request)) - -@login_required -@sys_staff_required -def sys_seafadmin(request): - # 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 = seafserv_threaded_rpc.get_repo_list(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 - - for repo in repos: - if is_org_repo(repo.id): - repo.owner = get_org_repo_owner(repo.id) - else: - repo.owner = get_repo_owner(repo.id) - - return render_to_response( - 'sys_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)) - -@login_required -@sys_staff_required -def sys_useradmin(request): - # 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 - users_plus_one = get_emailusers(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 - try: - user.self_usage = seafile_api.get_user_self_usage(user.email) - user.share_usage = seafile_api.get_user_share_usage(user.email) - user.quota = seafile_api.get_user_quota(user.email) - except: - user.self_usage = -1 - user.share_usage = -1 - user.quota = -1 - - return render_to_response( - 'sys_useradmin.html', { - 'users': users, - '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 -@sys_staff_required -def user_info(request, email): - if request.method == 'POST': - result = {} - content_type = 'application/json; charset=utf-8' - - f = SetUserQuotaForm(request.POST) - if f.is_valid(): - email = f.cleaned_data['email'] - quota_mb = f.cleaned_data['quota'] - quota = quota_mb * (1 << 20) - - try: - seafserv_threaded_rpc.set_user_quota(email, quota) - except: - result['error'] = _(u'Failed to set quota: internal error') - return HttpResponse(json.dumps(result), content_type=content_type) - - result['success'] = True - return HttpResponse(json.dumps(result), content_type=content_type) - else: - result['error'] = str(f.errors.values()[0]) - return HttpResponse(json.dumps(result), content_type=content_type) - - owned_repos = [] - - owned_repos = seafserv_threaded_rpc.list_owned_repos(email) - - quota = seafserv_threaded_rpc.get_user_quota(email) - quota_usage = 0 - share_usage = 0 - my_usage = 0 - my_usage = seafserv_threaded_rpc.get_user_quota_usage(email) - if CALC_SHARE_USAGE: - try: - share_usage = seafserv_threaded_rpc.get_user_share_usage(email) - except SearpcError, e: - share_usage = 0 - quota_usage = my_usage + share_usage - else: - quota_usage = my_usage - - # Repos that are share to user - in_repos = seafserv_threaded_rpc.list_share_repos(email, 'to_email', - -1, -1) - - # get nickname - if not Profile.objects.filter(user=email): - nickname = '' - else: - profile = Profile.objects.filter(user=email)[0] - nickname = profile.nickname - - return render_to_response( - 'userinfo.html', { - 'owned_repos': owned_repos, - 'quota': quota, - 'quota_usage': quota_usage, - 'CALC_SHARE_USAGE': CALC_SHARE_USAGE, - 'share_usage': share_usage, - 'my_usage': my_usage, - 'in_repos': in_repos, - 'email': email, - 'nickname': nickname, - }, context_instance=RequestContext(request)) - -@login_required -@sys_staff_required -def user_remove(request, user_id): - """Remove user, also remove group relationship.""" - try: - user = User.objects.get(id=int(user_id)) - user.delete() - messages.success(request, _(u'Successfully deleted %s') % user.username) - except User.DoesNotExist: - messages.error(request, _(u'Failed to delete: the user does not exist')) - - return HttpResponseRedirect(request.META["HTTP_REFERER"]) - -@login_required -@sys_staff_required -def user_make_admin(request, user_id): - """Set user as system admin.""" - try: - user = User.objects.get(id=int(user_id)) - user.is_staff = True - user.save() - messages.success(request, _(u'Successfully set %s as admin') % user.username) - except User.DoesNotExist: - messages.error(request, _(u'Failed to set admin: the user does not exist')) - - return HttpResponseRedirect(request.META["HTTP_REFERER"]) - -@login_required -@sys_staff_required -def user_remove_admin(request, user_id): - """Unset user admin.""" - try: - user = User.objects.get(id=int(user_id)) - user.is_staff = False - user.save() - messages.success(request, _(u'Successfully revoke the admin permission of %s') % user.username) - except User.DoesNotExist: - messages.error(request, _(u'Failed to revoke admin: the user does not exist')) - - return HttpResponseRedirect(request.META["HTTP_REFERER"]) - -@login_required -@sys_staff_required -def activate_user(request, user_id): - try: - user = User.objects.get(id=int(user_id)) - user.is_active = True - user.save() - except User.DoesNotExist: - pass - - return HttpResponseRedirect(reverse('sys_useradmin')) - -def send_user_reset_email(request, email, password): - """ - Send email when reset user password. - """ - use_https = request.is_secure() - domain = RequestSite(request).domain - - t = loader.get_template('user_reset_email.html') - c = { - 'email': email, - 'password': password, - 'site_name': settings.SITE_NAME, - } - send_mail(_(u'Password Reset'), t.render(Context(c)), - None, [email], fail_silently=False) - -@login_required -@sys_staff_required -def user_reset(request, user_id): - """Reset password for user.""" - try: - user = User.objects.get(id=int(user_id)) - if isinstance(INIT_PASSWD, FunctionType): - new_password = INIT_PASSWD() - else: - new_password = INIT_PASSWD - user.set_password(new_password) - user.save() - - if IS_EMAIL_CONFIGURED: - if SEND_EMAIL_ON_RESETTING_USER_PASSWD: - try: - send_user_reset_email(request, user.email, new_password) - msg = _('Successfully resetted password to %(passwd)s, an email has been sent to %(user)s.') % \ - {'passwd': new_password, 'user': user.email} - messages.success(request, msg) - except Exception, e: - logger.error(str(e)) - msg = _('Successfully resetted password to %(passwd)s, but failed to send email to %(user)s, please check your email configuration.') % \ - {'passwd':new_password, 'user': user.email} - messages.success(request, msg) - else: - messages.success(request, _(u'Successfully resetted password to %(passwd)s for user %(user)s.') % \ - {'passwd':new_password,'user': user.email}) - else: - messages.success(request, _(u'Successfully resetted password to %(passwd)s for user %(user)s. But email notification can not be sent, because Email service is not properly configured.') % \ - {'passwd':new_password,'user': user.email}) - except User.DoesNotExist: - msg = _(u'Failed to reset password: user does not exist') - messages.error(request, msg) - - return HttpResponseRedirect(reverse('sys_useradmin')) - -def send_user_add_mail(request, email, password): - """Send email when add new user.""" - - use_https = request.is_secure() - domain = RequestSite(request).domain - - t = loader.get_template('user_add_email.html') - c = { - 'user': request.user.username, - 'org': request.user.org, - 'email': email, - 'password': password, - 'domain': domain, - 'protocol': use_https and 'https' or 'http', - 'site_name': settings.SITE_NAME, - } - send_mail(_(u'Seafile Registration Information'), t.render(Context(c)), - None, [email], fail_silently=False) - -@login_required -def user_add(request): - """Add a user""" - - if not request.user.is_staff and not request.user.org['is_staff']: - raise Http404 - - base_template = 'org_admin_base.html' if request.user.org else 'admin_base.html' - - content_type = 'application/json; charset=utf-8' - if request.method == 'POST': - form = AddUserForm(request.POST) - if form.is_valid(): - email = form.cleaned_data['email'] - password = form.cleaned_data['password1'] - - user = User.objects.create_user(email, password, is_staff=False, - is_active=True) - - if request.user.org: - org_id = request.user.org['org_id'] - url_prefix = request.user.org['url_prefix'] - ccnet_threaded_rpc.add_org_user(org_id, email, 0) - if hasattr(settings, 'EMAIL_HOST'): - send_user_add_mail(request, email, password) - - return HttpResponseRedirect(reverse('org_useradmin', - args=[url_prefix])) - else: - if IS_EMAIL_CONFIGURED: - if SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER: - try: - send_user_add_mail(request, email, password) - messages.success(request, _(u'Successfully added user %s. An email notification has been sent.') % email) - except Exception, e: - logger.error(str(e)) - messages.success(request, _(u'Successfully added user %s. An error accurs when sending email notification, please check your email configuration.') % email) - else: - messages.success(request, _(u'Successfully added user %s.') % email) - else: - messages.success(request, _(u'Successfully added user %s. But email notification can not be sent, because Email service is not properly configured.') % email) - - return HttpResponse(json.dumps({'success': True}), content_type=content_type) - else: - return HttpResponse(json.dumps({'err': str(form.errors)}), status=400, content_type=content_type) - -@login_required -@sys_staff_required -def sys_group_admin(request): - # 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 = ccnet_threaded_rpc.get_all_groups(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('sys_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)) - -@login_required -@sys_staff_required -def sys_org_admin(request): - try: - orgs = ccnet_threaded_rpc.get_all_orgs(0, MAX_INT) - except: - orgs = [] - - return render_to_response('sys_org_admin.html', { - 'orgs': orgs, - }, context_instance=RequestContext(request)) - -@login_required -@sys_staff_required -def org_remove(request, org_id): - try: - org_id_int = int(org_id) - except ValueError: - return HttpResponseRedirect(reverse('sys_org_admin')) - - # Remove repos in that org - seafserv_threaded_rpc.remove_org_repo_by_org_id(org_id_int) - - # TODO: Remove repos in org's groups - - ccnet_threaded_rpc.remove_org(org_id_int) - - return HttpResponseRedirect(reverse('sys_org_admin')) @login_required def file_upload_progress_page(request): diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py new file mode 100644 index 0000000000..ffb4306927 --- /dev/null +++ b/seahub/views/sysadmin.py @@ -0,0 +1,382 @@ +# encoding: utf-8 + +from types import FunctionType +import logging +import simplejson as json + +from django.core.urlresolvers import reverse +from django.core.mail import send_mail +from django.contrib import messages +from django.http import HttpResponse, HttpResponseBadRequest, Http404, \ + HttpResponseRedirect +from django.shortcuts import render_to_response, redirect +from django.template import Context, loader, RequestContext +from django.template.loader import render_to_string +from django.utils.translation import ugettext as _ +from django.contrib.sites.models import Site, RequestSite +from django.core.mail import send_mail + + +import seaserv +from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_emailusers, \ + MAX_DOWNLOAD_DIR_SIZE, CALC_SHARE_USAGE, \ + send_message +from seaserv import seafile_api +from pysearpc import SearpcError + +from seahub.base.accounts import User +from seahub.base.decorators import sys_staff_required +from seahub.auth.decorators import login_required +from seahub.utils import IS_EMAIL_CONFIGURED +from seahub.forms import SetUserQuotaForm, AddUserForm +from seahub.profile.models import Profile + +import seahub.settings as settings +from seahub.settings import INIT_PASSWD, \ + SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER, SEND_EMAIL_ON_RESETTING_USER_PASSWD + +logger = logging.getLogger(__name__) + +@login_required +@sys_staff_required +def sys_repo_admin(request): + # 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 = seafile_api.get_repo_list(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 + + for repo in repos: + try: + repo.owner = seafile_api.get_repo_owner(repo.id) + except: + repo.owner = "failed to get" + + return render_to_response( + 'sysadmin/sys_repo_admin.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)) + + +@login_required +@sys_staff_required +def sys_user_admin(request): + # 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 + users_plus_one = get_emailusers(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 + try: + user.self_usage = seafile_api.get_user_self_usage(user.email) + user.share_usage = seafile_api.get_user_share_usage(user.email) + user.quota = seafile_api.get_user_quota(user.email) + except: + user.self_usage = -1 + user.share_usage = -1 + user.quota = -1 + + return render_to_response( + 'sysadmin/sys_useradmin.html', { + 'users': users, + '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 +@sys_staff_required +def user_info(request, email): + if request.method == 'POST': + result = {} + content_type = 'application/json; charset=utf-8' + + f = SetUserQuotaForm(request.POST) + if f.is_valid(): + email = f.cleaned_data['email'] + quota_mb = f.cleaned_data['quota'] + quota = quota_mb * (1 << 20) + + try: + seafile_api.set_user_quota(email, quota) + except: + result['error'] = _(u'Failed to set quota: internal error') + return HttpResponse(json.dumps(result), content_type=content_type) + + result['success'] = True + return HttpResponse(json.dumps(result), content_type=content_type) + else: + result['error'] = str(f.errors.values()[0]) + return HttpResponse(json.dumps(result), content_type=content_type) + + owned_repos = [] + + owned_repos = seafile_api.get_owned_repo_list(email) + + quota = seafile_api.get_user_quota(email) + quota_usage = 0 + share_usage = 0 + my_usage = 0 + my_usage = seafile_api.get_user_self_usage(email) + if CALC_SHARE_USAGE: + try: + share_usage = seafile_api.get_user_share_usage(email) + except SearpcError, e: + share_usage = 0 + quota_usage = my_usage + share_usage + else: + quota_usage = my_usage + + # Repos that are share to user + in_repos = seafile_api.get_share_in_repo_list(email, -1, -1) + + # get nickname + if not Profile.objects.filter(user=email): + nickname = '' + else: + profile = Profile.objects.filter(user=email)[0] + nickname = profile.nickname + + return render_to_response( + 'sysadmin/userinfo.html', { + 'owned_repos': owned_repos, + 'quota': quota, + 'quota_usage': quota_usage, + 'CALC_SHARE_USAGE': CALC_SHARE_USAGE, + 'share_usage': share_usage, + 'my_usage': my_usage, + 'in_repos': in_repos, + 'email': email, + 'nickname': nickname, + }, context_instance=RequestContext(request)) + +@login_required +@sys_staff_required +def user_remove(request, user_id): + """Remove user, also remove group relationship.""" + try: + user = User.objects.get(id=int(user_id)) + user.delete() + messages.success(request, _(u'Successfully deleted %s') % user.username) + except User.DoesNotExist: + messages.error(request, _(u'Failed to delete: the user does not exist')) + + return HttpResponseRedirect(request.META["HTTP_REFERER"]) + +@login_required +@sys_staff_required +def user_make_admin(request, user_id): + """Set user as system admin.""" + try: + user = User.objects.get(id=int(user_id)) + user.is_staff = True + user.save() + messages.success(request, _(u'Successfully set %s as admin') % user.username) + except User.DoesNotExist: + messages.error(request, _(u'Failed to set admin: the user does not exist')) + + return HttpResponseRedirect(request.META["HTTP_REFERER"]) + +@login_required +@sys_staff_required +def user_remove_admin(request, user_id): + """Unset user admin.""" + try: + user = User.objects.get(id=int(user_id)) + user.is_staff = False + user.save() + messages.success(request, _(u'Successfully revoke the admin permission of %s') % user.username) + except User.DoesNotExist: + messages.error(request, _(u'Failed to revoke admin: the user does not exist')) + + return HttpResponseRedirect(request.META["HTTP_REFERER"]) + +@login_required +@sys_staff_required +def user_activate(request, user_id): + try: + user = User.objects.get(id=int(user_id)) + user.is_active = True + user.save() + except User.DoesNotExist: + pass + + return HttpResponseRedirect(reverse('sys_useradmin')) + +def send_user_reset_email(request, email, password): + """ + Send email when reset user password. + """ + use_https = request.is_secure() + domain = RequestSite(request).domain + + t = loader.get_template('sysadmin/user_reset_email.html') + c = { + 'email': email, + 'password': password, + 'site_name': settings.SITE_NAME, + } + send_mail(_(u'Password Reset'), t.render(Context(c)), + None, [email], fail_silently=False) + +@login_required +@sys_staff_required +def user_reset(request, user_id): + """Reset password for user.""" + try: + user = User.objects.get(id=int(user_id)) + if isinstance(INIT_PASSWD, FunctionType): + new_password = INIT_PASSWD() + else: + new_password = INIT_PASSWD + user.set_password(new_password) + user.save() + + if IS_EMAIL_CONFIGURED: + if SEND_EMAIL_ON_RESETTING_USER_PASSWD: + try: + send_user_reset_email(request, user.email, new_password) + msg = _('Successfully reset password to %(passwd)s, an email has been sent to %(user)s.') % \ + {'passwd': new_password, 'user': user.email} + messages.success(request, msg) + except Exception, e: + logger.error(str(e)) + msg = _('Successfully reset password to %(passwd)s, but failed to send email to %(user)s, please check your email configuration.') % \ + {'passwd':new_password, 'user': user.email} + messages.success(request, msg) + else: + messages.success(request, _(u'Successfully reset password to %(passwd)s for user %(user)s.') % \ + {'passwd':new_password,'user': user.email}) + else: + messages.success(request, _(u'Successfully reset password to %(passwd)s for user %(user)s. But email notification can not be sent, because Email service is not properly configured.') % \ + {'passwd':new_password,'user': user.email}) + except User.DoesNotExist: + msg = _(u'Failed to reset password: user does not exist') + messages.error(request, msg) + + return HttpResponseRedirect(reverse('sys_useradmin')) + +def send_user_add_mail(request, email, password): + """Send email when add new user.""" + + use_https = request.is_secure() + domain = RequestSite(request).domain + + t = loader.get_template('sysadmin/user_add_email.html') + c = { + 'user': request.user.username, + 'org': request.user.org, + 'email': email, + 'password': password, + 'domain': domain, + 'protocol': use_https and 'https' or 'http', + 'site_name': settings.SITE_NAME, + } + send_mail(_(u'Seafile Registration Information'), t.render(Context(c)), + None, [email], fail_silently=False) + +@login_required +def user_add(request): + """Add a user""" + + if not request.user.is_staff and not request.user.org['is_staff']: + raise Http404 + + base_template = 'org_admin_base.html' if request.user.org else 'admin_base.html' + + content_type = 'application/json; charset=utf-8' + if request.method == 'POST': + form = AddUserForm(request.POST) + if form.is_valid(): + email = form.cleaned_data['email'] + password = form.cleaned_data['password1'] + + user = User.objects.create_user(email, password, is_staff=False, + is_active=True) + if request.user.org: + org_id = request.user.org['org_id'] + url_prefix = request.user.org['url_prefix'] + ccnet_threaded_rpc.add_org_user(org_id, email, 0) + if hasattr(settings, 'EMAIL_HOST'): + send_user_add_mail(request, email, password) + + return HttpResponseRedirect(reverse('org_useradmin', + args=[url_prefix])) + else: + if IS_EMAIL_CONFIGURED: + if SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER: + try: + send_user_add_mail(request, email, password) + messages.success(request, _(u'Successfully added user %s. An email notification has been sent.') % email) + except Exception, e: + logger.error(str(e)) + messages.success(request, _(u'Successfully added user %s. An error accurs when sending email notification, please check your email configuration.') % email) + else: + messages.success(request, _(u'Successfully added user %s.') % email) + else: + messages.success(request, _(u'Successfully added user %s. But email notification can not be sent, because Email service is not properly configured.') % email) + + return HttpResponse(json.dumps({'success': True}), content_type=content_type) + else: + return HttpResponse(json.dumps({'err': str(form.errors)}), status=400, content_type=content_type) + +@login_required +@sys_staff_required +def sys_group_admin(request): + # 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 = ccnet_threaded_rpc.get_all_groups(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('sysadmin/sys_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)) +