def parse_mobile_users(domain, user_filters, task=None, total_count=None): from corehq.apps.users.views.mobile.custom_data_fields import UserFieldsView fields_definition = CustomDataFieldsDefinition.get_or_create( domain, UserFieldsView.field_type ) unrecognized_user_data_keys = set() user_groups_length = 0 max_location_length = 0 user_dicts = [] domains_list = [domain] is_multi_domain_download = False if 'domains' in user_filters: domains_list = user_filters['domains'] if domains_list != [domain]: is_multi_domain_download = True current_user_downloaded_count = 0 for current_domain in domains_list: location_cache = LocationIdToSiteCodeCache(current_domain) for n, user in enumerate(get_commcare_users_by_filters(current_domain, user_filters)): group_memoizer = load_memoizer(current_domain) group_names = sorted([ group_memoizer.get(id).name for id in Group.by_user_id(user.user_id, wrap=False) ], key=alphanumeric_sort_key) user_dict = make_mobile_user_dict(user, group_names, location_cache, current_domain, fields_definition) user_dicts.append(user_dict) unrecognized_user_data_keys.update(user_dict['uncategorized_data']) user_groups_length = max(user_groups_length, len(group_names)) max_location_length = max(max_location_length, len(user_dict["location_code"])) if task: DownloadBase.set_progress(task, n + current_user_downloaded_count, total_count) current_user_downloaded_count += n + 1 user_headers = [ 'username', 'password', 'name', 'phone-number', 'email', 'language', 'role', 'user_id', 'is_active', 'User IMEIs (read only)', 'registered_on (read only)', 'last_submission (read only)', 'last_sync (read only)' ] if domain_has_privilege(domain, privileges.APP_USER_PROFILES): user_headers += ['user_profile'] user_data_fields = [f.slug for f in fields_definition.get_fields(include_system=False)] user_headers.extend(build_data_headers(user_data_fields)) user_headers.extend(build_data_headers( unrecognized_user_data_keys, header_prefix='uncategorized_data' )) user_headers.extend(json_to_headers( {'group': list(range(1, user_groups_length + 1))} )) if domain_has_privilege(domain, privileges.LOCATIONS): user_headers.extend(json_to_headers( {'location_code': list(range(1, max_location_length + 1))} )) if is_multi_domain_download: user_headers += ['domain'] return user_headers, get_user_rows(user_dicts, user_headers)
def parse_web_users(domain, task=None, total_count=None): user_dicts = [] max_location_length = 0 location_cache = LocationIdToSiteCodeCache(domain) for n, user in enumerate(get_all_user_rows(domain, include_web_users=True, include_mobile_users=False, include_inactive=False, include_docs=True)): user_dict = make_web_user_dict(user, location_cache, domain) user_dicts.append(user_dict) max_location_length = max(max_location_length, len(user_dict["location_code"])) if task: DownloadBase.set_progress(task, n, total_count) for m, invite in enumerate(Invitation.by_domain(domain)): user_dict = make_invited_web_user_dict(invite, location_cache) user_dicts.append(user_dict) if task: DownloadBase.set_progress(task, n + m, total_count) user_headers = [ 'username', 'first_name', 'last_name', 'email', 'role', 'last_access_date (read only)', 'last_login (read only)', 'status', 'remove' ] if domain_has_privilege(domain, privileges.LOCATIONS): user_headers.extend(json_to_headers( {'location_code': list(range(1, max_location_length + 1))} )) return user_headers, get_user_rows(user_dicts, user_headers)
def build_data_headers(keys, header_prefix='data'): return json_to_headers( {header_prefix: {key: None for key in keys}} )
def parse_users(group_memoizer, domain, user_data_model, location_cache, user_filters, task, total_count): def _get_group_names(user): return sorted([ group_memoizer.get(id).name for id in Group.by_user_id(user.user_id, wrap=False) ], key=alphanumeric_sort_key) def _get_devices(user): """ Returns a comma-separated list of IMEI numbers of the user's devices, sorted with most-recently-used first """ return ', '.join([ device.device_id for device in sorted( user.devices, key=lambda d: d.last_used, reverse=True) ]) def _make_user_dict(user, group_names, location_cache): model_data, uncategorized_data = ( user_data_model.get_model_and_uncategorized(user.user_data)) role = user.get_role(domain) location_codes = [] try: location_codes.append(location_cache.get(user.location_id)) except SQLLocation.DoesNotExist: pass for location_id in user.assigned_location_ids: # skip if primary location_id, as it is already added to the start of list above if location_id != user.location_id: try: location_codes.append(location_cache.get(location_id)) except SQLLocation.DoesNotExist: pass return { 'data': model_data, 'uncategorized_data': uncategorized_data, 'group': group_names, 'name': user.full_name, 'password': "******", # dummy display string for passwords 'phone-number': user.phone_number, 'email': user.email, 'username': user.raw_username, 'language': user.language, 'user_id': user._id, 'is_active': str(user.is_active), 'User IMEIs (read only)': _get_devices(user), 'location_code': location_codes, 'role': role.name if role else '', 'registered_on (read only)': user.created_on.strftime('%Y-%m-%d %H:%M:%S') if user.created_on else '' } unrecognized_user_data_keys = set() user_groups_length = 0 max_location_length = 0 user_dicts = [] for n, user in enumerate( get_commcare_users_by_filters(domain, user_filters)): group_names = _get_group_names(user) user_dict = _make_user_dict(user, group_names, location_cache) user_dicts.append(user_dict) unrecognized_user_data_keys.update(user_dict['uncategorized_data']) user_groups_length = max(user_groups_length, len(group_names)) max_location_length = max(max_location_length, len(user_dict["location_code"])) DownloadBase.set_progress(task, n, total_count) user_headers = [ 'username', 'password', 'name', 'phone-number', 'email', 'language', 'role', 'user_id', 'is_active', 'User IMEIs (read only)', 'registered_on (read only)' ] user_data_fields = [ f.slug for f in user_data_model.get_fields(include_system=False) ] user_headers.extend(build_data_headers(user_data_fields)) user_headers.extend( build_data_headers(unrecognized_user_data_keys, header_prefix='uncategorized_data')) user_headers.extend( json_to_headers({'group': list(range(1, user_groups_length + 1))})) if domain_has_privilege(domain, privileges.LOCATIONS): user_headers.extend( json_to_headers( {'location_code': list(range(1, max_location_length + 1))})) def _user_rows(): for user_dict in user_dicts: row = dict(flatten_json(user_dict)) yield [row.get(header) or '' for header in user_headers] return user_headers, _user_rows()
def _extend_headers(prefix, headers): tab_headers.extend( json_to_headers({prefix: {header: None for header in headers}}))
def parse_users(group_memoizer, domain, user_filters, task=None, total_count=None): from corehq.apps.users.views.mobile.custom_data_fields import UserFieldsView fields_definition = CustomDataFieldsDefinition.get_or_create( domain, UserFieldsView.field_type ) location_cache = LocationIdToSiteCodeCache(domain) def _get_group_names(user): return sorted([ group_memoizer.get(id).name for id in Group.by_user_id(user.user_id, wrap=False) ], key=alphanumeric_sort_key) def _get_devices(user): """ Returns a comma-separated list of IMEI numbers of the user's devices, sorted with most-recently-used first """ return ', '.join([device.device_id for device in sorted( user.devices, key=lambda d: d.last_used, reverse=True )]) def _make_user_dict(user, group_names, location_cache): model_data, uncategorized_data = ( fields_definition.get_model_and_uncategorized(user.metadata) ) role = user.get_role(domain) profile = None if PROFILE_SLUG in user.metadata and domain_has_privilege(domain, privileges.APP_USER_PROFILES): try: profile = CustomDataFieldsProfile.objects.get(id=user.metadata[PROFILE_SLUG]) except CustomDataFieldsProfile.DoesNotExist: profile = None activity = user.reporting_metadata location_codes = [] try: location_codes.append(location_cache.get(user.location_id)) except SQLLocation.DoesNotExist: pass for location_id in user.assigned_location_ids: # skip if primary location_id, as it is already added to the start of list above if location_id != user.location_id: try: location_codes.append(location_cache.get(location_id)) except SQLLocation.DoesNotExist: pass def _format_date(date): return date.strftime('%Y-%m-%d %H:%M:%S') if date else '' return { 'data': model_data, 'uncategorized_data': uncategorized_data, 'group': group_names, 'name': user.full_name, 'password': "******", # dummy display string for passwords 'phone-number': user.phone_number, 'email': user.email, 'username': user.raw_username, 'language': user.language, 'user_id': user._id, 'is_active': str(user.is_active), 'User IMEIs (read only)': _get_devices(user), 'location_code': location_codes, 'role': role.name if role else '', 'user_profile': profile.name if profile else '', 'registered_on (read only)': _format_date(user.created_on), 'last_submission (read only)': _format_date(activity.last_submission_for_user.submission_date), 'last_sync (read only)': activity.last_sync_for_user.sync_date, } unrecognized_user_data_keys = set() user_groups_length = 0 max_location_length = 0 user_dicts = [] for n, user in enumerate(get_commcare_users_by_filters(domain, user_filters)): group_names = _get_group_names(user) user_dict = _make_user_dict(user, group_names, location_cache) user_dicts.append(user_dict) unrecognized_user_data_keys.update(user_dict['uncategorized_data']) user_groups_length = max(user_groups_length, len(group_names)) max_location_length = max(max_location_length, len(user_dict["location_code"])) if task: DownloadBase.set_progress(task, n, total_count) user_headers = [ 'username', 'password', 'name', 'phone-number', 'email', 'language', 'role', 'user_id', 'is_active', 'User IMEIs (read only)', 'registered_on (read only)', 'last_submission (read only)', 'last_sync (read only)' ] if domain_has_privilege(domain, privileges.APP_USER_PROFILES): user_headers += ['user_profile'] user_data_fields = [f.slug for f in fields_definition.get_fields(include_system=False)] user_headers.extend(build_data_headers(user_data_fields)) user_headers.extend(build_data_headers( unrecognized_user_data_keys, header_prefix='uncategorized_data' )) user_headers.extend(json_to_headers( {'group': list(range(1, user_groups_length + 1))} )) if domain_has_privilege(domain, privileges.LOCATIONS): user_headers.extend(json_to_headers( {'location_code': list(range(1, max_location_length + 1))} )) def _user_rows(): for user_dict in user_dicts: row = dict(flatten_json(user_dict)) yield [row.get(header) or '' for header in user_headers] return user_headers, _user_rows()
def parse_users(group_memoizer, domain, user_data_model, location_cache, user_filters, task, total_count): def _get_group_names(user): return sorted([group_memoizer.get(id).name for id in Group.by_user(user, wrap=False)], key=alphanumeric_sort_key) def _get_devices(user): """ Returns a comma-separated list of IMEI numbers of the user's devices, sorted with most-recently-used first """ return ', '.join([device.device_id for device in sorted( user.devices, key=lambda d: d.last_used, reverse=True )]) def _make_user_dict(user, group_names, location_cache): model_data, uncategorized_data = ( user_data_model.get_model_and_uncategorized(user.user_data) ) role = user.get_role(domain) location_codes = [] try: location_codes.append(location_cache.get(user.location_id)) except SQLLocation.DoesNotExist: pass for location_id in user.assigned_location_ids: # skip if primary location_id, as it is already added to the start of list above if location_id != user.location_id: try: location_codes.append(location_cache.get(location_id)) except SQLLocation.DoesNotExist: pass return { 'data': model_data, 'uncategorized_data': uncategorized_data, 'group': group_names, 'name': user.full_name, 'password': "******", # dummy display string for passwords 'phone-number': user.phone_number, 'email': user.email, 'username': user.raw_username, 'language': user.language, 'user_id': user._id, 'is_active': str(user.is_active), 'User IMEIs (read only)': _get_devices(user), 'location_code': location_codes, 'role': role.name if role else '', 'registered_on (read only)': user.created_on.strftime('%Y-%m-%d %H:%M:%S') if user.created_on else '' } unrecognized_user_data_keys = set() user_groups_length = 0 max_location_length = 0 user_dicts = [] for n, user in enumerate(get_commcare_users_by_filters(domain, user_filters)): group_names = _get_group_names(user) user_dict = _make_user_dict(user, group_names, location_cache) user_dicts.append(user_dict) unrecognized_user_data_keys.update(user_dict['uncategorized_data']) user_groups_length = max(user_groups_length, len(group_names)) max_location_length = max(max_location_length, len(user_dict["location_code"])) DownloadBase.set_progress(task, n, total_count) user_headers = [ 'username', 'password', 'name', 'phone-number', 'email', 'language', 'role', 'user_id', 'is_active', 'User IMEIs (read only)', 'registered_on (read only)'] user_data_fields = [f.slug for f in user_data_model.get_fields(include_system=False)] user_headers.extend(build_data_headers(user_data_fields)) user_headers.extend(build_data_headers( unrecognized_user_data_keys, header_prefix='uncategorized_data' )) user_headers.extend(json_to_headers( {'group': list(range(1, user_groups_length + 1))} )) if domain_has_privilege(domain, privileges.LOCATIONS): user_headers.extend(json_to_headers( {'location_code': list(range(1, max_location_length + 1))} )) def _user_rows(): for user_dict in user_dicts: row = dict(flatten_json(user_dict)) yield [row.get(header) or '' for header in user_headers] return user_headers, _user_rows()
def _extend_headers(prefix, headers): tab_headers.extend(json_to_headers( {prefix: {header: None for header in headers}} ))