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
import simplejson as json
2014-02-26 18:24:34 +08:00
import re
import datetime
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 _
import seaserv
2013-07-30 11:35:02 +08:00
from seaserv import ccnet_threaded_rpc , get_emailusers , CALC_SHARE_USAGE
2013-05-17 13:41:37 +08:00
from seaserv import seafile_api
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
from seahub . auth . decorators import login_required
from seahub . utils import IS_EMAIL_CONFIGURED
2013-12-17 12:14:58 +08:00
from seahub . views import get_system_default_repo_id
2013-05-17 13:41:37 +08:00
from seahub . forms import SetUserQuotaForm , AddUserForm
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 , \
2013-05-17 13:41:37 +08:00
SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER , SEND_EMAIL_ON_RESETTING_USER_PASSWD
2014-02-26 18:24:34 +08:00
from seahub . utils import send_html_email , get_user_traffic_list
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
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
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 ,
} ,
context_instance = RequestContext ( request ) )
@login_required
@sys_staff_required
def sys_ldap_user_admin ( request ) :
""" 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 (
' sysadmin/sys_ldap_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 ,
' CALC_SHARE_USAGE ' : CALC_SHARE_USAGE ,
2013-05-17 13:41:37 +08:00
} ,
context_instance = RequestContext ( request ) )
@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 ) )
2013-11-21 11:23:43 +08:00
@login_required
@sys_staff_required
def user_set_quota ( request , email ) :
if not request . is_ajax ( ) or request . method != ' POST ' :
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 :
result [ ' error ' ] = _ ( u ' Failed to set quota: internal error ' )
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 ] )
2013-10-17 18:20:44 +08:00
2013-10-15 17:41:02 +08:00
@login_required
@sys_staff_required
def user_toggle_status ( request , user_id ) :
content_type = ' application/json; charset=utf-8 '
try :
user_status = int ( request . GET . get ( ' s ' , 0 ) )
except ValueError :
user_status = 0
try :
user = User . objects . get ( id = int ( user_id ) )
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 )
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
@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 ' :
2013-10-14 12:06:02 +08:00
post_values = request . POST . copy ( )
post_email = request . POST . get ( ' email ' , ' ' )
post_values . update ( { ' email ' : post_email . lower ( ) } )
form = AddUserForm ( post_values )
2013-05-17 13:41:37 +08:00
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 ' ) )
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 ) )
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 :
if l . s_type == ' f ' :
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 :
# 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 ,
} , 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 ) )