1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-20 02:48:51 +00:00

Merge branch '6.1'

This commit is contained in:
lian
2017-08-12 14:34:11 +08:00
82 changed files with 2176 additions and 510 deletions

View File

@@ -42,7 +42,7 @@ from seahub.invitations.models import Invitation
from seahub.role_permissions.utils import get_available_roles
from seahub.utils import IS_EMAIL_CONFIGURED, string2list, is_valid_username, \
is_pro_version, send_html_email, get_user_traffic_list, get_server_id, \
clear_token, handle_virus_record, get_virus_record_by_id, \
handle_virus_record, get_virus_record_by_id, \
get_virus_record, FILE_AUDIT_ENABLED, get_max_upload_file_size
from seahub.utils.file_size import get_file_size_unit
from seahub.utils.ldap import get_ldap_info
@@ -58,7 +58,7 @@ from seahub.forms import SetUserQuotaForm, AddUserForm, BatchAddUserForm, \
TermsAndConditionsForm
from seahub.options.models import UserOptions
from seahub.profile.models import Profile, DetailedProfile
from seahub.signals import repo_deleted
from seahub.signals import repo_deleted, institution_deleted
from seahub.share.models import FileShare, UploadLinkShare
from seahub.admin_log.signals import admin_operation
from seahub.admin_log.models import USER_DELETE, USER_ADD
@@ -76,7 +76,7 @@ try:
from seahub.settings import MULTI_TENANCY
except ImportError:
MULTI_TENANCY = False
from seahub.utils.two_factor_auth import HAS_TWO_FACTOR_AUTH
from seahub.utils.two_factor_auth import has_two_factor_auth, HAS_TWO_FACTOR_AUTH
from termsandconditions.models import TermsAndConditions
logger = logging.getLogger(__name__)
@@ -255,6 +255,16 @@ def sys_user_admin(request):
extra_user_roles = [x for x in get_available_roles()
if x not in get_basic_user_roles()]
multi_institution = getattr(dj_settings, 'MULTI_INSTITUTION', False)
show_institution = False
institutions = None
if multi_institution:
show_institution = True
institutions = [inst.name for inst in Institution.objects.all()]
for user in users:
profile = Profile.objects.get_profile_by_user(user.email)
user.institution = profile.institution if profile else ''
return render_to_response(
'sysadmin/sys_useradmin.html', {
'users': users,
@@ -272,6 +282,8 @@ def sys_user_admin(request):
'pro_server': pro_server,
'enable_user_plan': enable_user_plan,
'extra_user_roles': extra_user_roles,
'show_institution': show_institution,
'institutions': institutions,
}, context_instance=RequestContext(request))
@login_required
@@ -305,69 +317,92 @@ def sys_useradmin_export_excel(request):
_("Space Usage") + "(MB)", _("Space Quota") + "(MB)",
_("Create At"), _("Last Login"), _("Admin"), _("LDAP(imported)"),]
# only operate 100 users for every `for` loop
looped = 0
limit = 100
data_list = []
last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in users])
for user in users:
while looped < len(users):
# populate name and contact email
populate_user_info(user)
current_users = users[looped:looped+limit]
# populate space usage and quota
MB = get_file_size_unit('MB')
last_logins = UserLastLogin.objects.filter(username__in=[x.email \
for x in current_users])
user_profiles = Profile.objects.filter(user__in=[x.email \
for x in current_users])
_populate_user_quota_usage(user)
if user.space_usage > 0:
try:
space_usage_MB = round(float(user.space_usage) / MB, 2)
except Exception as e:
logger.error(e)
space_usage_MB = '--'
else:
space_usage_MB = ''
for user in current_users:
# populate name and contact email
user.contact_email = ''
user.name = ''
for profile in user_profiles:
if profile.user == user.email:
user.contact_email = profile.contact_email
user.name = profile.nickname
if user.space_quota > 0:
try:
space_quota_MB = round(float(user.space_quota) / MB, 2)
except Exception as e:
logger.error(e)
space_quota_MB = '--'
else:
space_quota_MB = ''
# populate space usage and quota
MB = get_file_size_unit('MB')
# 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
if user.is_active:
status = _('Active')
else:
status = _('Inactive')
create_at = tsstr_sec(user.ctime) if user.ctime else ''
last_login = user.last_login.strftime("%Y-%m-%d %H:%M:%S") if \
user.last_login else ''
is_admin = _('Yes') if user.is_staff else ''
ldap_import = _('Yes') if user.source == 'LDAPImport' else ''
if is_pro:
if user.role == GUEST_USER:
role = _('Guest')
_populate_user_quota_usage(user)
if user.space_usage > 0:
try:
space_usage_MB = round(float(user.space_usage) / MB, 2)
except Exception as e:
logger.error(e)
space_usage_MB = '--'
else:
role = _('Default')
space_usage_MB = ''
row = [user.email, user.name, user.contact_email, status, role,
space_usage_MB, space_quota_MB, create_at,
last_login, is_admin, ldap_import]
else:
row = [user.email, user.name, user.contact_email, status,
space_usage_MB, space_quota_MB, create_at,
last_login, is_admin, ldap_import]
if user.space_quota > 0:
try:
space_quota_MB = round(float(user.space_quota) / MB, 2)
except Exception as e:
logger.error(e)
space_quota_MB = '--'
else:
space_quota_MB = ''
data_list.append(row)
# 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
if user.is_active:
status = _('Active')
else:
status = _('Inactive')
create_at = tsstr_sec(user.ctime) if user.ctime else ''
last_login = user.last_login.strftime("%Y-%m-%d %H:%M:%S") if \
user.last_login else ''
is_admin = _('Yes') if user.is_staff else ''
ldap_import = _('Yes') if user.source == 'LDAPImport' else ''
if is_pro:
if user.role:
if user.role == GUEST_USER:
role = _('Guest')
elif user.role == DEFAULT_USER:
role = _('Default')
else:
role = user.role
else:
role = _('Default')
row = [user.email, user.name, user.contact_email, status, role,
space_usage_MB, space_quota_MB, create_at,
last_login, is_admin, ldap_import]
else:
row = [user.email, user.name, user.contact_email, status,
space_usage_MB, space_quota_MB, create_at,
last_login, is_admin, ldap_import]
data_list.append(row)
# update `looped` value when `for` loop finished
looped += limit
wb = write_xls('users', head, data_list)
if not wb:
@@ -408,12 +443,29 @@ def sys_user_admin_ldap_imported(request):
populate_user_info(user)
_populate_user_quota_usage(user)
# check user's role
user.is_guest = True if get_user_role(user) == GUEST_USER else False
user.is_default = True if get_user_role(user) == DEFAULT_USER else False
# 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
extra_user_roles = [x for x in get_available_roles()
if x not in get_basic_user_roles()]
multi_institution = getattr(dj_settings, 'MULTI_INSTITUTION', False)
show_institution = False
institutions = None
if multi_institution:
show_institution = True
institutions = [inst.name for inst in Institution.objects.all()]
for user in users:
profile = Profile.objects.get_profile_by_user(user.email)
user.institution = profile.institution if profile else ''
return render_to_response(
'sysadmin/sys_user_admin_ldap_imported.html', {
'users': users,
@@ -423,6 +475,11 @@ def sys_user_admin_ldap_imported(request):
'per_page': per_page,
'page_next': page_next,
'is_pro': is_pro_version(),
'extra_user_roles': extra_user_roles,
'default_user': DEFAULT_USER,
'guest_user': GUEST_USER,
'show_institution': show_institution,
'institutions': institutions,
}, context_instance=RequestContext(request))
@login_required
@@ -639,6 +696,13 @@ def user_info(request, email):
else:
g.role = _('Member')
_default_device = False
_has_two_factor_auth = has_two_factor_auth()
if _has_two_factor_auth:
from seahub_extra.two_factor.utils import default_device
_user = User.objects.get(email=email)
_default_device = default_device(_user)
return render_to_response(
'sysadmin/userinfo.html', {
'owned_repos': owned_repos,
@@ -652,6 +716,8 @@ def user_info(request, email):
'user_shared_links': user_shared_links,
'enable_sys_admin_view_repo': ENABLE_SYS_ADMIN_VIEW_REPO,
'personal_groups': personal_groups,
'two_factor_auth_enabled': _has_two_factor_auth,
'default_device': _default_device,
}, context_instance=RequestContext(request))
@login_required_ajax
@@ -877,10 +943,10 @@ def user_toggle_status(request, email):
return HttpResponse(json.dumps({'success': True,
'email_sent': email_sent,
}), content_type=content_type)
else:
clear_token(user.email)
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)
@@ -940,7 +1006,6 @@ def user_reset(request, email):
user.set_password(new_password)
user.save()
clear_token(user.username)
if config.FORCE_PASSWORD_CHANGE:
UserOptions.objects.set_force_passwd_change(user.username)
@@ -2090,6 +2155,44 @@ def sys_inst_admin(request):
'page_next': page_next,
}, context_instance=RequestContext(request))
@login_required
@sys_staff_required
@require_POST
def sys_inst_add_user(request, inst_id):
content_type = 'application/json; charset=utf-8'
emails = request.POST.get('emails', '')
email_list = [em.strip() for em in emails.split(',') if em.strip()]
if len(email_list) == 0:
return HttpResponse(json.dumps({'error': "Emails can't be empty"}),
status=400)
try:
inst = Institution.objects.get(pk=inst_id)
except Institution.DoesNotExist:
return HttpResponse(json.dumps({'error': "Institution does not exist"}),
status=400)
for email in email_list:
try:
User.objects.get(email=email)
except Exception as e:
messages.error(request, u'Failed to add %s to the institution: user does not exist.' % email)
continue
profile = Profile.objects.get_profile_by_user(email)
if not profile:
profile = Profile.objects.add_or_update(email, email)
if profile.institution:
messages.error(request, _(u"Failed to add %s to the institution: user already belongs to an institution") % email)
continue
else:
profile.institution = inst.name
profile.save()
messages.success(request, _(u'Successfully added %s to the institution.') % email)
return HttpResponse(json.dumps({'success': True}),
content_type=content_type)
@login_required
@sys_staff_required
@require_POST
@@ -2101,7 +2204,9 @@ def sys_inst_remove(request, inst_id):
except Institution.DoesNotExist:
raise Http404
inst_name = inst.name
inst.delete()
institution_deleted.send(sender=None, inst_name = inst_name)
messages.success(request, _('Success'))
return HttpResponseRedirect(reverse('sys_inst_admin'))