Exemplo n.º 1
0
def count_users(request, domain):
    from corehq.apps.users.dbaccessors.all_commcare_users import get_commcare_users_by_filters
    form = CommCareUserFilterForm(request.GET, domain=domain)
    user_filters = {}
    if form.is_valid():
        user_filters = form.cleaned_data
    else:
        return HttpResponseBadRequest("Invalid Request")

    return json_response({
        'count': get_commcare_users_by_filters(domain, user_filters, count_only=True)
    })
Exemplo n.º 2
0
def dump_usernames(domain, download_id, user_filters, task):
    users_count = get_commcare_users_by_filters(domain, user_filters, count_only=True)
    DownloadBase.set_progress(task, 0, users_count)

    usernames = get_mobile_usernames_by_filters(domain, user_filters)

    headers = [('users', [['username']])]
    rows = [('users', [[username] for username in usernames])]
    location_id = user_filters.get('location_id')
    location_name = ""
    if location_id:
        location = SQLLocation.active_objects.get_or_None(location_id=location_id)
        location_name = location.name if location else ""
    filename_prefix = "_".join([a for a in [domain, location_name] if bool(a)])
    filename = "{}_users.xlsx".format(filename_prefix)
    _dump_xlsx_and_expose_download(filename, headers, rows, download_id, task, users_count)
Exemplo n.º 3
0
def parse_mobile_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)

    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 = 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, 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, 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))}
        ))
    return user_headers, get_user_rows(user_dicts, user_headers)
Exemplo n.º 4
0
    def test_get_all_commcare_users_by_domain(self):
        from corehq.util.elastic import ensure_index_deleted
        from corehq.elastic import get_es_new, send_to_elasticsearch
        from corehq.pillows.mappings.user_mapping import USER_INDEX_INFO, USER_INDEX
        from pillowtop.es_utils import initialize_index_and_mapping

        es = get_es_new()
        ensure_index_deleted(USER_INDEX)
        initialize_index_and_mapping(es, USER_INDEX_INFO)
        send_to_elasticsearch('users', self.ccuser_1.to_json())
        send_to_elasticsearch('users', self.ccuser_2.to_json())
        es.indices.refresh(USER_INDEX)

        usernames = lambda users: [u.username for u in users]
        # if no filters are passed, should return all cc-users in the domain
        self.assertItemsEqual(
            usernames(get_commcare_users_by_filters(self.ccdomain.name, {})),
            usernames([self.ccuser_2, self.ccuser_1]))
        self.assertEqual(
            get_commcare_users_by_filters(self.ccdomain.name, {},
                                          count_only=True), 2)
        # can search by username
        self.assertItemsEqual(
            usernames(
                get_commcare_users_by_filters(self.ccdomain.name,
                                              {'search_string': 'user_1'})),
            [self.ccuser_1.username])
        self.assertEqual(
            get_commcare_users_by_filters(self.ccdomain.name,
                                          {'search_string': 'user_1'},
                                          count_only=True), 1)
        # can search by role_id
        self.assertItemsEqual(
            usernames(
                get_commcare_users_by_filters(
                    self.ccdomain.name, {'role_id': self.custom_role._id})),
            [self.ccuser_2.username])
        self.assertEqual(
            get_commcare_users_by_filters(self.ccdomain.name,
                                          {'role_id': self.custom_role._id},
                                          count_only=True), 1)

        ensure_index_deleted(USER_INDEX)
Exemplo n.º 5
0
    def test_get_all_commcare_users_by_domain(self):
        from corehq.util.elastic import ensure_index_deleted
        from corehq.elastic import get_es_new, send_to_elasticsearch
        from corehq.pillows.mappings.user_mapping import USER_INDEX_INFO, USER_INDEX
        from pillowtop.es_utils import initialize_index_and_mapping

        es = get_es_new()
        ensure_index_deleted(USER_INDEX)
        initialize_index_and_mapping(es, USER_INDEX_INFO)
        send_to_elasticsearch('users', self.ccuser_1.to_json())
        send_to_elasticsearch('users', self.ccuser_2.to_json())
        es.indices.refresh(USER_INDEX)

        usernames = lambda users: [u.username for u in users]
        # if no filters are passed, should return all cc-users in the domain
        self.assertItemsEqual(
            usernames(get_commcare_users_by_filters(self.ccdomain.name, {})),
            usernames([self.ccuser_2, self.ccuser_1])
        )
        self.assertEqual(
            get_commcare_users_by_filters(self.ccdomain.name, {}, count_only=True),
            2
        )
        # can search by username
        self.assertItemsEqual(
            usernames(get_commcare_users_by_filters(self.ccdomain.name, {'search_string': 'user_1'})),
            [self.ccuser_1.username]
        )
        self.assertEqual(
            get_commcare_users_by_filters(self.ccdomain.name, {'search_string': 'user_1'}, count_only=True),
            1
        )
        # can search by role_id
        self.assertItemsEqual(
            usernames(get_commcare_users_by_filters(self.ccdomain.name, {'role_id': self.custom_role._id})),
            [self.ccuser_2.username]
        )
        self.assertEqual(
            get_commcare_users_by_filters(self.ccdomain.name, {'role_id': self.custom_role._id}, count_only=True),
            1
        )

        ensure_index_deleted(USER_INDEX)
Exemplo n.º 6
0
def count_users_and_groups(domain, user_filters, group_memoizer):
    users_count = get_commcare_users_by_filters(domain, user_filters, count_only=True)
    groups_count = len(group_memoizer.groups)

    return users_count + groups_count
Exemplo n.º 7
0
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()
Exemplo n.º 8
0
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()
Exemplo n.º 9
0
def count_users_and_groups(domain, user_filters, group_memoizer):
    users_count = get_commcare_users_by_filters(domain, user_filters, count_only=True)
    groups_count = len(group_memoizer.groups)

    return users_count + groups_count
Exemplo n.º 10
0
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()