def send_email(self, email): # save current language cur_language = translation.get_language() # get and active user language user_language = self.get_user_language(email) translation.activate(user_language) orgs = ccnet_api.get_orgs_by_user(email) if orgs: org_id = orgs[0].org_id quota_usage = seafile_api.get_org_user_quota_usage(org_id, email) quota_total = seafile_api.get_org_user_quota(org_id, email) else: quota_usage = seafile_api.get_user_self_usage(email) quota_total = seafile_api.get_user_quota(email) if IS_EMAIL_CONFIGURED and quota_total > 0 and quota_usage/quota_total > 0.9: data = {'email': email, 'quota_total': quota_total, 'quota_usage': quota_usage} contact_email = Profile.objects.get_contact_email_by_user(email) print('Send email to %s(%s)' % (contact_email, email)) send_html_email(_(u'Your quota is almost full on %s') % get_site_name(), 'user_quota_full.html', data, None, [contact_email]) # restore current language translation.activate(cur_language)
def get_org_user_info(org_id, user_obj): email = user_obj.email user_info = {} user_info['org_id'] = org_id user_info['email'] = email user_info['name'] = email2nickname(email) user_info['contact_email'] = email2contact_email(email) org_user_quota = seafile_api.get_org_user_quota(org_id, email) user_info['quota_total'] = org_user_quota org_user_quota_usage = seafile_api.get_org_user_quota_usage(org_id, email) user_info['quota_usage'] = org_user_quota_usage user_info['create_time'] = timestamp_to_isoformat_timestr(user_obj.ctime) user_info['last_login'] = '' last_login = UserLastLogin.objects.get_by_username(email).last_login \ if UserLastLogin.objects.get_by_username(email) else '' if last_login: user_info['last_login'] = datetime_to_isoformat_timestr(last_login) user_info['is_org_staff'] = True if ccnet_api.is_org_staff( org_id, email) == 1 else False return user_info
def get(self, request): """List all admins from database and ldap imported """ if not request.user.admin_permissions.can_manage_user(): return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.') try: admin_users = ccnet_api.get_superusers() except Exception as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) admin_users_info = [] for user in admin_users: user_info = {} profile = Profile.objects.get_profile_by_user(user.email) user_info['email'] = user.email user_info['name'] = email2nickname(user.email) user_info['contact_email'] = email2contact_email(user.email) user_info['login_id'] = profile.login_id if profile and profile.login_id else '' user_info['is_staff'] = user.is_staff user_info['is_active'] = user.is_active orgs = ccnet_api.get_orgs_by_user(user.email) try: if orgs: org_id = orgs[0].org_id user_info['org_id'] = org_id user_info['org_name'] = orgs[0].org_name user_info['quota_usage'] = seafile_api.get_org_user_quota_usage(org_id, user.email) user_info['quota_total'] = seafile_api.get_org_user_quota(org_id, user.email) else: user_info['quota_usage'] = seafile_api.get_user_self_usage(user.email) user_info['quota_total'] = seafile_api.get_user_quota(user.email) except Exception as e: logger.error(e) user_info['quota_usage'] = -1 user_info['quota_total'] = -1 user_info['create_time'] = timestamp_to_isoformat_timestr(user.ctime) last_login_obj = UserLastLogin.objects.get_by_username(user.email) user_info['last_login'] = datetime_to_isoformat_timestr(last_login_obj.last_login) if last_login_obj else '' try: admin_role = AdminRole.objects.get_admin_role(user.email) user_info['admin_role'] = admin_role.role except AdminRole.DoesNotExist: user_info['admin_role'] = DEFAULT_ADMIN admin_users_info.append(user_info) result = { 'admin_user_list': admin_users_info, } return Response(result)
def get_user_quota_usage_and_total(email, org_id=''): try: if org_id: quota_usage = seafile_api.get_org_user_quota_usage(org_id, email) quota_total = seafile_api.get_org_user_quota(org_id, email) else: orgs = ccnet_api.get_orgs_by_user(email) if orgs: org_id = orgs[0].org_id quota_usage = seafile_api.get_org_user_quota_usage( org_id, email) quota_total = seafile_api.get_org_user_quota(org_id, email) else: quota_usage = seafile_api.get_user_self_usage(email) quota_total = seafile_api.get_user_quota(email) except Exception as e: logger.error(e) quota_usage = -1 quota_total = -1 return quota_usage, quota_total
def get_org_user_info(org_id, email): user_info = {} user_info['org_id'] = org_id user_info['email'] = email user_info['name'] = email2nickname(email) user_info['contact_email'] = email2contact_email(email) org_user_quota = seafile_api.get_org_user_quota(org_id, email) user_info['quota_total'] = org_user_quota org_user_quota_usage = seafile_api.get_org_user_quota_usage(org_id, email) user_info['quota_usage'] = org_user_quota_usage return user_info
def get_org_user_info(self, user, org): user_info = {} user_info['org_id'] = org.org_id user_info['active'] = user.is_active user_info['email'] = user.email user_info['name'] = email2nickname(user.email) user_info['contact_email'] = email2contact_email(user.email) org_user_quota = seafile_api.get_org_user_quota(org.org_id, user.email) user_info['quota_total'] = org_user_quota / get_file_size_unit('MB') org_user_quota_usage = seafile_api.get_org_user_quota_usage(org.org_id, user.email) user_info['quota_usage'] = org_user_quota_usage / get_file_size_unit('MB') return user_info
def get_org_user_info(org_id, email): user_info = {} user_obj = User.objects.get(email=email) user_info['org_id'] = org_id user_info['active'] = user_obj.is_active user_info['email'] = email user_info['name'] = email2nickname(email) user_info['contact_email'] = email2contact_email(email) org_user_quota = seafile_api.get_org_user_quota(org_id, email) user_info['quota_total'] = org_user_quota / get_file_size_unit('MB') org_user_quota_usage = seafile_api.get_org_user_quota_usage(org_id, email) user_info['quota_usage'] = org_user_quota_usage / get_file_size_unit('MB') return user_info
def get_user_info(email): user = User.objects.get(email=email) profile = Profile.objects.get_profile_by_user(email) info = {} info['email'] = email info['name'] = email2nickname(email) info[ 'contact_email'] = profile.contact_email if profile and profile.contact_email else '' info['login_id'] = profile.login_id if profile and profile.login_id else '' info['is_staff'] = user.is_staff info['is_active'] = user.is_active info['reference_id'] = user.reference_id if user.reference_id else '' orgs = ccnet_api.get_orgs_by_user(email) try: if orgs: org_id = orgs[0].org_id info['org_id'] = org_id info['org_name'] = orgs[0].org_name info['quota_usage'] = seafile_api.get_org_user_quota_usage( org_id, user.email) info['quota_total'] = seafile_api.get_org_user_quota( org_id, user.email) else: info['quota_usage'] = seafile_api.get_user_self_usage(user.email) info['quota_total'] = seafile_api.get_user_quota(user.email) except Exception as e: logger.error(e) info['quota_usage'] = -1 info['quota_total'] = -1 info['create_time'] = timestamp_to_isoformat_timestr(user.ctime) info['has_default_device'] = True if default_device(user) else False info['is_force_2fa'] = UserOptions.objects.is_force_2fa(email) if getattr(settings, 'MULTI_INSTITUTION', False): info['institution'] = profile.institution if profile else '' info['role'] = get_user_role(user) return info
def get_info_of_users_order_by_quota_usage(self, org, all_users, direction, page, per_page): # get user's quota usage info user_usage_dict = {} users_with_usage = seafile_api.list_org_user_quota_usage(org.org_id) for user in users_with_usage: email = user.user if email not in user_usage_dict: user_usage_dict[email] = user.usage # get all users and map quota usage to user for user in all_users: email = user.email user.quota_usage = user_usage_dict.get(email, 0) # sort all_users.sort(key=lambda item: item.quota_usage, reverse=direction == 'desc') data = [] for user in all_users[(page - 1) * per_page:page * per_page]: info = {} info['email'] = user.email info['name'] = email2nickname(user.email) info['contact_email'] = email2contact_email(user.email) info['is_staff'] = user.is_staff info['is_active'] = user.is_active info['create_time'] = timestamp_to_isoformat_timestr(user.ctime) info['quota_usage'] = user.quota_usage info['quota_total'] = seafile_api.get_org_user_quota( org.org_id, user.email) last_login_obj = UserLastLogin.objects.get_by_username(user.email) info['last_login'] = datetime_to_isoformat_timestr( last_login_obj.last_login) if last_login_obj else '' data.append(info) return data
def _populate_user_quota_usage(user): """Populate space/share quota to user. Arguments: - `user`: """ orgs = ccnet_api.get_orgs_by_user(user.email) try: if orgs: user.org = orgs[0] org_id = user.org.org_id user.space_usage = seafile_api.get_org_user_quota_usage(org_id, user.email) user.space_quota = seafile_api.get_org_user_quota(org_id, user.email) else: user.space_usage = seafile_api.get_user_self_usage(user.email) user.space_quota = seafile_api.get_user_quota(user.email) except SearpcError as e: logger.error(e) user.space_usage = -1 user.space_quota = -1
def get_org_user_info(org_id, user_obj): email = user_obj.email user_info = {} user_info['org_id'] = org_id user_info['email'] = email user_info['name'] = email2nickname(email) user_info['contact_email'] = email2contact_email(email) org_user_quota = seafile_api.get_org_user_quota(org_id, email) user_info['quota_total'] = org_user_quota org_user_quota_usage = seafile_api.get_org_user_quota_usage(org_id, email) user_info['quota_usage'] = org_user_quota_usage user_info['create_time'] = timestamp_to_isoformat_timestr(user_obj.ctime) user_info['last_login'] = UserLastLogin.objects.get_by_username( email).last_login if UserLastLogin.objects.get_by_username( email) else '' return user_info
def handle(self, *args, **options): self.stdout.write("Export users to '../users.xlsx'.") try: users = ccnet_api.get_emailusers('DB', -1, -1) + \ ccnet_api.get_emailusers('LDAPImport', -1, -1) except Exception as e: self.stdout.write('Error: ' + str(e)) return if is_pro_version(): is_pro = True else: is_pro = False if is_pro: head = [ _("Email"), _("Name"), _("Contact Email"), _("Status"), _("Role"), _("Space Usage") + "(MB)", _("Space Quota") + "(MB)", _("Create At"), _("Last Login"), _("Admin"), _("LDAP(imported)"), ] else: head = [ _("Email"), _("Name"), _("Contact Email"), _("Status"), _("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 = [] while looped < len(users): current_users = users[looped:looped + limit] 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]) 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 # populate space usage and quota MB = get_file_size_unit('MB') # populate user quota usage orgs = ccnet_api.get_orgs_by_user(user.email) try: if orgs: user.org = orgs[0] org_id = user.org.org_id user.space_usage = seafile_api.get_org_user_quota_usage( org_id, user.email) user.space_quota = seafile_api.get_org_user_quota( org_id, user.email) else: user.space_usage = seafile_api.get_user_self_usage( user.email) user.space_quota = seafile_api.get_user_quota( user.email) except Exception as e: self.stdout.write('Debug: ' + str(e)) user.space_usage = -1 user.space_quota = -1 if user.space_usage > 0: try: space_usage_MB = round(float(user.space_usage) / MB, 2) except Exception as e: self.stdout.write('Debug: ' + str(e)) space_usage_MB = '--' else: space_usage_MB = '' if user.space_quota > 0: try: space_quota_MB = round(float(user.space_quota) / MB, 2) except Exception as e: self.stdout.write('Debug: ' + str(e)) space_quota_MB = '--' else: space_quota_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: 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: self.stdout.write('Error: please check the log.') return wb.save('../users.xlsx') self.stdout.write('Done.\n')
def get(self, request): """Search user from DB, LDAPImport and Profile Permission checking: 1. only admin can perform this action. """ if not request.user.admin_permissions.can_manage_user(): return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.') query_str = request.GET.get('query', '').lower() if not query_str: error_msg = 'query invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) users = [] # search user from ccnet db users += ccnet_api.search_emailusers('DB', query_str, 0, 10) # search user from ccnet ldapimport users += ccnet_api.search_emailusers('LDAP', query_str, 0, 10) ccnet_user_emails = [u.email for u in users] # get institution for user from ccnet if getattr(settings, 'MULTI_INSTITUTION', False): user_institution_dict = {} profiles = Profile.objects.filter(user__in=ccnet_user_emails) for profile in profiles: email = profile.user if email not in user_institution_dict: user_institution_dict[email] = profile.institution for user in users: user.institution = user_institution_dict.get(user.email, '') # search user from profile searched_profile = Profile.objects.filter( (Q(nickname__icontains=query_str)) | Q(contact_email__icontains=query_str))[:10] for profile in searched_profile: email = profile.user institution = profile.institution # remove duplicate emails if email not in ccnet_user_emails: try: # get is_staff and is_active info user = User.objects.get(email=email) user.institution = institution users.append(user) except User.DoesNotExist: continue data = [] for user in users: info = {} info['email'] = user.email info['name'] = email2nickname(user.email) info['contact_email'] = email2contact_email(user.email) info['is_staff'] = user.is_staff info['is_active'] = user.is_active info['source'] = user.source.lower() orgs = ccnet_api.get_orgs_by_user(user.email) if orgs: org_id = orgs[0].org_id info['org_id'] = org_id info['org_name'] = orgs[0].org_name info['quota_usage'] = seafile_api.get_org_user_quota_usage( org_id, user.email) info['quota_total'] = seafile_api.get_org_user_quota( org_id, user.email) else: info['quota_usage'] = seafile_api.get_user_self_usage( user.email) info['quota_total'] = seafile_api.get_user_quota(user.email) info['create_time'] = timestamp_to_isoformat_timestr(user.ctime) last_login_obj = UserLastLogin.objects.get_by_username(user.email) info['last_login'] = datetime_to_isoformat_timestr( last_login_obj.last_login) if last_login_obj else '' info['role'] = get_user_role(user) if getattr(settings, 'MULTI_INSTITUTION', False): info['institution'] = user.institution data.append(info) result = {'user_list': data} return Response(result)
def get(self, request): """List all users in DB or LDAPImport Permission checking: 1. only admin can perform this action. """ if not request.user.admin_permissions.can_manage_user(): return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.') # parameter check try: page = int(request.GET.get('page', '1')) per_page = int(request.GET.get('per_page', '25')) except ValueError: page = 1 per_page = 25 start = (page - 1) * per_page source = request.GET.get('source', 'DB').lower().strip() if source not in ['db', 'ldapimport']: # source: 'DB' or 'LDAPImport', default is 'DB' error_msg = 'source %s invalid.' % source return api_error(status.HTTP_400_BAD_REQUEST, error_msg) order_by = request.GET.get('order_by', '').lower().strip() if order_by: if order_by not in ('quota_usage'): error_msg = 'order_by invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) direction = request.GET.get('direction', 'desc').lower().strip() if direction not in ('asc', 'desc'): error_msg = 'direction invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) if source == 'db': total_count = ccnet_api.count_emailusers('DB') + \ ccnet_api.count_inactive_emailusers('DB') if order_by: if total_count > 500 and \ not getattr(settings, 'ALWAYS_SORT_USERS_BY_QUOTA_USAGE', False): error_msg = _( "There are more than 500 users, and sort is not offered." ) return api_error(status.HTTP_400_BAD_REQUEST, error_msg) try: data = self.get_info_of_users_order_by_quota_usage( source, direction, page, per_page) except Exception as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) result = {'data': data, 'total_count': total_count} return Response(result) else: users = ccnet_api.get_emailusers('DB', start, per_page) elif source == 'ldapimport': # api param is 'LDAP', but actually get count of 'LDAPImport' users total_count = ccnet_api.count_emailusers('LDAP') + \ ccnet_api.count_inactive_emailusers('LDAP') if order_by: if total_count > 500 and \ not getattr(settings, 'ALWAYS_SORT_USERS_BY_QUOTA_USAGE', False): error_msg = _( "There are more than 500 users, and sort is not offered." ) return api_error(status.HTTP_400_BAD_REQUEST, error_msg) try: data = self.get_info_of_users_order_by_quota_usage( source, direction, page, per_page) except Exception as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) result = {'data': data, 'total_count': total_count} return Response(result) else: users = ccnet_api.get_emailusers('LDAPImport', start, per_page) data = [] for user in users: profile = Profile.objects.get_profile_by_user(user.email) info = {} info['email'] = user.email info['name'] = email2nickname(user.email) info['contact_email'] = email2contact_email(user.email) info[ 'login_id'] = profile.login_id if profile and profile.login_id else '' info['is_staff'] = user.is_staff info['is_active'] = user.is_active orgs = ccnet_api.get_orgs_by_user(user.email) try: if orgs: org_id = orgs[0].org_id info['org_id'] = org_id info['org_name'] = orgs[0].org_name info['quota_usage'] = seafile_api.get_org_user_quota_usage( org_id, user.email) info['quota_total'] = seafile_api.get_org_user_quota( org_id, user.email) else: info['quota_usage'] = seafile_api.get_user_self_usage( user.email) info['quota_total'] = seafile_api.get_user_quota( user.email) except Exception as e: logger.error(e) info['quota_usage'] = -1 info['quota_total'] = -1 info['create_time'] = timestamp_to_isoformat_timestr(user.ctime) last_login_obj = UserLastLogin.objects.get_by_username(user.email) info['last_login'] = datetime_to_isoformat_timestr( last_login_obj.last_login) if last_login_obj else '' info['role'] = get_user_role(user) if getattr(settings, 'MULTI_INSTITUTION', False): info['institution'] = profile.institution if profile else '' data.append(info) result = {'data': data, 'total_count': total_count} return Response(result)
def get_org_user_quota(org_id, username): return seafile_api.get_org_user_quota(org_id, username)
def get(self, request): """List all users in DB or LDAPImport Permission checking: 1. only admin can perform this action. """ if not request.user.admin_permissions.can_manage_user(): return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.') try: page = int(request.GET.get('page', '1')) per_page = int(request.GET.get('per_page', '25')) except ValueError: page = 1 per_page = 25 start = (page - 1) * per_page # source: 'DB' or 'LDAPImport', default is 'DB' source = request.GET.get('source', 'DB') source = source.lower() if source not in ['db', 'ldapimport']: error_msg = 'source %s invalid.' % source return api_error(status.HTTP_400_BAD_REQUEST, error_msg) if source == 'db': users = ccnet_api.get_emailusers('DB', start, per_page) total_count = ccnet_api.count_emailusers('DB') + \ ccnet_api.count_inactive_emailusers('DB') elif source == 'ldapimport': users = ccnet_api.get_emailusers('LDAPImport', start, per_page) # api param is 'LDAP', but actually get count of 'LDAPImport' users total_count = ccnet_api.count_emailusers('LDAP') + \ ccnet_api.count_inactive_emailusers('LDAP') data = [] for user in users: profile = Profile.objects.get_profile_by_user(user.email) info = {} info['email'] = user.email info['name'] = email2nickname(user.email) info['contact_email'] = email2contact_email(user.email) info[ 'login_id'] = profile.login_id if profile and profile.login_id else '' info['is_staff'] = user.is_staff info['is_active'] = user.is_active orgs = ccnet_api.get_orgs_by_user(user.email) try: if orgs: org_id = orgs[0].org_id info['org_id'] = org_id info['org_name'] = orgs[0].org_name info['quota_usage'] = seafile_api.get_org_user_quota_usage( org_id, user.email) info['quota_total'] = seafile_api.get_org_user_quota( org_id, user.email) else: info['quota_usage'] = seafile_api.get_user_self_usage( user.email) info['quota_total'] = seafile_api.get_user_quota( user.email) except Exception as e: logger.error(e) info['quota_usage'] = -1 info['quota_total'] = -1 info['create_time'] = timestamp_to_isoformat_timestr(user.ctime) last_login_obj = UserLastLogin.objects.get_by_username(user.email) info['last_login'] = datetime_to_isoformat_timestr( last_login_obj.last_login) if last_login_obj else '' info['role'] = get_user_role(user) if getattr(settings, 'MULTI_INSTITUTION', False): info['institution'] = profile.institution if profile else '' data.append(info) result = {'data': data, 'total_count': total_count} return Response(result)
def handle(self, *args, **options): self.stdout.write("Export users to '../users.xlsx'.") try: users = ccnet_api.get_emailusers('DB', -1, -1) + \ ccnet_api.get_emailusers('LDAPImport', -1, -1) except Exception as e: self.stdout.write('Error: ' + str(e)) return if is_pro_version(): is_pro = True else: is_pro = False if is_pro: head = [_("Email"), _("Name"), _("Contact Email"), _("Status"), _("Role"), _("Space Usage") + "(MB)", _("Space Quota") + "(MB)", _("Create At"), _("Last Login"), _("Admin"), _("LDAP(imported)"),] else: head = [_("Email"), _("Name"), _("Contact Email"), _("Status"), _("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 = [] while looped < len(users): current_users = users[looped:looped+limit] 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]) 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 # populate space usage and quota MB = get_file_size_unit('MB') # populate user quota usage orgs = ccnet_api.get_orgs_by_user(user.email) try: if orgs: user.org = orgs[0] org_id = user.org.org_id user.space_usage = seafile_api.get_org_user_quota_usage(org_id, user.email) user.space_quota = seafile_api.get_org_user_quota(org_id, user.email) else: user.space_usage = seafile_api.get_user_self_usage(user.email) user.space_quota = seafile_api.get_user_quota(user.email) except Exception as e: self.stdout.write('Debug: ' + str(e)) user.space_usage = -1 user.space_quota = -1 if user.space_usage > 0: try: space_usage_MB = round(float(user.space_usage) / MB, 2) except Exception as e: self.stdout.write('Debug: ' + str(e)) space_usage_MB = '--' else: space_usage_MB = '' if user.space_quota > 0: try: space_quota_MB = round(float(user.space_quota) / MB, 2) except Exception as e: self.stdout.write('Debug: ' + str(e)) space_quota_MB = '--' else: space_quota_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: 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: self.stdout.write('Error: please check the log.') return wb.save('../users.xlsx') self.stdout.write('Done.\n')