def get_all_users_by_domain(domain=None, group=None, user_ids=None, user_filter=None, simplified=False, CommCareUser=None, include_inactive=False): """ WHEN THERE ARE A LOT OF USERS, THIS IS AN EXPENSIVE OPERATION. Returns a list of CommCare Users based on domain, group, and user filter (demo_user, admin, registered, unknown) """ user_ids = user_ids if user_ids and user_ids[0] else None if not CommCareUser: from corehq.apps.users.models import CommCareUser if group: # get all the users only in this group and don't bother filtering. if not isinstance(group, Group): group = Group.get(group) users = group.get_users(is_active=(not include_inactive), only_commcare=True) elif user_ids is not None: try: users = [CommCareUser.get_by_user_id(id) for id in user_ids] except Exception: users = [] if users and users[0] is None: raise Http404() else: if not user_filter: user_filter = HQUserType.all() users = [] submitted_user_ids = get_all_user_ids_submitted(domain) registered_user_ids = dict([(user.user_id, user) for user in CommCareUser.by_domain(domain)]) if include_inactive: registered_user_ids.update(dict([(u.user_id, u) for u in CommCareUser.by_domain(domain, is_active=False)])) for user_id in submitted_user_ids: if user_id in registered_user_ids and user_filter[HQUserType.REGISTERED].show: user = registered_user_ids[user_id] users.append(user) elif not user_id in registered_user_ids and \ (user_filter[HQUserType.ADMIN].show or user_filter[HQUserType.DEMO_USER].show or user_filter[HQUserType.UNKNOWN].show): username = get_username_from_forms(domain, user_id).lower() temp_user = TempCommCareUser(domain, username, user_id) if user_filter[temp_user.filter_flag].show: users.append(temp_user) if user_filter[HQUserType.UNKNOWN].show: users.append(TempCommCareUser(domain, '*', None)) if user_filter[HQUserType.REGISTERED].show: # now add all the registered users who never submitted anything for user_id in registered_user_ids: if not user_id in submitted_user_ids: user = CommCareUser.get_by_user_id(user_id) users.append(user) if simplified: return [_report_user_dict(user) for user in users] return users
def test_get_all_user_ids_submitted(self): self.assertEqual(get_all_user_ids_submitted(self.domain), {self.user_id})