def case_owners(self): # Get user ids for each user that match the demo_user, admin, Unknown Users, or All Mobile Workers filters user_types = EMWF.selected_user_types(self.request) user_type_filters = [] if HQUserType.ADMIN in user_types: user_type_filters.append(user_es.admin_users()) if HQUserType.UNKNOWN in user_types: user_type_filters.append(user_es.unknown_users()) user_type_filters.append(user_es.web_users()) if HQUserType.DEMO_USER in user_types: user_type_filters.append(user_es.demo_users()) if HQUserType.REGISTERED in user_types: user_type_filters.append(user_es.mobile_users()) if len(user_type_filters) > 0: special_q = user_es.UserES().domain(self.domain).OR(*user_type_filters).show_inactive() special_user_ids = special_q.run().doc_ids else: special_user_ids = [] # Get user ids for each user that was specifically selected selected_user_ids = EMWF.selected_user_ids(self.request) # Get group ids for each group that was specified selected_reporting_group_ids = EMWF.selected_reporting_group_ids(self.request) selected_sharing_group_ids = EMWF.selected_sharing_group_ids(self.request) # Get user ids for each user in specified reporting groups report_group_q = HQESQuery(index="groups").domain(self.domain)\ .doc_type("Group")\ .filter(filters.term("_id", selected_reporting_group_ids))\ .fields(["users"]) user_lists = [group["users"] for group in report_group_q.run().hits] selected_reporting_group_users = list(set().union(*user_lists)) # Get ids for each sharing group that contains a user from selected_reporting_group_users OR a user that was specifically selected share_group_q = HQESQuery(index="groups").domain(self.domain)\ .doc_type("Group")\ .filter(filters.term("case_sharing", True))\ .filter(filters.term("users", selected_reporting_group_users+selected_user_ids+special_user_ids))\ .fields([]) sharing_group_ids = share_group_q.run().doc_ids owner_ids = list(set().union( special_user_ids, selected_user_ids, selected_sharing_group_ids, selected_reporting_group_users, sharing_group_ids )) if HQUserType.COMMTRACK in user_types: owner_ids.append("commtrack-system") if HQUserType.DEMO_USER in user_types: owner_ids.append("demo_user_group_id") owner_ids += self.location_sharing_owner_ids() owner_ids += self.location_reporting_owner_ids() return owner_ids
def case_owners(self): # Get user ids for each user that match the demo_user, admin, Unknown Users, or All Mobile Workers filters user_types = EMWF.selected_user_types(self.request) user_type_filters = [] if HQUserType.ADMIN in user_types: user_type_filters.append(user_es.admin_users()) if HQUserType.UNKNOWN in user_types: user_type_filters.append(user_es.unknown_users()) user_type_filters.append(user_es.web_users()) if HQUserType.DEMO_USER in user_types: user_type_filters.append(user_es.demo_users()) if HQUserType.REGISTERED in user_types: user_type_filters.append(user_es.mobile_users()) if len(user_type_filters) > 0: special_q = user_es.UserES().domain( self.domain).OR(*user_type_filters) special_user_ids = special_q.run().doc_ids else: special_user_ids = [] # Get user ids for each user that was specifically selected selected_user_ids = EMWF.selected_user_ids(self.request) # Get group ids for each group that was specified selected_reporting_group_ids = EMWF.selected_reporting_group_ids( self.request) selected_sharing_group_ids = EMWF.selected_sharing_group_ids( self.request) # Get user ids for each user in specified reporting groups report_group_q = HQESQuery(index="groups").domain(self.domain)\ .doc_type("Group")\ .filter(filters.term("_id", selected_reporting_group_ids))\ .fields(["users"]) user_lists = [group["users"] for group in report_group_q.run().hits] selected_reporting_group_users = list(set().union(*user_lists)) # Get ids for each sharing group that contains a user from selected_reporting_group_users OR a user that was specifically selected share_group_q = HQESQuery(index="groups").domain(self.domain)\ .doc_type("Group")\ .filter(filters.term("case_sharing", True))\ .filter(filters.term("users", selected_reporting_group_users+selected_user_ids+special_user_ids))\ .fields([]) sharing_group_ids = share_group_q.run().doc_ids owner_ids = list(set().union(special_user_ids, selected_user_ids, selected_sharing_group_ids, selected_reporting_group_users, sharing_group_ids)) if HQUserType.COMMTRACK in EMWF.selected_user_types(self.request): owner_ids.append("commtrack-system") return owner_ids
def case_users_and_owners(self): users_data = ExpandedMobileWorkerFilterWithAllData.pull_users_from_es( self.domain, self.request, fields=[]) user_ids = filter(None, [u["_id"] for u in users_data["hits"]["hits"]]) group_owner_ids = [] for user_id in user_ids: group_owner_ids.extend([ group._id for group in Group.by_user(user_id) if group.case_sharing ]) if HQUserType.COMMTRACK in ExpandedMobileWorkerFilterWithAllData.user_types(self.request): user_ids.append("commtrack-system") return user_ids, filter(None, group_owner_ids)
def case_users_and_owners(self): users_data = ExpandedMobileWorkerFilterWithAllData.pull_users_from_es( self.domain, self.request, fields=[]) user_ids = filter(None, [u["_id"] for u in users_data["hits"]["hits"]]) group_owner_ids = [] for user_id in user_ids: group_owner_ids.extend([ group._id for group in Group.by_user(user_id) if group.case_sharing ]) if HQUserType.COMMTRACK in ExpandedMobileWorkerFilterWithAllData.user_types( self.request): user_ids.append("commtrack-system") return user_ids, filter(None, group_owner_ids)
def location_reporting_owner_ids(self): """ Include all users that are assigned to the selected locations or those locations descendants. """ from corehq.apps.locations.models import SQLLocation, LOCATION_REPORTING_PREFIX from corehq.apps.users.models import CommCareUser results = [] selected_location_group_ids = EMWF.selected_location_reporting_group_ids(self.request) for group_id in selected_location_group_ids: loc = SQLLocation.objects.get( location_id=group_id.replace(LOCATION_REPORTING_PREFIX, '') ) for l in [loc] + list(loc.get_descendants()): users = CommCareUser.get_db().view( 'locations/users_by_location_id', startkey=[l.location_id], endkey=[l.location_id, {}], include_docs=True ).all() results += [u['id'] for u in users] return results
def location_sharing_owner_ids(self): """ For now (and hopefully for always) the only owner id that is important for case sharing group selection is that actual group id. """ return EMWF.selected_location_sharing_group_ids(self.request)
def build_query(self, case_type=None, afilter=None, status=None, owner_ids=None, user_ids=None, search_string=None): owner_ids = owner_ids or [] user_ids = user_ids or [] def _filter_gen(key, flist): return {"terms": {key: [item.lower() for item in flist if item]}} def _domain_term(): return {"term": {"domain.exact": self.domain}} subterms = [_domain_term(), afilter] if afilter else [_domain_term()] if case_type: subterms.append({"term": {"type.exact": case_type}}) if status: subterms.append({"term": {"closed": (status == 'closed')}}) if not ExpandedMobileWorkerFilterWithAllData.show_all_data( self.request): owner_filters = _filter_gen('owner_id', owner_ids) user_filters = _filter_gen('user_id', user_ids) filters = filter(None, [owner_filters, user_filters]) if filters: subterms.append({'or': filters}) if search_string: query_block = { "query_string": { "query": search_string } } # todo, make sure this doesn't suck else: query_block = {"match_all": {}} and_block = {'and': subterms} if subterms else {} es_query = { 'query': { 'filtered': { 'query': query_block, 'filter': and_block } }, 'sort': self.get_sorting_block(), 'from': self.pagination.start, 'size': self.pagination.count, } return es_query
def build_query(self, case_type=None, afilter=None, status=None, owner_ids=None, user_ids=None, search_string=None): owner_ids = owner_ids or [] user_ids = user_ids or [] def _filter_gen(key, flist): return {"terms": { key: [item.lower() for item in flist if item] }} def _domain_term(): return {"term": {"domain.exact": self.domain}} subterms = [_domain_term(), afilter] if afilter else [_domain_term()] subterms.append({"not": {"term": {"type.exact": "user-owner-mapping-case"}}}) if case_type: subterms.append({"term": {"type.exact": case_type}}) if status: subterms.append({"term": {"closed": (status == 'closed')}}) if not EMWF.show_all_data(self.request): owner_filters = _filter_gen('owner_id', owner_ids) user_filters = _filter_gen('user_id', user_ids) filters = filter(None, [owner_filters, user_filters]) if filters: subterms.append({'or': filters}) if search_string: query_block = { "query_string": {"query": search_string}} # todo, make sure this doesn't suck else: query_block = {"match_all": {}} and_block = {'and': subterms} if subterms else {} es_query = { 'query': { 'filtered': { 'query': query_block, 'filter': and_block } }, 'sort': self.get_sorting_block(), 'from': self.pagination.start, 'size': self.pagination.count, } return es_query