Ejemplo n.º 1
0
 def test_get_assigned_locations_default(self, assigned_locations_patch):
     assigned_locations_patch.return_value = self.user_assigned_locations
     emwf = ExpandedMobileWorkerFilter(self.request)
     loc_defaults = emwf._get_assigned_locations_default()
     self.assertEqual(
         loc_defaults,
         list(map(emwf.utils.location_tuple, self.user_assigned_locations)))
Ejemplo n.º 2
0
 def test_default_selections_for_restricted_access(
         self, assigned_locations_patch):
     self.request.can_access_all_locations = False
     self.request.project = self.domain
     emwf = ExpandedMobileWorkerFilter(self.request)
     emwf.get_default_selections()
     assert assigned_locations_patch.called
Ejemplo n.º 3
0
    def _get_users_filter(self, mobile_user_and_group_slugs):
        user_ids = (EMWF.user_es_query(
            self.domain, mobile_user_and_group_slugs,
            self.request.couch_user).values_list('_id', flat=True))

        if HQUserType.UNKNOWN in EMWF.selected_user_types(
                mobile_user_and_group_slugs):
            user_ids.append(SYSTEM_USER_ID)

        return form_es.user_id(user_ids)
Ejemplo n.º 4
0
    def _get_users_filter(self, mobile_user_and_group_slugs):
        user_ids = (EMWF.user_es_query(self.domain,
                                       mobile_user_and_group_slugs,
                                       self.request.couch_user)
                    .values_list('_id', flat=True))

        if HQUserType.UNKNOWN in EMWF.selected_user_types(mobile_user_and_group_slugs):
            user_ids.append(SYSTEM_USER_ID)

        return form_es.user_id(user_ids)
Ejemplo n.º 5
0
    def _es_extra_filters(self):
        if FormsByApplicationFilter.has_selections(self.request):

            def form_filter(form):
                app_id = form.get('app_id', None)
                if app_id and app_id != MISSING_APP_ID:
                    return {
                        'and': [{
                            'term': {
                                'xmlns.exact': form['xmlns']
                            }
                        }, {
                            'term': {
                                'app_id': app_id
                            }
                        }]
                    }
                return {'term': {'xmlns.exact': form['xmlns']}}

            form_values = self.all_relevant_forms.values()
            if form_values:
                yield {'or': [form_filter(f) for f in form_values]}

        truthy_only = functools.partial(filter, None)
        mobile_user_and_group_slugs = self.request.GET.getlist(
            ExpandedMobileWorkerFilter.slug)
        users_data = ExpandedMobileWorkerFilter.pull_users_and_groups(
            self.domain, mobile_user_and_group_slugs, include_inactive=True)
        all_mobile_workers_selected = 't__0' in self.request.GET.getlist('emw')
        if not all_mobile_workers_selected or users_data.admin_and_demo_users:
            yield {
                'terms': {
                    'form.meta.userID':
                    truthy_only(u.user_id for u in users_data.combined_users)
                }
            }
        else:
            negated_ids = util.get_all_users_by_domain(
                self.domain,
                user_filter=HQUserType.all_but_users(),
                simplified=True,
            )
            yield {
                'not': {
                    'terms': {
                        'form.meta.userID':
                        truthy_only(user.user_id for user in negated_ids)
                    }
                }
            }

        if HQUserType.UNKNOWN not in ExpandedMobileWorkerFilter.selected_user_types(
                mobile_user_and_group_slugs):
            yield {'not': {'term': {'xmlns.exact': SYSTEM_FORM_XMLNS}}}
Ejemplo n.º 6
0
    def _es_extra_filters(self):
        if FormsByApplicationFilter.has_selections(self.request):
            def form_filter(form):
                app_id = form.get('app_id', None)
                if app_id and app_id != MISSING_APP_ID:
                    return {'and': [{'term': {'xmlns.exact': form['xmlns']}},
                                    {'term': {'app_id': app_id}}]}
                return {'term': {'xmlns.exact': form['xmlns']}}
            form_values = self.all_relevant_forms.values()
            if form_values:
                yield {'or': [form_filter(f) for f in form_values]}

        truthy_only = functools.partial(filter, None)
        mobile_user_and_group_slugs = self.request.GET.getlist(ExpandedMobileWorkerFilter.slug)
        users_data = ExpandedMobileWorkerFilter.pull_users_and_groups(
            self.domain,
            mobile_user_and_group_slugs,
            include_inactive=True
        )
        all_mobile_workers_selected = 't__0' in self.request.GET.getlist('emw')
        if not all_mobile_workers_selected or users_data.admin_and_demo_users:
            yield {
                'terms': {
                    'form.meta.userID': truthy_only(
                        u.user_id for u in users_data.combined_users
                    )
                }
            }
        else:
            negated_ids = util.get_all_users_by_domain(
                self.domain,
                user_filter=HQUserType.all_but_users(),
                simplified=True,
            )
            yield {
                'not': {
                    'terms': {
                        'form.meta.userID': truthy_only(
                            user.user_id for user in negated_ids
                        )
                    }
                }
            }

        props = truthy_only(self.request.GET.get('form_data', '').split(','))
        for prop in props:
            yield {
                'term': {'__props_for_querying': prop}
            }

        if HQUserType.UNKNOWN not in ExpandedMobileWorkerFilter.selected_user_types(mobile_user_and_group_slugs):
            yield {
                'not': {'term': {'xmlns.exact': SYSTEM_FORM_XMLNS}}
            }
Ejemplo n.º 7
0
 def case_users_and_owners(self):
     users_data = ExpandedMobileWorkerFilter.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 ExpandedMobileWorkerFilter.user_types(self.request):
         user_ids.append("commtrack-system")
     return user_ids, filter(None, group_owner_ids)
Ejemplo n.º 8
0
 def case_users_and_owners(self):
     users_data = ExpandedMobileWorkerFilter.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 ExpandedMobileWorkerFilter.user_types(
             self.request):
         user_ids.append("commtrack-system")
     return user_ids, filter(None, group_owner_ids)
    def _form_rows(self, domain):
        time_filter = form_es.submitted
        datespan = DateSpan(datetime.now() - timedelta(days=self.window),
                            datetime.utcnow())
        apps = get_brief_apps_in_domain(domain.name)
        apps = {a.id: a.name for a in apps}

        users_filter = form_es.user_id(
            EMWF.user_es_query(
                domain.name,
                ['t__0'],  # All mobile workers
                self.couch_user).values_list('_id', flat=True))
        query = (form_es.FormES().domain(domain.name).filter(
            time_filter(gte=datespan.startdate,
                        lt=datespan.enddate_adjusted)).filter(users_filter))
        rows = []
        for hit in query.run().hits:
            username = hit['form']['meta']['username']
            submitted = self._format_date(
                datetime.strptime(hit['received_on'][:19],
                                  '%Y-%m-%dT%H:%M:%S'))
            rows.append([
                hit['form']['@name'],
                submitted,
                apps[hit['app_id']] if hit['app_id'] in
                apps else 'App not found',
                username,
            ] + self._domain_properties(domain))
        return rows
Ejemplo n.º 10
0
 def case_users_and_owners(self):
     users_data = ExpandedMobileWorkerFilter.pull_users_and_groups(self.domain, self.request, True, True)
     user_ids = filter(None, [u.get("user_id") for u in users_data["combined_users"]])
     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])
     return user_ids, filter(None, group_owner_ids)
Ejemplo n.º 11
0
    def es_query(self):
        if not getattr(self, 'es_response', None):
            q = {
                "query": {
                    "range": {
                        self.time_field: {
                            "from": self.datespan.startdate_param,
                            "to": self.datespan.enddate_param,
                            "include_upper": False}}},
                "filter": {"and": ADD_TO_ES_FILTER["forms"][:]}}

            xmlnss = filter(None, [f["xmlns"] for f in self.all_relevant_forms.values()])
            if xmlnss:
                q["filter"]["and"].append({"terms": {"xmlns.exact": xmlnss}})

            users_data = ExpandedMobileWorkerFilter.pull_users_and_groups(self.domain, self.request, True, True)
            if "t__0" not in self.request.GET.getlist("emw") or users_data["admin_and_demo_users"]:
                q["filter"]["and"].append(
                    {"terms": {"form.meta.userID": filter(None, [u["user_id"] for u in users_data["combined_users"]])}})
            else:
                negated_ids = util.get_all_users_by_domain(self.domain, user_filter=HQUserType.all_but_users(), simplified=True)
                ids = filter(None, [user['user_id'] for user in negated_ids])
                q["filter"]["and"].append({"not": {"terms": {"form.meta.userID": ids}}})

            for cp in filter(None, self.request.GET.get('form_data', "").split(",")):
                q["filter"]["and"].append({"term": {"__props_for_querying": cp.lower()}})

            q["sort"] = self.get_sorting_block() if self.get_sorting_block() else [{self.time_field : {"order": "desc"}}]
            self.es_response = es_query(params={"domain.exact": self.domain}, q=q, es_url=XFORM_INDEX + '/xform/_search',
                start_at=self.pagination.start, size=self.pagination.count)
        return self.es_response
Ejemplo n.º 12
0
 def user_query(self, pagination=True):
     mobile_user_and_group_slugs = set(
         # Cater for old ReportConfigs
         self.request.GET.getlist('location_restricted_mobile_worker') +
         self.request.GET.getlist(ExpandedMobileWorkerFilter.slug))
     user_query = ExpandedMobileWorkerFilter.user_es_query(
         self.domain,
         mobile_user_and_group_slugs,
         self.request.couch_user,
     )
     user_query = (user_query.set_sorting_block(self.get_sorting_block()))
     if pagination:
         user_query = (user_query.size(self.pagination.count).start(
             self.pagination.start))
     if self.selected_app_id:
         # adding nested filter for reporting_metadata.last_submissions.app_id
         # and reporting_metadata.last_syncs.app_id when app is selected
         last_submission_filter = filters.nested(
             'reporting_metadata.last_submissions',
             filters.term('reporting_metadata.last_submissions.app_id',
                          self.selected_app_id))
         last_sync_filter = filters.nested(
             'reporting_metadata.last_syncs',
             filters.term("reporting_metadata.last_syncs.app_id",
                          self.selected_app_id))
         user_query = user_query.OR(last_submission_filter,
                                    last_sync_filter)
     return user_query
Ejemplo n.º 13
0
 def user_query(self, pagination=True):
     mobile_user_and_group_slugs = set(
         # Cater for old ReportConfigs
         self.request.GET.getlist('location_restricted_mobile_worker') +
         self.request.GET.getlist(ExpandedMobileWorkerFilter.slug)
     )
     user_query = ExpandedMobileWorkerFilter.user_es_query(
         self.domain,
         mobile_user_and_group_slugs,
         self.request.couch_user,
     )
     user_query = (user_query
                   .set_sorting_block(self.get_sorting_block()))
     if pagination:
         user_query = (user_query
                       .size(self.pagination.count)
                       .start(self.pagination.start))
     if self.selected_app_id:
         # adding nested filter for reporting_metadata.last_submissions.app_id
         # and reporting_metadata.last_syncs.app_id when app is selected
         last_submission_filter = filters.nested('reporting_metadata.last_submissions',
                                                 filters.term('reporting_metadata.last_submissions.app_id',
                                                              self.selected_app_id)
                                                 )
         last_sync_filter = filters.nested('reporting_metadata.last_syncs',
                                           filters.term("reporting_metadata.last_syncs.app_id",
                                                        self.selected_app_id)
                                           )
         user_query = user_query.OR(last_submission_filter,
                                    last_sync_filter
                                    )
     return user_query
Ejemplo n.º 14
0
    def _to_form_export_instance_filters(self, can_access_all_locations, accessible_location_ids):
        emwf_selections = self.cleaned_data["emwf_form_filter"]

        return FormExportInstanceFilters(
            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=ExpandedMobileWorkerFilter.selected_user_ids(emwf_selections),
            reporting_groups=ExpandedMobileWorkerFilter.selected_reporting_group_ids(emwf_selections),
            locations=ExpandedMobileWorkerFilter.selected_location_ids(emwf_selections),
            user_types=ExpandedMobileWorkerFilter.selected_user_types(emwf_selections),
            can_access_all_locations=can_access_all_locations,
            accessible_location_ids=accessible_location_ids,
        )
Ejemplo n.º 15
0
    def _to_form_export_instance_filters(self, can_access_all_locations, accessible_location_ids):
        emwf_selections = [x['id'] for x in self.cleaned_data["emwf_form_filter"]]

        return FormExportInstanceFilters(
            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=ExpandedMobileWorkerFilter.selected_user_ids(emwf_selections),
            reporting_groups=ExpandedMobileWorkerFilter.selected_reporting_group_ids(emwf_selections),
            locations=ExpandedMobileWorkerFilter.selected_location_ids(emwf_selections),
            user_types=ExpandedMobileWorkerFilter.selected_user_types(emwf_selections),
            can_access_all_locations=can_access_all_locations,
            accessible_location_ids=accessible_location_ids,
        )
Ejemplo n.º 16
0
def is_query_too_big(domain, mobile_user_and_group_slugs):
    from corehq.apps.reports.filters.users import ExpandedMobileWorkerFilter

    user_es_query = ExpandedMobileWorkerFilter.user_es_query(
        domain,
        mobile_user_and_group_slugs,
    )
    return user_es_query.count() > USER_QUERY_LIMIT
Ejemplo n.º 17
0
def is_query_too_big(domain, mobile_user_and_group_slugs, request_user):
    from corehq.apps.reports.filters.users import ExpandedMobileWorkerFilter

    user_es_query = ExpandedMobileWorkerFilter.user_es_query(
        domain,
        mobile_user_and_group_slugs,
        request_user,
    )
    return user_es_query.count() > USER_QUERY_LIMIT
Ejemplo n.º 18
0
 def test_with_web_type_and_active_deactivated_user_slug(self):
     mobile_user_and_group_slugs = ['t__6', 'u__active1', 'u__deactive1']
     user_query = ExpandedMobileWorkerFilter.user_es_query(
         self.domain,
         mobile_user_and_group_slugs,
         self.user,
     )
     user_ids = user_query.values_list('_id', flat=True)
     expected_ids = ['web1', 'active1', 'deactive1']
     self.assertCountEqual(user_ids, expected_ids)
Ejemplo n.º 19
0
 def _get_users_filter(self, mobile_user_and_group_slugs):
     truthy_only = functools.partial(filter, None)
     users_data = EMWF.pull_users_and_groups(self.domain,
                                             mobile_user_and_group_slugs,
                                             include_inactive=True)
     selected_user_types = EMWF.selected_user_types(
         mobile_user_and_group_slugs)
     all_mobile_workers_selected = HQUserType.REGISTERED in selected_user_types
     if not all_mobile_workers_selected or users_data.admin_and_demo_users:
         return form_es.user_id(
             truthy_only(u.user_id for u in users_data.combined_users))
     else:
         negated_ids = util.get_all_users_by_domain(
             self.domain,
             user_filter=HQUserType.all_but_users(),
             simplified=True,
         )
         return es_filters.NOT(
             form_es.user_id(
                 truthy_only(user.user_id for user in negated_ids)))
Ejemplo n.º 20
0
 def get_user_ids(self):
     mobile_user_and_group_slugs = set(
         # Cater for old ReportConfigs
         self.request.GET.getlist('location_restricted_mobile_worker') +
         self.request.GET.getlist(ExpandedMobileWorkerFilter.slug))
     user_ids = ExpandedMobileWorkerFilter.user_es_query(
         self.domain,
         mobile_user_and_group_slugs,
         self.request.couch_user,
     ).values_list('_id', flat=True)
     return user_ids
Ejemplo n.º 21
0
 def report_config(self):
     emw = [u.user_id for u in ExpandedMobileWorkerFilter.pull_users_and_groups(
         self.domain, self.request, True, True).combined_users]
     if self.datespan.enddate - timedelta(days=30) > self.datespan.startdate:
         self.datespan.startdate = self.datespan.enddate - timedelta(days=30)
     config = dict(
         domain=self.domain,
         startdate=self.datespan.startdate,
         enddate=self.datespan.enddate,
         emw=tuple(emw)
     )
     return config
Ejemplo n.º 22
0
    def _es_extra_filters(self):
        if FormsByApplicationFilter.has_selections(self.request):

            def form_filter(form):
                app_id = form.get('app_id', None)
                if app_id and app_id != MISSING_APP_ID:
                    return {
                        'and': [{
                            'term': {
                                'xmlns.exact': form['xmlns']
                            }
                        }, {
                            'term': {
                                'app_id': app_id
                            }
                        }]
                    }
                return {'term': {'xmlns.exact': form['xmlns']}}

            form_values = self.all_relevant_forms.values()
            if form_values:
                yield {'or': [form_filter(f) for f in form_values]}

        truthy_only = functools.partial(filter, None)
        users_data = ExpandedMobileWorkerFilter.pull_users_and_groups(
            self.domain, self.request, True, True, include_inactive=True)
        all_mobile_workers_selected = 't__0' in self.request.GET.getlist('emw')
        if not all_mobile_workers_selected or users_data.admin_and_demo_users:
            yield {
                'terms': {
                    'form.meta.userID':
                    truthy_only(u.user_id for u in users_data.combined_users)
                }
            }
        else:
            negated_ids = util.get_all_users_by_domain(
                self.domain,
                user_filter=HQUserType.all_but_users(),
                simplified=True,
            )
            yield {
                'not': {
                    'terms': {
                        'form.meta.userID':
                        truthy_only(user.user_id for user in negated_ids)
                    }
                }
            }

        props = truthy_only(self.request.GET.get('form_data', '').split(','))
        for prop in props:
            yield {'term': {'__props_for_querying': prop.lower()}}
Ejemplo n.º 23
0
 def _get_users_filter(self, mobile_user_and_group_slugs):
     truthy_only = functools.partial(filter, None)
     users_data = EMWF.pull_users_and_groups(
         self.domain,
         mobile_user_and_group_slugs,
         include_inactive=True
     )
     selected_user_types = EMWF.selected_user_types(mobile_user_and_group_slugs)
     all_mobile_workers_selected = HQUserType.REGISTERED in selected_user_types
     if not all_mobile_workers_selected or users_data.admin_and_demo_users:
         return form_es.user_id(truthy_only(
             u.user_id for u in users_data.combined_users
         ))
     else:
         negated_ids = util.get_all_users_by_domain(
             self.domain,
             user_filter=HQUserType.all_but_users(),
             simplified=True,
         )
         return es_filters.NOT(form_es.user_id(truthy_only(
             user.user_id for user in negated_ids
         )))
Ejemplo n.º 24
0
    def es_query(self):
        time_filter = form_es.submitted if self.by_submission_time else form_es.completed
        mobile_user_and_group_slugs = self.request.GET.getlist(EMWF.slug)

        query = (form_es.FormES()
                 .domain(self.domain)
                 .filter(time_filter(gte=self.datespan.startdate,
                                     lt=self.datespan.enddate_adjusted))
                 .filter(self._get_users_filter(mobile_user_and_group_slugs)
                         if not EMWF.no_filters_selected(mobile_user_and_group_slugs)
                         else match_all()))  # If no filters are selected, return all results

        # filter results by app and xmlns if applicable
        if FormsByApplicationFilter.has_selections(self.request):
            form_values = list(self.all_relevant_forms.values())
            if form_values:
                query = query.OR(*[self._form_filter(f) for f in form_values])

        # Exclude system forms unless they selected "Unknown User"
        if HQUserType.UNKNOWN not in EMWF.selected_user_types(mobile_user_and_group_slugs):
            for xmlns in SYSTEM_FORM_XMLNS_MAP.keys():
                query = query.NOT(form_es.xmlns(xmlns))
        return query
Ejemplo n.º 25
0
    def users(self):
        mobile_user_and_group_slugs = self.request.GET.getlist(ExpandedMobileWorkerFilter.slug)

        limit_user_ids = []
        if self.selected_app_id:
            limit_user_ids = get_all_user_ids_submitted(self.domain, self.selected_app_id)

        users_data = ExpandedMobileWorkerFilter.pull_users_and_groups(
            self.domain,
            mobile_user_and_group_slugs,
            include_inactive=False,
            limit_user_ids=limit_user_ids,
        )
        return users_data.combined_users
Ejemplo n.º 26
0
    def hits(self, domain_name):
        time_filter = form_es.submitted
        datespan = DateSpan(datetime.now() - timedelta(days=self.window),
                            datetime.utcnow())

        users_filter = form_es.user_id(
            EMWF.user_es_query(
                domain_name,
                ['t__0'],  # All mobile workers
                self.couch_user).values_list('_id', flat=True))
        query = (form_es.FormES().domain(domain_name).filter(
            time_filter(gte=datespan.startdate,
                        lt=datespan.enddate_adjusted)).filter(users_filter))
        return query.run().hits
Ejemplo n.º 27
0
    def hits(self, domain_name):
        time_filter = form_es.submitted
        datespan = DateSpan(datetime.now() - timedelta(days=self.window), datetime.utcnow())

        users_filter = form_es.user_id(EMWF.user_es_query(domain_name,
                                       ['t__0'],  # All mobile workers
                                       self.couch_user)
                        .values_list('_id', flat=True))
        query = (form_es.FormES()
                 .domain(domain_name)
                 .filter(time_filter(gte=datespan.startdate,
                                     lt=datespan.enddate_adjusted))
                 .filter(users_filter))
        return query.run().hits
Ejemplo n.º 28
0
 def report_config(self):
     emw = [
         u.user_id
         for u in ExpandedMobileWorkerFilter.pull_users_and_groups(
             self.domain, self.request, True, True).combined_users
     ]
     if self.datespan.enddate - timedelta(
             days=30) > self.datespan.startdate:
         self.datespan.startdate = self.datespan.enddate - timedelta(
             days=30)
     config = dict(domain=self.domain,
                   startdate=self.datespan.startdate,
                   enddate=self.datespan.enddate,
                   emw=tuple(emw))
     return config
Ejemplo n.º 29
0
 def user_query(self):
     # partially inspired by ApplicationStatusReport.user_query
     mobile_user_and_group_slugs = set(
         self.request.GET.getlist(ExpandedMobileWorkerFilter.slug)
     ) or set(['t__0'])  # default to all mobile workers on initial load
     user_query = ExpandedMobileWorkerFilter.user_es_query(
         self.domain,
         mobile_user_and_group_slugs,
         self.request.couch_user,
     )
     user_query = user_query.size(0)
     user_query = user_query.aggregations([
         DateHistogram('last_submission', 'reporting_metadata.last_submission_for_user.submission_date', '1d'),
         DateHistogram('last_sync', 'reporting_metadata.last_sync_for_user.sync_date', '1d')
     ])
     return user_query
Ejemplo n.º 30
0
 def user_query(self):
     # partially inspired by ApplicationStatusReport.user_query
     mobile_user_and_group_slugs = set(
         self.request.GET.getlist(ExpandedMobileWorkerFilter.slug)
     ) or set(['t__0'])  # default to all mobile workers on initial load
     user_query = ExpandedMobileWorkerFilter.user_es_query(
         self.domain,
         mobile_user_and_group_slugs,
         self.request.couch_user,
     )
     user_query = user_query.size(0)
     user_query = user_query.aggregations([
         DateHistogram('last_submission', 'reporting_metadata.last_submission_for_user.submission_date', '1d'),
         DateHistogram('last_sync', 'reporting_metadata.last_sync_for_user.sync_date', '1d')
     ])
     return user_query
Ejemplo n.º 31
0
    def _es_extra_filters(self):
        truthy_only = functools.partial(filter, None)
        form_values = self.all_relevant_forms.values()
        if form_values:
            yield {
                'or': [
                    {'and': [{'term': {'xmlns.exact': f['xmlns']}},
                             {'term': {'app_id': f['app_id']}}]}
                    for f in form_values
                ]
            }

        users_data = ExpandedMobileWorkerFilter.pull_users_and_groups(
            self.domain, self.request, True, True)
        all_mobile_workers_selected = 't__0' in self.request.GET.getlist('emw')
        if not all_mobile_workers_selected or users_data.admin_and_demo_users:
            yield {
                'terms': {
                    'form.meta.userID': truthy_only(
                        u.user_id for u in users_data.combined_users
                    )
                }
            }
        else:
            negated_ids = util.get_all_users_by_domain(
                self.domain,
                user_filter=HQUserType.all_but_users(),
                simplified=True,
            )
            yield {
                'not': {
                    'terms': {
                        'form.meta.userID': truthy_only(
                            user.user_id for user in negated_ids
                        )
                    }
                }
            }

        props = truthy_only(self.request.GET.get('form_data', '').split(','))
        for prop in props:
            yield {
                'term': {'__props_for_querying': prop.lower()}
            }
Ejemplo n.º 32
0
 def user_query(self, pagination=True):
     mobile_user_and_group_slugs = set(
         # Cater for old ReportConfigs
         self.request.GET.getlist('location_restricted_mobile_worker') +
         self.request.GET.getlist(ExpandedMobileWorkerFilter.slug))
     user_query = ExpandedMobileWorkerFilter.user_es_query(
         self.domain,
         mobile_user_and_group_slugs,
         self.request.couch_user,
     )
     user_query = (user_query.set_sorting_block(self.get_sorting_block()))
     if pagination:
         user_query = (user_query.size(self.pagination.count).start(
             self.pagination.start))
     if self.selected_app_id:
         user_query = user_query.nested(
             self.sort_base,
             filters.term(self.sort_filter, self.selected_app_id))
     return user_query
Ejemplo n.º 33
0
    def es_query(self):
        time_filter = form_es.submitted if self.by_submission_time else form_es.completed
        mobile_user_and_group_slugs = self.request.GET.getlist(EMWF.slug)

        query = (form_es.FormES()
                 .domain(self.domain)
                 .filter(time_filter(gte=self.datespan.startdate,
                                     lt=self.datespan.enddate_adjusted))
                 .filter(self._get_users_filter(mobile_user_and_group_slugs)))

        # filter results by app and xmlns if applicable
        if FormsByApplicationFilter.has_selections(self.request):
            form_values = list(self.all_relevant_forms.values())
            if form_values:
                query = query.OR(*[self._form_filter(f) for f in form_values])

        # Exclude system forms unless they selected "Unknown User"
        if HQUserType.UNKNOWN not in EMWF.selected_user_types(mobile_user_and_group_slugs):
            query = query.NOT(form_es.xmlns(SYSTEM_FORM_XMLNS))

        return query
Ejemplo n.º 34
0
 def rows(self):
     if self.warehouse:
         mobile_user_and_group_slugs = set(
             # Cater for old ReportConfigs
             self.request.GET.getlist('location_restricted_mobile_worker') +
             self.request.GET.getlist(ExpandedMobileWorkerFilter.slug))
         users = ExpandedMobileWorkerFilter.user_es_query(
             self.domain,
             mobile_user_and_group_slugs,
             self.request.couch_user,
         ).values_list('_id', flat=True)
         sort_clause = self.get_sql_sort()
         rows = ApplicationStatusFact.objects.filter(
             user_dim__user_id__in=users).order_by(
                 sort_clause).select_related('user_dim', 'app_dim')
         if self.selected_app_id:
             rows = rows.filter(
                 app_dim__application_id=self.selected_app_id)
         self._total_records = rows.count()
         return self.process_users(rows)
     else:
         users = self.user_query().run()
         self._total_records = users.total
         return self.process_rows(users.hits)
Ejemplo n.º 35
0
 def rows(self):
     if self.warehouse:
         mobile_user_and_group_slugs = set(
             # Cater for old ReportConfigs
             self.request.GET.getlist('location_restricted_mobile_worker') +
             self.request.GET.getlist(ExpandedMobileWorkerFilter.slug)
         )
         users = ExpandedMobileWorkerFilter.user_es_query(
             self.domain,
             mobile_user_and_group_slugs,
             self.request.couch_user,
         ).values_list('_id', flat=True)
         sort_clause = self.get_sql_sort()
         rows = ApplicationStatusFact.objects.filter(
             user_dim__user_id__in=users
         ).order_by(sort_clause).select_related('user_dim', 'app_dim')
         if self.selected_app_id:
             rows = rows.filter(app_dim__application_id=self.selected_app_id)
         self._total_records = rows.count()
         return self.process_users(rows)
     else:
         users = self.user_query().run()
         self._total_records = users.total
         return self.process_rows(users.hits)
Ejemplo n.º 36
0
 def test_get_assigned_locations_default(self, assigned_locations_patch):
     assigned_locations_patch.return_value = self.user_assigned_locations
     emwf = ExpandedMobileWorkerFilter(self.request)
     loc_defaults = emwf._get_assigned_locations_default()
     self.assertEqual(loc_defaults, map(emwf.utils.location_tuple, self.user_assigned_locations))
Ejemplo n.º 37
0
 def _extract_location_id(location_id_slug):
     from corehq.apps.reports.filters.users import ExpandedMobileWorkerFilter
     selected_ids = ExpandedMobileWorkerFilter.selected_location_ids(
         [location_id_slug])
     return selected_ids[0] if selected_ids else None
Ejemplo n.º 38
0
 def _get_users_filter(self, mobile_user_and_group_slugs):
     user_ids = (EMWF.user_es_query(
         self.domain, mobile_user_and_group_slugs,
         self.request.couch_user).values_list('_id', flat=True))
     return form_es.user_id(user_ids)