def _create_user_filter(self, user_types, user_ids, group_ids, location_ids): all_user_filters = None user_type_filters = self._get_user_type_filters(user_types) user_id_filter = self._get_users_filter(user_ids) group_filter = self._get_group_filter(group_ids) location_filter = self._get_locations_filter(location_ids) if not location_filter and not group_filter: group_and_location_metafilter = None elif FILTER_ON_GROUPS_AND_LOCATIONS.enabled( self.domain_object.name) and location_ids and group_ids: group_and_location_metafilter = AND(group_filter, location_filter) else: group_and_location_metafilter = OR( *list(filter(None, [group_filter, location_filter]))) if group_and_location_metafilter or user_id_filter or user_type_filters: all_user_filter_list = [ group_and_location_metafilter, user_id_filter ] if user_type_filters: all_user_filter_list += user_type_filters all_user_filters = OR(*list(filter(None, all_user_filter_list))) return all_user_filters
def _get_filters_from_slugs(self, mobile_user_and_group_slugs, can_access_all_locations): """ for full organization access: for selected groups return group ids and groups user ids otherwise fetches case sharing groups and locations ids for restricted access: fetches case sharing location ids :return: set of filters using OwnerFilter and LastModifiedByFilter along with group independent filters """ group_ids = None if can_access_all_locations: group_ids = self._get_group_ids(mobile_user_and_group_slugs) owner_filter_ids = [] last_modified_filter_ids = [] if group_ids: groups_static_user_ids = Group.get_static_user_ids_for_groups(group_ids) groups_static_user_ids = flatten_non_iterable_list(groups_static_user_ids) owner_filter_ids = group_ids + groups_static_user_ids last_modified_filter_ids = groups_static_user_ids return [OR( OwnerFilter(owner_filter_ids), LastModifiedByFilter(last_modified_filter_ids), *self._get_group_independent_filters(mobile_user_and_group_slugs, can_access_all_locations) )]
def _scope_filter(self, accessible_location_ids): # Filter to be applied in AND with filters for export to add scope for restricted user # Restricts to cases owned by accessible locations and their respective users Or Cases # Last Modified by accessible users accessible_user_ids = user_ids_at_locations(list(accessible_location_ids)) accessible_ids = accessible_user_ids + list(accessible_location_ids) return OR(OwnerFilter(accessible_ids), LastModifiedByFilter(accessible_user_ids))
def test_or_filter(self): self.assertEqual( OR(OwnerFilter("foo"), OwnerFilter("bar")).to_es_filter(), { 'or': ( {'term': {'owner_id': 'foo'}}, {'term': {'owner_id': 'bar'}} ) } )
def get_case_filter(self): group = self._get_group() if group: user_ids = set(group.get_static_user_ids()) case_filter = [OR( OwnerFilter(group._id), OwnerFilter(user_ids), LastModifiedByFilter(user_ids) )] else: case_sharing_groups = [g.get_id for g in Group.get_case_sharing_groups(self.domain_object.name)] case_filter = [OR( OwnerTypeFilter(self._get_es_user_types()), OwnerFilter(case_sharing_groups), LastModifiedByFilter(case_sharing_groups) )] date_filter = self._get_datespan_filter() if date_filter: case_filter.append(date_filter) return case_filter
def get_form_filter(self, mobile_user_and_group_slugs, can_access_all_locations): """ :param mobile_user_and_group_slugs: slug from request like ['g__e80c5e54ab552245457d2546d0cdbb03', 'g__e80c5e54ab552245457d2546d0cdbb04', 'u__e80c5e54ab552245457d2546d0cdbb05', 't__1'] :param can_access_all_locations: if request user has full organization access permission :return: set of form filters for export :filters: OR for full access: group's user ids via GroupFormSubmittedByFilter, users under user types, users by user_ids, users at locations and their descendants for restrict access: users by user_ids users at locations and their descendants AND datespan filter """ form_filters = [] if can_access_all_locations: form_filters += filter(None, [ self._get_group_filter(mobile_user_and_group_slugs), self._get_user_type_filter(mobile_user_and_group_slugs), ]) form_filters += filter(None, [ self._get_users_filter(mobile_user_and_group_slugs), self._get_locations_filter(mobile_user_and_group_slugs) ]) form_filters = flatten_non_iterable_list(form_filters) if form_filters: form_filters = [OR(*form_filters)] form_filters.append(self._get_datespan_filter()) return form_filters