Пример #1
0
    def case_owners(self):
        # Get user ids for each user that match the demo_user, admin,
        # Unknown Users, or All Mobile Workers filters
        mobile_user_and_group_slugs = self.request.GET.getlist(EMWF.slug)
        user_types = EMWF.selected_user_types(mobile_user_and_group_slugs)
        special_owner_ids = self.get_special_owner_ids(
            admin=HQUserType.ADMIN in user_types,
            unknown=HQUserType.UNKNOWN in user_types,
            demo=HQUserType.DEMO_USER in user_types,
            commtrack=HQUserType.COMMTRACK in user_types,
        )

        # Get user ids for each user that was specifically selected
        selected_user_ids = EMWF.selected_user_ids(mobile_user_and_group_slugs)

        # Get group ids for each group that was specified
        selected_reporting_group_ids = EMWF.selected_reporting_group_ids(
            mobile_user_and_group_slugs)
        selected_sharing_group_ids = EMWF.selected_sharing_group_ids(
            mobile_user_and_group_slugs)

        # Show cases owned by any selected locations, user locations, or their children
        loc_ids = set(
            EMWF.selected_location_ids(mobile_user_and_group_slugs) +
            get_users_location_ids(self.domain, selected_user_ids))
        location_owner_ids = get_locations_and_children(loc_ids).location_ids()

        # 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").term("case_sharing", True).term(
                "users",
                (selected_reporting_group_users + selected_user_ids)).fields(
                    []))
        sharing_group_ids = share_group_q.run().doc_ids

        owner_ids = list(set().union(
            special_owner_ids,
            selected_user_ids,
            selected_sharing_group_ids,
            selected_reporting_group_users,
            sharing_group_ids,
            location_owner_ids,
        ))
        return owner_ids
Пример #2
0
    def case_owners(self):
        # Get user ids for each user that match the demo_user, admin,
        # Unknown Users, or All Mobile Workers filters
        mobile_user_and_group_slugs = self.request.GET.getlist(EMWF.slug)
        user_types = EMWF.selected_user_types(mobile_user_and_group_slugs)
        special_owner_ids = self.get_special_owner_ids(
            admin=HQUserType.ADMIN in user_types,
            unknown=HQUserType.UNKNOWN in user_types,
            demo=HQUserType.DEMO_USER in user_types,
            commtrack=HQUserType.COMMTRACK in user_types,
        )

        # Get user ids for each user that was specifically selected
        selected_user_ids = EMWF.selected_user_ids(mobile_user_and_group_slugs)

        # Get group ids for each group that was specified
        selected_reporting_group_ids = EMWF.selected_reporting_group_ids(mobile_user_and_group_slugs)
        selected_sharing_group_ids = EMWF.selected_sharing_group_ids(mobile_user_and_group_slugs)

        # Show cases owned by any selected locations, user locations, or their children
        loc_ids = set(EMWF.selected_location_ids(mobile_user_and_group_slugs) +
                      get_users_location_ids(self.domain, selected_user_ids))
        location_owner_ids = get_locations_and_children(loc_ids).location_ids()

        # 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")
                         .term("case_sharing", True)
                         .term("users", (selected_reporting_group_users +
                                         selected_user_ids))
                         .fields([]))
        sharing_group_ids = share_group_q.run().doc_ids

        owner_ids = list(set().union(
            special_owner_ids,
            selected_user_ids,
            selected_sharing_group_ids,
            selected_reporting_group_users,
            sharing_group_ids,
            location_owner_ids,
        ))
        return owner_ids
Пример #3
0
    def _to_case_export_instance_filters(self, can_access_all_locations,
                                         accessible_location_ids):
        emwf_selections = self.cleaned_data["emwf_case_filter"]

        return CaseExportInstanceFilters(
            date_period=DatePeriod(
                period_type=self.cleaned_data['date_range'],
                days=self.cleaned_data['days'],
                begin=self.cleaned_data['start_date'],
                end=self.cleaned_data['end_date'],
            ),
            users=CaseListFilter.selected_user_ids(emwf_selections),
            reporting_groups=CaseListFilter.selected_reporting_group_ids(
                emwf_selections),
            locations=CaseListFilter.selected_location_ids(emwf_selections),
            user_types=CaseListFilter.selected_user_types(emwf_selections),
            can_access_all_locations=can_access_all_locations,
            accessible_location_ids=accessible_location_ids,
            sharing_groups=CaseListFilter.selected_sharing_group_ids(
                emwf_selections),
            show_all_data=CaseListFilter.show_all_data(emwf_selections)
            or CaseListFilter.no_filters_selected(emwf_selections),
            show_project_data=CaseListFilter.show_project_data(
                emwf_selections),
        )
Пример #4
0
    def _build_query(self):
        query = (self.search_class()
                 .domain(self.domain)
                 .size(self.pagination.count)
                 .start(self.pagination.start))
        query.es_query['sort'] = self.get_sorting_block()
        mobile_user_and_group_slugs = self.request.GET.getlist(EMWF.slug)
        user_types = EMWF.selected_user_types(mobile_user_and_group_slugs)

        if self.case_filter:
            query = query.filter(self.case_filter)

        query = query.NOT(case_es.case_type("user-owner-mapping-case"))

        if self.case_type:
            query = query.case_type(self.case_type)

        if self.case_status:
            query = query.is_closed(self.case_status == 'closed')

        if self.request.can_access_all_locations and (EMWF.show_all_data(mobile_user_and_group_slugs) or
                                                      EMWF.no_filters_selected(mobile_user_and_group_slugs)):
            pass
        elif self.request.can_access_all_locations and EMWF.show_project_data(mobile_user_and_group_slugs):
            # Show everything but stuff we know for sure to exclude
            ids_to_exclude = self.get_special_owner_ids(
                admin=HQUserType.ADMIN not in user_types,
                unknown=HQUserType.UNKNOWN not in user_types,
                web=HQUserType.WEB not in user_types,
                demo=HQUserType.DEMO_USER not in user_types,
                commtrack=False,
            )
            query = query.NOT(case_es.owner(ids_to_exclude))
        elif self.request.can_access_all_locations and EMWF.show_deactivated_data(mobile_user_and_group_slugs):
            owner_ids = (user_es.UserES()
                         .show_only_inactive()
                         .domain(self.domain)
                         .get_ids())
            query = query.OR(case_es.owner(owner_ids))
        else:  # Only show explicit matches
            query = query.owner(self.case_owners)

        if not self.request.can_access_all_locations:
            query = query.OR(self.scope_filter())

        search_string = CaseSearchFilter.get_value(self.request, self.domain)
        if search_string:
            query = query.set_query({"query_string": {"query": search_string}})

        return query
Пример #5
0
    def _build_query(self):
        query = (self.search_class().domain(self.domain).size(
            self.pagination.count).start(self.pagination.start))
        query.es_query['sort'] = self.get_sorting_block()
        mobile_user_and_group_slugs = self.request.GET.getlist(EMWF.slug)
        user_types = EMWF.selected_user_types(mobile_user_and_group_slugs)

        if self.case_filter:
            query = query.filter(self.case_filter)

        query = query.NOT(case_es.case_type("user-owner-mapping-case"))

        if self.case_type:
            query = query.case_type(self.case_type)

        if self.case_status:
            query = query.is_closed(self.case_status == 'closed')

        if self.request.can_access_all_locations and (
                EMWF.show_all_data(mobile_user_and_group_slugs)
                or EMWF.no_filters_selected(mobile_user_and_group_slugs)):
            pass
        elif self.request.can_access_all_locations and EMWF.show_project_data(
                mobile_user_and_group_slugs):
            # Show everything but stuff we know for sure to exclude
            ids_to_exclude = self.get_special_owner_ids(
                admin=HQUserType.ADMIN not in user_types,
                unknown=HQUserType.UNKNOWN not in user_types,
                web=HQUserType.WEB not in user_types,
                demo=HQUserType.DEMO_USER not in user_types,
                commtrack=False,
            )
            query = query.NOT(case_es.owner(ids_to_exclude))
        elif self.request.can_access_all_locations and EMWF.show_deactivated_data(
                mobile_user_and_group_slugs):
            owner_ids = (user_es.UserES().show_only_inactive().domain(
                self.domain).get_ids())
            query = query.OR(case_es.owner(owner_ids))
        else:  # Only show explicit matches
            query = query.owner(self.case_owners)

        if not self.request.can_access_all_locations:
            query = query.OR(self.scope_filter())

        search_string = CaseSearchFilter.get_value(self.request, self.domain)
        if search_string:
            query = query.set_query({"query_string": {"query": search_string}})

        return query
Пример #6
0
    def get_filtered_query(self, query):
        if self.request.can_access_all_locations and (EMWF.show_all_data(
                self.value) or EMWF.no_filters_selected(self.value)):
            return query

        if self.request.can_access_all_locations and EMWF.show_project_data(
                self.value):
            return query_all_project_data(query, self.domain, self.value)

        if self.request.can_access_all_locations and EMWF.show_deactivated_data(
                self.value):
            return query_deactivated_data(query, self.domain)

        # otherwise only return explicit matches
        case_owners = get_case_owners(self.request, self.domain, self.value)
        return query.owner(case_owners)
Пример #7
0
    def get_filtered_query(self, query):
        if self.request.can_access_all_locations and (
            EMWF.show_all_data(self.value)
            or EMWF.no_filters_selected(self.value)
        ):
            return query

        if self.request.can_access_all_locations and EMWF.show_project_data(self.value):
            return query.filter(all_project_data_filter(self.domain, self.value))

        if self.request.can_access_all_locations and EMWF.show_deactivated_data(self.value):
            return query.filter(deactivated_case_owners(self.domain))

        selected_user_types = [v['id'] for v in self.value]
        case_owners = get_case_owners(self.request, self.domain, selected_user_types)
        return query.owner(case_owners)
Пример #8
0
 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_sharing_location_ids(self.request)
Пример #9
0
    def get_filtered_query(self, query):
        if self.request.can_access_all_locations and (
            EMWF.show_all_data(self.value)
            or EMWF.no_filters_selected(self.value)
        ):
            return query

        if self.request.can_access_all_locations and EMWF.show_project_data(self.value):
            return query_all_project_data(query, self.domain, self.value)

        if self.request.can_access_all_locations and EMWF.show_deactivated_data(self.value):
            return query_deactivated_data(query, self.domain)

        # otherwise only return explicit matches
        case_owners = get_case_owners(self.request, self.domain, self.value)
        return query.owner(case_owners)
Пример #10
0
    def _build_query(self):
        query = (self.search_class()
                 .domain(self.domain)
                 .size(self.pagination.count)
                 .start(self.pagination.start))
        query.es_query['sort'] = self.get_sorting_block()
        mobile_user_and_group_slugs = self.request.GET.getlist(EMWF.slug)

        if self.case_filter:
            query = query.filter(self.case_filter)

        query = query.NOT(case_es.case_type("user-owner-mapping-case"))

        if self.case_type:
            query = query.case_type(self.case_type)

        if self.case_status:
            query = query.is_closed(self.case_status == 'closed')

        if self.request.can_access_all_locations and (
                EMWF.show_all_data(mobile_user_and_group_slugs)
                or EMWF.no_filters_selected(mobile_user_and_group_slugs)
        ):
            pass

        elif (self.request.can_access_all_locations
              and EMWF.show_project_data(mobile_user_and_group_slugs)):
            query = query_all_project_data(
                query, self.domain, mobile_user_and_group_slugs
            )

        elif (self.request.can_access_all_locations
              and EMWF.show_deactivated_data(mobile_user_and_group_slugs)):
            query = query_deactivated_data(query, self.domain)

        else:  # Only show explicit matches
            query = query.owner(self.case_owners)

        if not self.request.can_access_all_locations:
            query = query_location_restricted_cases(query, self.request)

        search_string = CaseSearchFilter.get_value(self.request, self.domain)
        if search_string:
            query = query.set_query({"query_string": {"query": search_string}})

        return query
Пример #11
0
    def _build_query(self):
        query = (self.search_class()
                 .domain(self.domain)
                 .size(self.pagination.count)
                 .start(self.pagination.start))
        query.es_query['sort'] = self.get_sorting_block()
        mobile_user_and_group_slugs = self.request.GET.getlist(EMWF.slug)

        if self.case_filter:
            query = query.filter(self.case_filter)

        query = query.NOT(case_es.case_type("user-owner-mapping-case"))

        if self.case_type:
            query = query.case_type(self.case_type)

        if self.case_status:
            query = query.is_closed(self.case_status == 'closed')

        if self.request.can_access_all_locations and (
                EMWF.show_all_data(mobile_user_and_group_slugs)
                or EMWF.no_filters_selected(mobile_user_and_group_slugs)
        ):
            pass

        elif (self.request.can_access_all_locations
              and EMWF.show_project_data(mobile_user_and_group_slugs)):
            query = query_all_project_data(
                query, self.domain, mobile_user_and_group_slugs
            )

        elif (self.request.can_access_all_locations
              and EMWF.show_deactivated_data(mobile_user_and_group_slugs)):
            query = query_deactivated_data(query, self.domain)

        else:  # Only show explicit matches
            query = query.owner(self.case_owners)

        if not self.request.can_access_all_locations:
            query = query_location_restricted_cases(query, self.request)

        search_string = CaseSearchFilter.get_value(self.request, self.domain)
        if search_string:
            query = query.set_query({"query_string": {"query": search_string}})

        return query
Пример #12
0
def query_all_project_data(query, domain, mobile_user_and_group_slugs):
    # Show everything but stuff we know for sure to exclude
    user_types = EMWF.selected_user_types(mobile_user_and_group_slugs)
    ids_to_exclude = _get_special_owner_ids(
        domain=domain,
        admin=HQUserType.ADMIN not in user_types,
        unknown=HQUserType.UNKNOWN not in user_types,
        web=HQUserType.WEB not in user_types,
        demo=HQUserType.DEMO_USER not in user_types,
        commtrack=False,
    )
    return query.NOT(case_es.owner(ids_to_exclude))
Пример #13
0
def query_all_project_data(query, domain, mobile_user_and_group_slugs):
    # Show everything but stuff we know for sure to exclude
    user_types = EMWF.selected_user_types(mobile_user_and_group_slugs)
    ids_to_exclude = _get_special_owner_ids(
        domain=domain,
        admin=HQUserType.ADMIN not in user_types,
        unknown=HQUserType.UNKNOWN not in user_types,
        web=HQUserType.WEB not in user_types,
        demo=HQUserType.DEMO_USER not in user_types,
        commtrack=False,
    )
    return query.NOT(case_es.owner(ids_to_exclude))
Пример #14
0
    def _build_query(self):
        query = (case_es.CaseES()
                 .domain(self.domain)
                 .size(self.pagination.count)
                 .start(self.pagination.start))
        query.es_query['sort'] = self.get_sorting_block()

        if self.case_filter:
            query = query.filter(self.case_filter)

        query = query.NOT(case_es.case_type("user-owner-mapping-case"))

        if self.case_type:
            query = query.case_type(self.case_type)

        if self.case_status:
            query = query.is_closed(self.case_status == 'closed')

        if EMWF.show_all_data(self.request):
            pass
        elif EMWF.show_project_data(self.request):
            # Show everything but stuff we know for sure to exclude
            user_types = EMWF.selected_user_types(self.request)
            ids_to_exclude = self.get_special_owner_ids(
                admin=HQUserType.ADMIN not in user_types,
                unknown=HQUserType.UNKNOWN not in user_types,
                demo=HQUserType.DEMO_USER not in user_types,
                commtrack=False,
            )
            query = query.NOT(case_es.owner(ids_to_exclude))
        else:  # Only show explicit matches
            query = query.owner(self.case_owners)

        search_string = SearchFilter.get_value(self.request, self.domain)
        if search_string:
            query = query.set_query({"query_string": {"query": search_string}})

        return query
Пример #15
0
    def _build_query(self):
        query = (case_es.CaseES()
                 .domain(self.domain)
                 .size(self.pagination.count)
                 .start(self.pagination.start))
        query.es_query['sort'] = self.get_sorting_block()

        if self.case_filter:
            query = query.filter(self.case_filter)

        query = query.NOT(case_es.case_type("user-owner-mapping-case"))

        if self.case_type:
            query = query.case_type(self.case_type)

        if self.case_status:
            query = query.is_closed(self.case_status == 'closed')

        if EMWF.show_all_data(self.request):
            pass
        elif EMWF.show_project_data(self.request):
            # Show everything but stuff we know for sure to exclude
            user_types = EMWF.selected_user_types(self.request)
            ids_to_exclude = self.get_special_owner_ids(
                admin=HQUserType.ADMIN not in user_types,
                unknown=HQUserType.UNKNOWN not in user_types,
                demo=HQUserType.DEMO_USER not in user_types,
                commtrack=False,
            )
            query = query.NOT(case_es.owner(ids_to_exclude))
        else:  # Only show explicit matches
            query = query.owner(self.case_owners)

        search_string = SearchFilter.get_value(self.request, self.domain)
        if search_string:
            query = query.set_query({"query_string": {"query": search_string}})

        return query
Пример #16
0
    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
        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.get_descendants(include_self=True):
                results += get_user_ids_by_location(l.location_id)

        return results
Пример #17
0
    def _to_case_export_instance_filters(self, can_access_all_locations, accessible_location_ids):
        emwf_selections = [x['id'] for x in self.cleaned_data["emwf_case_filter"]]

        return CaseExportInstanceFilters(
            date_period=DatePeriod(
                period_type=self.cleaned_data['date_range'],
                days=self.cleaned_data['days'],
                begin=self.cleaned_data['start_date'],
                end=self.cleaned_data['end_date'],
            ),
            users=CaseListFilter.selected_user_ids(emwf_selections),
            reporting_groups=CaseListFilter.selected_reporting_group_ids(emwf_selections),
            locations=CaseListFilter.selected_location_ids(emwf_selections),
            user_types=CaseListFilter.selected_user_types(emwf_selections),
            can_access_all_locations=can_access_all_locations,
            accessible_location_ids=accessible_location_ids,
            sharing_groups=CaseListFilter.selected_sharing_group_ids(emwf_selections),
            show_all_data=CaseListFilter.show_all_data(emwf_selections) or
            CaseListFilter.no_filters_selected(emwf_selections),
            show_project_data=CaseListFilter.show_project_data(emwf_selections),
        )
Пример #18
0
def get_case_owners(request, domain, mobile_user_and_group_slugs):
    """
    For unrestricted user
    :return:
    user ids for selected user types
    for selected reporting group ids, returns user_ids belonging to these groups
        also finds the sharing groups which has any user from the above reporting group
    selected sharing group ids
    selected user ids
        also finds the sharing groups which has any user from the above selected users
        ids and descendants ids of assigned locations to these users
    ids and descendants ids of selected locations
        assigned users at selected locations and their descendants

    For restricted user
    :return:
    selected user ids
        also finds the sharing groups which has any user from the above selected users
        ids and descendants ids of assigned locations to these users
    ids and descendants ids of selected locations
        assigned users at selected locations and their descendants
    """
    special_owner_ids, selected_sharing_group_ids, selected_reporting_group_users = [], [], []
    sharing_group_ids, location_owner_ids, assigned_user_ids_at_selected_locations = [], [], []

    if request.can_access_all_locations:
        user_types = EMWF.selected_user_types(mobile_user_and_group_slugs)

        special_owner_ids = _get_special_owner_ids(
            domain=domain,
            admin=HQUserType.ADMIN in user_types,
            unknown=HQUserType.UNKNOWN in user_types,
            web=HQUserType.WEB in user_types,
            demo=HQUserType.DEMO_USER in user_types,
            commtrack=HQUserType.COMMTRACK in user_types,
        )

        # Get group ids for each group that was specified
        selected_reporting_group_ids = EMWF.selected_reporting_group_ids(
            mobile_user_and_group_slugs)
        selected_sharing_group_ids = EMWF.selected_sharing_group_ids(
            mobile_user_and_group_slugs)

        # Get user ids for each user in specified reporting groups
        selected_reporting_group_users = []
        if selected_reporting_group_ids:
            report_group_q = (HQESQuery(
                index="groups").domain(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 user ids for each user that was specifically selected
    selected_user_ids = EMWF.selected_user_ids(mobile_user_and_group_slugs)

    # Show cases owned by any selected locations, user locations, or their children
    loc_ids = set(EMWF.selected_location_ids(mobile_user_and_group_slugs))

    if loc_ids:
        # Get users at selected locations and descendants
        assigned_user_ids_at_selected_locations = user_ids_at_locations_and_descendants(
            loc_ids)
        # Get user ids for each user in specified reporting groups

    if selected_user_ids:
        loc_ids.update(get_users_location_ids(domain, selected_user_ids))

    location_owner_ids = []
    if loc_ids:
        location_owner_ids = SQLLocation.objects.get_locations_and_children_ids(
            loc_ids)

    sharing_group_ids = []
    if selected_reporting_group_users or selected_user_ids:
        # Get ids for each sharing group that contains a user from
        # selected_reporting_group_users OR a user that was specifically selected
        sharing_group_ids = (HQESQuery(
            index="groups").domain(domain).doc_type("Group").term(
                "case_sharing", True).term("users",
                                           (selected_reporting_group_users +
                                            selected_user_ids)).get_ids())

    owner_ids = list(set().union(
        special_owner_ids,
        selected_user_ids,
        selected_sharing_group_ids,
        selected_reporting_group_users,
        sharing_group_ids,
        location_owner_ids,
        assigned_user_ids_at_selected_locations,
    ))
    return owner_ids
Пример #19
0
    def case_owners(self):
        """
        For unrestricted user
        :return:
        user ids for selected user types
        for selected reporting group ids, returns user_ids belonging to these groups
            also finds the sharing groups which has any user from the above reporting group
        selected sharing group ids
        selected user ids
            also finds the sharing groups which has any user from the above selected users
            ids and descendants ids of assigned locations to these users
        ids and descendants ids of selected locations
            assigned users at selected locations and their descendants

        For restricted user
        :return:
        selected user ids
            also finds the sharing groups which has any user from the above selected users
            ids and descendants ids of assigned locations to these users
        ids and descendants ids of selected locations
            assigned users at selected locations and their descendants
        """
        # Get user ids for each user that match the demo_user, admin,
        # Unknown Users, or All Mobile Workers filters
        mobile_user_and_group_slugs = self.request.GET.getlist(EMWF.slug)
        special_owner_ids, selected_sharing_group_ids, selected_reporting_group_users = [], [], []
        sharing_group_ids, location_owner_ids, assigned_user_ids_at_selected_locations = [], [], []
        if self.request.can_access_all_locations:
            user_types = EMWF.selected_user_types(mobile_user_and_group_slugs)
            special_owner_ids = self.get_special_owner_ids(
                admin=HQUserType.ADMIN in user_types,
                unknown=HQUserType.UNKNOWN in user_types,
                web=HQUserType.WEB in user_types,
                demo=HQUserType.DEMO_USER in user_types,
                commtrack=HQUserType.COMMTRACK in user_types,
            )

            # Get group ids for each group that was specified
            selected_reporting_group_ids = EMWF.selected_reporting_group_ids(mobile_user_and_group_slugs)
            selected_sharing_group_ids = EMWF.selected_sharing_group_ids(mobile_user_and_group_slugs)

            # Get user ids for each user in specified reporting groups
            selected_reporting_group_users = []
            if selected_reporting_group_ids:
                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 user ids for each user that was specifically selected
        selected_user_ids = EMWF.selected_user_ids(mobile_user_and_group_slugs)

        # Show cases owned by any selected locations, user locations, or their children
        loc_ids = set(EMWF.selected_location_ids(mobile_user_and_group_slugs))

        if loc_ids:
            # Get users at selected locations and descendants
            assigned_user_ids_at_selected_locations = user_ids_at_locations_and_descendants(loc_ids)
            # Get user ids for each user in specified reporting groups

        if selected_user_ids:
            loc_ids.update(get_users_location_ids(self.domain, selected_user_ids))

        location_owner_ids = []
        if loc_ids:
            location_owner_ids = SQLLocation.objects.get_locations_and_children_ids(loc_ids)

        sharing_group_ids = []
        if selected_reporting_group_users or selected_user_ids:
            # Get ids for each sharing group that contains a user from selected_reporting_group_users
            # OR a user that was specifically selected
            sharing_group_ids = (HQESQuery(index="groups")
                                 .domain(self.domain)
                                 .doc_type("Group")
                                 .term("case_sharing", True)
                                 .term("users", (selected_reporting_group_users +
                                                 selected_user_ids))
                                 .get_ids())

        owner_ids = list(set().union(
            special_owner_ids,
            selected_user_ids,
            selected_sharing_group_ids,
            selected_reporting_group_users,
            sharing_group_ids,
            location_owner_ids,
            assigned_user_ids_at_selected_locations,
        ))
        return owner_ids