2013-05-17 13:41:37 +08:00
# encoding: utf-8
2013-05-25 11:40:40 +08:00
import os
2013-05-17 13:41:37 +08:00
from types import FunctionType
import logging
2014-07-09 14:00:39 +02:00
import json
2014-02-26 18:24:34 +08:00
import re
import datetime
2014-05-09 17:12:25 +08:00
import csv , chardet , StringIO
2013-05-17 13:41:37 +08:00
from django . core . urlresolvers import reverse
from django . contrib import messages
2013-07-30 11:35:02 +08:00
from django . http import HttpResponse , Http404 , HttpResponseRedirect
from django . shortcuts import render_to_response
2014-02-28 17:09:01 +08:00
from django . template import RequestContext
2013-05-17 13:41:37 +08:00
from django . utils . translation import ugettext as _
2014-03-05 14:10:05 +08:00
from seaserv import ccnet_threaded_rpc , seafserv_threaded_rpc , get_emailusers , \
CALC_SHARE_USAGE , seafile_api
2013-05-17 13:41:37 +08:00
from pysearpc import SearpcError
from seahub . base . accounts import User
2013-11-21 15:05:08 +08:00
from seahub . base . models import UserLastLogin
2013-05-17 13:41:37 +08:00
from seahub . base . decorators import sys_staff_required
2014-07-01 15:21:49 +08:00
from seahub . auth . decorators import login_required , login_required_ajax
2014-07-14 17:48:05 +08:00
from seahub . constants import GUEST_USER , DEFAULT_USER
2014-05-16 17:43:36 +08:00
from seahub . utils import IS_EMAIL_CONFIGURED , string2list , is_valid_username
2013-12-17 12:14:58 +08:00
from seahub . views import get_system_default_repo_id
2014-05-16 17:43:36 +08:00
from seahub . forms import SetUserQuotaForm , AddUserForm , BatchAddUserForm
2013-12-18 13:56:20 +08:00
from seahub . profile . models import Profile , DetailedProfile
2013-07-30 11:35:02 +08:00
from seahub . share . models import FileShare
2013-05-17 13:41:37 +08:00
import seahub . settings as settings
2014-02-19 20:03:55 +08:00
from seahub . settings import INIT_PASSWD , SITE_NAME , \
2014-07-14 17:48:05 +08:00
SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER , SEND_EMAIL_ON_RESETTING_USER_PASSWD , \
ENABLE_GUEST
2014-04-18 12:13:43 +08:00
from seahub . utils import send_html_email , get_user_traffic_list , get_server_id
from seahub . utils . sysinfo import get_platform_name
2013-05-17 13:41:37 +08:00
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 ' ) )
2013-07-30 11:35:02 +08:00
per_page = int ( request . GET . get ( ' per_page ' , ' 25 ' ) )
2013-05-17 13:41:37 +08:00
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 ) )
2013-12-17 12:14:58 +08:00
@login_required
@sys_staff_required
def sys_list_orphan ( request ) :
try :
repos = seafile_api . get_orphan_repo_list ( )
except Exception as e :
logger . error ( e )
repos = [ ]
return render_to_response ( ' sysadmin/sys_list_orphan.html ' , {
' repos ' : repos ,
} , context_instance = RequestContext ( request ) )
@login_required
@sys_staff_required
def sys_list_system ( request ) :
""" List system repos.
"""
repos = [ ]
sys_repo = seafile_api . get_repo ( get_system_default_repo_id ( ) )
repos . append ( sys_repo )
return render_to_response ( ' sysadmin/sys_list_system.html ' , {
' repos ' : repos ,
} , context_instance = RequestContext ( request ) )
2013-05-17 13:41:37 +08:00
2013-09-23 15:57:54 +08:00
def list_repos_by_name_and_owner ( repo_name , owner ) :
repos = [ ]
owned_repos = seafile_api . get_owned_repo_list ( owner )
for repo in owned_repos :
2013-09-28 16:50:34 +08:00
if repo_name in repo . name :
2013-09-23 15:57:54 +08:00
repo . owner = owner
repos . append ( repo )
return repos
def list_repos_by_name ( repo_name ) :
repos = [ ]
repos_all = seafile_api . get_repo_list ( - 1 , - 1 )
for repo in repos_all :
2013-09-28 16:50:34 +08:00
if repo_name in repo . name :
2013-09-23 15:57:54 +08:00
try :
repo . owner = seafile_api . get_repo_owner ( repo . id )
except SearpcError :
repo . owner = " failed to get "
repos . append ( repo )
return repos
def list_repos_by_owner ( owner ) :
repos = seafile_api . get_owned_repo_list ( owner )
for e in repos :
e . owner = owner
return repos
@login_required
@sys_staff_required
def sys_repo_search ( request ) :
""" Search a repo.
"""
repo_name = request . GET . get ( ' name ' , ' ' )
owner = request . GET . get ( ' owner ' , ' ' )
repos = [ ]
2013-09-28 16:50:34 +08:00
if repo_name and owner : # search by name and owner
repos = list_repos_by_name_and_owner ( repo_name , owner )
elif repo_name : # search by name
repos = list_repos_by_name ( repo_name )
elif owner : # search by owner
repos = list_repos_by_owner ( owner )
2013-09-23 15:57:54 +08:00
return render_to_response ( ' sysadmin/sys_repo_search.html ' , {
' repos ' : repos ,
' name ' : repo_name ,
' owner ' : owner ,
} , context_instance = RequestContext ( request ) )
2013-05-17 13:41:37 +08:00
@login_required
@sys_staff_required
def sys_user_admin ( request ) :
2013-11-21 11:47:53 +08:00
""" List all users from database.
"""
2013-05-17 13:41:37 +08:00
# Make sure page request is an int. If not, deliver first page.
try :
current_page = int ( request . GET . get ( ' page ' , ' 1 ' ) )
2013-07-30 11:35:02 +08:00
per_page = int ( request . GET . get ( ' per_page ' , ' 25 ' ) )
2013-05-17 13:41:37 +08:00
except ValueError :
current_page = 1
per_page = 25
2013-11-21 11:47:53 +08:00
users_plus_one = get_emailusers ( ' DB ' , per_page * ( current_page - 1 ) , per_page + 1 )
2013-05-17 13:41:37 +08:00
if len ( users_plus_one ) == per_page + 1 :
page_next = True
else :
page_next = False
users = users_plus_one [ : per_page ]
2013-11-21 15:05:08 +08:00
last_logins = UserLastLogin . objects . filter ( username__in = [ x . email for x in users ] )
2013-05-17 13:41:37 +08:00
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
2014-07-14 17:48:05 +08:00
# check user's role
if user . role == GUEST_USER :
user . is_guest = True
else :
user . is_guest = False
2013-11-21 15:05:08 +08:00
# populate user last login time
user . last_login = None
for last_login in last_logins :
if last_login . username == user . email :
user . last_login = last_login . last_login
2013-11-21 11:47:53 +08:00
have_ldap = True if len ( get_emailusers ( ' LDAP ' , 0 , 1 ) ) > 0 else False
2014-04-17 18:33:12 +08:00
platform = get_platform_name ( )
2014-04-18 12:13:43 +08:00
server_id = get_server_id ( )
2014-04-17 18:33:12 +08:00
2013-05-17 13:41:37 +08:00
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 ,
2013-05-25 15:01:34 +08:00
' CALC_SHARE_USAGE ' : CALC_SHARE_USAGE ,
2013-11-21 11:47:53 +08:00
' have_ldap ' : have_ldap ,
2014-04-17 18:33:12 +08:00
' platform ' : platform ,
2014-04-18 14:19:58 +08:00
' server_id ' : server_id [ : 8 ] ,
2014-07-14 17:48:05 +08:00
' default_user ' : DEFAULT_USER ,
' guest_user ' : GUEST_USER ,
' enable_guest ' : ENABLE_GUEST ,
} , context_instance = RequestContext ( request ) )
2013-11-21 11:47:53 +08:00
@login_required
@sys_staff_required
2014-04-16 17:39:23 +08:00
def sys_user_admin_ldap ( request ) :
2013-11-21 11:47:53 +08:00
""" List all users from LDAP.
"""
# 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 ( ' LDAP ' , 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 ]
2013-11-21 15:05:08 +08:00
last_logins = UserLastLogin . objects . filter ( username__in = [ x . email for x in users ] )
2013-11-21 11:47:53 +08:00
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
2013-11-21 15:05:08 +08:00
# populate user last login time
user . last_login = None
for last_login in last_logins :
if last_login . username == user . email :
user . last_login = last_login . last_login
2013-11-21 11:47:53 +08:00
return render_to_response (
2014-04-16 17:39:23 +08:00
' sysadmin/sys_useradmin_ldap.html ' , {
2013-11-21 11:47:53 +08:00
' users ' : users ,
' current_page ' : current_page ,
' prev_page ' : current_page - 1 ,
' next_page ' : current_page + 1 ,
' per_page ' : per_page ,
' page_next ' : page_next ,
' CALC_SHARE_USAGE ' : CALC_SHARE_USAGE ,
2013-05-17 13:41:37 +08:00
} ,
context_instance = RequestContext ( request ) )
2014-04-16 17:39:23 +08:00
@login_required
@sys_staff_required
def sys_user_admin_admins ( request ) :
""" List all admins from database.
"""
users = get_emailusers ( ' DB ' , - 1 , - 1 )
admin_users = [ ]
not_admin_users = [ ]
for user in users :
if user . is_staff is True :
admin_users . append ( user )
else :
not_admin_users . append ( user )
last_logins = UserLastLogin . objects . filter ( username__in = [ x . email for x in admin_users ] )
for user in admin_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
2014-07-14 17:48:05 +08:00
# check user's role
if user . role == GUEST_USER :
user . is_guest = True
else :
user . is_guest = False
2014-04-16 17:39:23 +08:00
# populate user last login time
user . last_login = None
for last_login in last_logins :
if last_login . username == user . email :
user . last_login = last_login . last_login
have_ldap = True if len ( get_emailusers ( ' LDAP ' , 0 , 1 ) ) > 0 else False
return render_to_response (
' sysadmin/sys_useradmin_admins.html ' , {
' admin_users ' : admin_users ,
' not_admin_users ' : not_admin_users ,
' CALC_SHARE_USAGE ' : CALC_SHARE_USAGE ,
' have_ldap ' : have_ldap ,
2014-07-14 17:48:05 +08:00
' default_user ' : DEFAULT_USER ,
' guest_user ' : GUEST_USER ,
} , context_instance = RequestContext ( request ) )
2014-04-16 17:39:23 +08:00
2013-05-17 13:41:37 +08:00
@login_required
@sys_staff_required
def user_info ( request , email ) :
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 :
2013-07-30 11:35:02 +08:00
logger . error ( e )
2013-05-17 13:41:37 +08:00
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 )
2013-12-18 13:56:20 +08:00
# get user profile
profile = Profile . objects . get_profile_by_user ( email )
d_profile = DetailedProfile . objects . get_detailed_profile_by_user ( email )
2013-05-17 13:41:37 +08:00
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 ,
2013-12-18 13:56:20 +08:00
' profile ' : profile ,
' d_profile ' : d_profile ,
2013-05-17 13:41:37 +08:00
} , context_instance = RequestContext ( request ) )
2014-07-01 15:21:49 +08:00
@login_required_ajax
2013-11-21 11:23:43 +08:00
@sys_staff_required
def user_set_quota ( request , email ) :
2014-07-01 15:21:49 +08:00
if request . method != ' POST ' :
2013-11-21 11:23:43 +08:00
raise Http404
content_type = ' application/json; charset=utf-8 '
result = { }
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 :
2014-07-01 15:21:49 +08:00
result [ ' error ' ] = _ ( u ' Failed to set quota: internal server error ' )
2013-11-21 11:23:43 +08:00
return HttpResponse ( json . dumps ( result ) , status = 500 , 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 ) , status = 400 , content_type = content_type )
2013-05-17 13:41:37 +08:00
@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 ' ) )
2013-12-21 14:11:07 +08:00
referer = request . META . get ( ' HTTP_REFERER ' , None )
next = reverse ( ' sys_useradmin ' ) if referer is None else referer
return HttpResponseRedirect ( next )
2013-05-17 13:41:37 +08:00
@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 ' ) )
2013-12-21 14:11:07 +08:00
referer = request . META . get ( ' HTTP_REFERER ' , None )
next = reverse ( ' sys_useradmin ' ) if referer is None else referer
return HttpResponseRedirect ( next )
2013-05-17 13:41:37 +08:00
@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 ' ) )
2013-12-21 14:11:07 +08:00
referer = request . META . get ( ' HTTP_REFERER ' , None )
next = reverse ( ' sys_useradmin ' ) if referer is None else referer
return HttpResponseRedirect ( next )
2013-05-17 13:41:37 +08:00
@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 ( )
2013-07-18 16:52:23 +08:00
messages . success ( request , _ ( u ' Successfully activated " %s " . ' ) % user . email )
2013-05-17 13:41:37 +08:00
except User . DoesNotExist :
2013-07-18 16:52:23 +08:00
messages . success ( request , _ ( u ' Failed to activate: user does not exist. ' ) )
2013-05-17 13:41:37 +08:00
2013-07-18 16:52:23 +08:00
next = request . META . get ( ' HTTP_REFERER ' , None )
if not next :
next = reverse ( ' sys_useradmin ' )
return HttpResponseRedirect ( next )
2013-05-17 13:41:37 +08:00
2013-10-15 17:41:02 +08:00
@login_required
@sys_staff_required
def user_deactivate ( request , user_id ) :
try :
user = User . objects . get ( id = int ( user_id ) )
user . is_active = False
user . save ( )
messages . success ( request , _ ( u ' Successfully deactivated " %s " . ' ) % user . email )
except User . DoesNotExist :
messages . success ( request , _ ( u ' Failed to deactivate: user does not exist. ' ) )
next = request . META . get ( ' HTTP_REFERER ' , None )
if not next :
next = reverse ( ' sys_useradmin ' )
return HttpResponseRedirect ( next )
2013-10-17 18:20:44 +08:00
def email_user_on_activation ( user ) :
""" Send an email to user when admin activate his/her account.
"""
2014-02-18 20:16:39 +08:00
c = {
' username ' : user . email ,
}
2014-02-19 20:03:55 +08:00
send_html_email ( _ ( u ' Your account on %s is activated ' ) % SITE_NAME ,
' sysadmin/user_activation_email.html ' , c , None , [ user . email ] )
2014-07-18 11:52:59 +08:00
2014-07-01 15:21:49 +08:00
@login_required_ajax
2013-10-15 17:41:02 +08:00
@sys_staff_required
2014-07-18 11:52:59 +08:00
def user_toggle_status ( request , email ) :
2013-10-15 17:41:02 +08:00
content_type = ' application/json; charset=utf-8 '
2014-07-18 11:52:59 +08:00
if not is_valid_username ( email ) :
return HttpResponse ( json . dumps ( { ' success ' : False } ) , status = 400 ,
content_type = content_type )
2013-10-15 17:41:02 +08:00
try :
user_status = int ( request . GET . get ( ' s ' , 0 ) )
except ValueError :
user_status = 0
try :
2014-07-18 11:52:59 +08:00
user = User . objects . get ( email )
2013-10-15 17:41:02 +08:00
user . is_active = bool ( user_status )
user . save ( )
2013-10-17 18:20:44 +08:00
if user . is_active is True :
try :
email_user_on_activation ( user )
email_sent = True
except Exception as e :
logger . error ( e )
email_sent = False
return HttpResponse ( json . dumps ( { ' success ' : True ,
' email_sent ' : email_sent ,
} ) , content_type = content_type )
2013-10-15 17:41:02 +08:00
return HttpResponse ( json . dumps ( { ' success ' : True } ) ,
2013-10-17 18:20:44 +08:00
content_type = content_type )
2013-10-15 17:41:02 +08:00
except User . DoesNotExist :
return HttpResponse ( json . dumps ( { ' success ' : False } ) , status = 500 ,
content_type = content_type )
2014-07-07 16:05:14 +08:00
@login_required_ajax
@sys_staff_required
2014-07-14 17:48:05 +08:00
def user_toggle_role ( request , email ) :
2014-07-07 16:05:14 +08:00
content_type = ' application/json; charset=utf-8 '
2014-07-14 17:48:05 +08:00
if not is_valid_username ( email ) :
return HttpResponse ( json . dumps ( { ' success ' : False } ) , status = 400 ,
content_type = content_type )
if not ENABLE_GUEST :
return HttpResponse ( json . dumps ( { ' success ' : False } ) , status = 403 ,
content_type = content_type )
2014-07-07 16:05:14 +08:00
try :
user_role = request . GET . get ( ' r ' , DEFAULT_USER )
except ValueError :
user_role = DEFAULT_USER
try :
2014-07-14 17:48:05 +08:00
user = User . objects . get ( email )
2014-07-07 16:05:14 +08:00
User . objects . update_role ( user . email , user_role )
return HttpResponse ( json . dumps ( { ' success ' : True } ) ,
content_type = content_type )
except User . DoesNotExist :
return HttpResponse ( json . dumps ( { ' success ' : False } ) , status = 500 ,
content_type = content_type )
2013-05-17 13:41:37 +08:00
def send_user_reset_email ( request , email , password ) :
"""
Send email when reset user password .
"""
2014-02-17 19:43:16 +08:00
2013-05-17 13:41:37 +08:00
c = {
' email ' : email ,
' password ' : password ,
}
2014-02-19 20:03:55 +08:00
send_html_email ( _ ( u ' Password has been reset on %s ' ) % SITE_NAME ,
' sysadmin/user_reset_email.html ' , c , None , [ email ] )
2013-05-17 13:41:37 +08:00
@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 )
2014-03-01 13:49:22 +08:00
referer = request . META . get ( ' HTTP_REFERER ' , None )
next = reverse ( ' sys_useradmin ' ) if referer is None else referer
return HttpResponseRedirect ( next )
2013-05-17 13:41:37 +08:00
def send_user_add_mail ( request , email , password ) :
""" Send email when add new user. """
c = {
' user ' : request . user . username ,
' org ' : request . user . org ,
' email ' : email ,
' password ' : password ,
}
2014-02-19 20:03:55 +08:00
send_html_email ( _ ( u ' You are invited to join %s ' ) % SITE_NAME ,
' sysadmin/user_add_email.html ' , c , None , [ email ] )
2013-05-17 13:41:37 +08:00
2014-07-01 15:21:49 +08:00
@login_required_ajax
2013-05-17 13:41:37 +08:00
def user_add ( request ) :
""" Add a user """
2014-07-01 15:21:49 +08:00
if not request . user . is_staff or request . method != ' POST ' :
2013-05-17 13:41:37 +08:00
raise Http404
content_type = ' application/json; charset=utf-8 '
2014-07-01 15:21:49 +08:00
post_values = request . POST . copy ( )
post_email = request . POST . get ( ' email ' , ' ' )
2014-07-23 15:57:25 +08:00
post_role = request . POST . get ( ' role ' , DEFAULT_USER )
2014-07-07 16:05:14 +08:00
post_values . update ( {
' email ' : post_email . lower ( ) ,
' role ' : post_role ,
} )
2014-07-01 15:21:49 +08:00
form = AddUserForm ( post_values )
if form . is_valid ( ) :
email = form . cleaned_data [ ' email ' ]
2014-07-07 16:05:14 +08:00
role = form . cleaned_data [ ' role ' ]
2014-07-01 15:21:49 +08:00
password = form . cleaned_data [ ' password1 ' ]
user = User . objects . create_user ( email , password , is_staff = False ,
is_active = True )
2014-07-07 16:05:14 +08:00
if user :
User . objects . update_role ( email , role )
2014-07-01 15:21:49 +08:00
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 IS_EMAIL_CONFIGURED :
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 )
return HttpResponse ( json . dumps ( { ' success ' : True } ) , content_type = content_type )
else :
if IS_EMAIL_CONFIGURED :
if SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER :
2014-03-05 14:10:05 +08:00
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 )
2013-05-17 13:41:37 +08:00
else :
2014-07-01 15:21:49 +08:00
messages . success ( request , _ ( u ' Successfully added user %s . But email notification can not be sent, because Email service is not properly configured. ' ) % email )
2013-05-17 13:41:37 +08:00
2014-07-01 15:21:49 +08:00
return HttpResponse ( json . dumps ( { ' success ' : True } ) , content_type = content_type )
else :
2014-07-09 17:51:07 +08:00
return HttpResponse ( json . dumps ( { ' error ' : str ( form . errors . values ( ) [ 0 ] ) } ) , status = 400 , content_type = content_type )
2013-05-17 13:41:37 +08:00
@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 ' ) )
2013-07-30 11:35:02 +08:00
per_page = int ( request . GET . get ( ' per_page ' , ' 25 ' ) )
2013-05-17 13:41:37 +08:00
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 ) )
2014-03-05 14:10:05 +08:00
@login_required
@sys_staff_required
def sys_org_admin ( request ) :
orgs = ccnet_threaded_rpc . get_all_orgs ( - 1 , - 1 )
return render_to_response ( ' sysadmin/sys_org_admin.html ' , {
' orgs ' : orgs ,
} , context_instance = RequestContext ( request ) )
@login_required
@sys_staff_required
def sys_org_info ( request , org_id ) :
org_id = int ( org_id )
org = ccnet_threaded_rpc . get_org_by_id ( org_id )
2014-03-26 15:17:15 +08:00
users = ccnet_threaded_rpc . get_org_emailusers ( org . url_prefix , - 1 , - 1 )
users_count = len ( users )
2014-03-05 14:10:05 +08:00
# quota
total_quota = seafserv_threaded_rpc . get_org_quota ( org_id )
quota_usage = seafserv_threaded_rpc . get_org_quota_usage ( org_id )
2014-03-26 15:17:15 +08:00
# groups
groups = ccnet_threaded_rpc . get_org_groups ( org_id , - 1 , - 1 )
groups_count = len ( groups )
2014-03-05 14:10:05 +08:00
return render_to_response ( ' sysadmin/sys_org_info.html ' , {
' org ' : org ,
2014-03-26 15:17:15 +08:00
' users ' : users ,
2014-03-05 14:10:05 +08:00
' users_count ' : users_count ,
' total_quota ' : total_quota ,
' quota_usage ' : quota_usage ,
2014-03-26 15:17:15 +08:00
' groups ' : groups ,
' groups_count ' : groups_count ,
2014-03-05 14:10:05 +08:00
} , context_instance = RequestContext ( request ) )
2013-05-25 11:40:40 +08:00
@login_required
@sys_staff_required
def sys_publink_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 ' , ' 100 ' ) )
except ValueError :
current_page = 1
per_page = 100
2013-08-14 11:45:41 +08:00
offset = per_page * ( current_page - 1 )
limit = per_page + 1
publinks = FileShare . objects . all ( ) [ offset : offset + limit ]
2013-08-09 17:35:08 +08:00
if len ( publinks ) == per_page + 1 :
page_next = True
else :
page_next = False
2013-05-25 11:40:40 +08:00
for l in publinks :
2014-03-05 14:10:05 +08:00
if l . is_file_share_link ( ) :
2013-05-25 11:40:40 +08:00
l . name = os . path . basename ( l . path )
else :
l . name = os . path . dirname ( l . path )
return render_to_response (
' sysadmin/sys_publink_admin.html ' , {
' publinks ' : publinks ,
' current_page ' : current_page ,
' prev_page ' : current_page - 1 ,
' next_page ' : current_page + 1 ,
' per_page ' : per_page ,
2013-08-09 17:35:08 +08:00
' page_next ' : page_next ,
2013-05-25 11:40:40 +08:00
} ,
context_instance = RequestContext ( request ) )
2013-09-07 11:44:21 +08:00
@login_required
@sys_staff_required
def user_search ( request ) :
""" Search a user.
"""
email = request . GET . get ( ' email ' , ' ' )
email_patt = email . replace ( ' * ' , ' % ' )
2013-11-21 15:05:08 +08:00
users = ccnet_threaded_rpc . search_emailusers ( email_patt , - 1 , - 1 )
last_logins = UserLastLogin . objects . filter ( username__in = [ x . email for x in users ] )
for user in users :
2014-04-16 17:39:23 +08:00
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
2014-07-23 15:57:25 +08:00
# check user's role
if user . role == GUEST_USER :
user . is_guest = True
else :
user . is_guest = False
2013-11-21 15:05:08 +08:00
# populate user last login time
user . last_login = None
for last_login in last_logins :
if last_login . username == user . email :
user . last_login = last_login . last_login
2013-09-07 11:44:21 +08:00
return render_to_response ( ' sysadmin/user_search.html ' , {
' users ' : users ,
' email ' : email ,
2014-07-23 15:57:25 +08:00
' default_user ' : DEFAULT_USER ,
' guest_user ' : GUEST_USER ,
' enable_guest ' : ENABLE_GUEST ,
2013-09-07 11:44:21 +08:00
} , context_instance = RequestContext ( request ) )
2013-09-23 16:58:33 +08:00
@login_required
@sys_staff_required
def sys_repo_transfer ( request ) :
""" Transfer a repo to others.
"""
if request . method != ' POST ' :
raise Http404
repo_id = request . POST . get ( ' repo_id ' , None )
new_owner = request . POST . get ( ' email ' , None )
if repo_id and new_owner :
try :
User . objects . get ( email = new_owner )
seafile_api . set_repo_owner ( repo_id , new_owner )
messages . success ( request , _ ( u ' Successfully transfered. ' ) )
except User . DoesNotExist :
messages . error ( request , _ ( u ' Failed to transfer, user %s not found ' ) % new_owner )
else :
messages . error ( request , _ ( u ' Failed to transfer, invalid arguments. ' ) )
2013-10-17 11:11:08 +08:00
next = request . META . get ( ' HTTP_REFERER ' , None )
if not next :
next = reverse ( sys_repo_admin )
return HttpResponseRedirect ( next )
2013-09-23 16:58:33 +08:00
2014-02-26 18:24:34 +08:00
@login_required
@sys_staff_required
def sys_traffic_admin ( request ) :
""" List all users from database.
"""
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
month = request . GET . get ( ' month ' , ' ' )
if not re . match ( r ' [ \ d] {6} ' , month ) :
month = datetime . datetime . now ( ) . strftime ( ' % Y % m ' )
start = per_page * ( current_page - 1 )
limit = per_page + 1
traffic_info_list = get_user_traffic_list ( month , start , limit )
page_next = len ( traffic_info_list ) == limit
for info in traffic_info_list :
info [ ' total ' ] = info [ ' file_view ' ] + info [ ' file_download ' ] + info [ ' dir_download ' ]
return render_to_response (
' sysadmin/sys_trafficadmin.html ' , {
' traffic_info_list ' : traffic_info_list ,
' month ' : month ,
' 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 ) )
2014-04-03 15:19:09 +08:00
2014-07-01 15:21:49 +08:00
@login_required_ajax
2014-04-03 15:19:09 +08:00
@sys_staff_required
def batch_user_make_admin ( request ) :
2014-04-16 17:39:23 +08:00
""" Batch make users as admins.
"""
2014-07-01 15:21:49 +08:00
if request . method != ' POST ' :
2014-04-16 11:47:53 +08:00
raise Http404
2014-04-03 15:19:09 +08:00
result = { }
content_type = ' application/json; charset=utf-8 '
set_admin_emails = request . POST . get ( ' set_admin_emails ' )
set_admin_emails = string2list ( set_admin_emails )
2014-04-03 17:31:43 +08:00
success = [ ]
failed = [ ]
2014-04-16 11:47:53 +08:00
already_admin = [ ]
if len ( get_emailusers ( ' LDAP ' , 0 , 1 ) ) > 0 :
2014-04-16 17:39:23 +08:00
messages . error ( request , _ ( u ' Using LDAP now, can not add admin. ' ) )
2014-04-16 11:47:53 +08:00
result [ ' success ' ] = True
return HttpResponse ( json . dumps ( result ) , content_type = content_type )
2014-04-03 17:31:43 +08:00
for email in set_admin_emails :
try :
2014-04-03 15:19:09 +08:00
user = User . objects . get ( email = email )
2014-04-16 17:39:23 +08:00
if user . is_staff is True :
2014-04-16 11:47:53 +08:00
already_admin . append ( email )
else :
user . is_staff = True
user . save ( )
success . append ( email )
2014-04-03 17:31:43 +08:00
except User . DoesNotExist :
failed . append ( email )
2014-04-16 17:39:23 +08:00
for item in success + already_admin :
messages . success ( request , _ ( u ' Successfully set %s as admin. ' ) % item )
2014-04-03 17:31:43 +08:00
for item in failed :
2014-04-16 17:39:23 +08:00
messages . error ( request , _ ( u ' Failed to set %s as admin: user does not exist. ' ) % item )
2014-04-03 17:31:43 +08:00
result [ ' success ' ] = True
return HttpResponse ( json . dumps ( result ) , content_type = content_type )
2014-05-09 17:12:25 +08:00
@login_required
@sys_staff_required
def batch_add_user ( request ) :
2014-05-16 17:43:36 +08:00
""" Batch add users. Import users from CSV file.
"""
2014-05-09 17:12:25 +08:00
if request . method != ' POST ' :
raise Http404
2014-05-16 17:43:36 +08:00
form = BatchAddUserForm ( request . POST , request . FILES )
if form . is_valid ( ) :
content = request . FILES [ ' file ' ] . read ( )
2014-05-09 17:12:25 +08:00
encoding = chardet . detect ( content ) [ ' encoding ' ]
if encoding != ' utf-8 ' :
content = content . decode ( encoding , ' replace ' ) . encode ( ' utf-8 ' )
filestream = StringIO . StringIO ( content )
2014-05-16 17:43:36 +08:00
reader = csv . reader ( filestream )
2014-05-09 17:12:25 +08:00
2014-05-16 17:43:36 +08:00
for row in reader :
if not row :
continue
2014-05-09 17:12:25 +08:00
2014-05-16 17:43:36 +08:00
username = row [ 0 ] . strip ( )
password = row [ 1 ] . strip ( )
2014-05-09 17:12:25 +08:00
2014-05-16 17:43:36 +08:00
if not is_valid_username ( username ) :
continue
2014-05-09 17:12:25 +08:00
2014-05-16 17:43:36 +08:00
if password == ' ' :
continue
2014-05-09 17:12:25 +08:00
2014-05-16 17:43:36 +08:00
try :
User . objects . get ( email = username )
continue
except User . DoesNotExist :
User . objects . create_user ( username , password , is_staff = False ,
is_active = True )
2014-06-17 17:08:43 +08:00
messages . success ( request , _ ( ' Import succeeded ' ) )
2014-05-09 17:12:25 +08:00
else :
messages . error ( request , _ ( u ' Please select a csv file first. ' ) )
2014-05-16 17:43:36 +08:00
next = request . META . get ( ' HTTP_REFERER ' , reverse ( sys_user_admin ) )
2014-05-09 17:12:25 +08:00
return HttpResponseRedirect ( next )