Ejemplo n.º 1
0
    def es_results(self):
        case_es = self.case_es
        query = self.build_query(case_type=self.case_type, filter=self.case_filter,
                                 status=self.case_status, owner_ids=self.case_owners,
                                 search_string=SearchFilter.get_value(self.request, self.domain))
        query_results = case_es.run_query(query)

        if query_results is None or 'hits' not in query_results:
            logging.error("CaseListMixin query error: %s, urlpath: %s, params: %s, user: %s yielded a result indicating a query error: %s, results: %s" % (
                self.__class__.__name__,
                self.request.path,
                self.request.GET.urlencode(),
                self.request.couch_user.username,
                simplejson.dumps(query),
                simplejson.dumps(query_results)
            ))
        return query_results
Ejemplo n.º 2
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()
        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):
            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
            user_types = EMWF.selected_user_types(mobile_user_and_group_slugs)
            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)

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

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

        return query
Ejemplo n.º 3
0
    def es_results(self):
        case_es = self.case_es
        query = self.build_query(case_type=self.case_type,
                                 afilter=self.case_filter,
                                 status=self.case_status,
                                 owner_ids=self.case_owners,
                                 search_string=SearchFilter.get_value(
                                     self.request, self.domain))

        query_results = case_es.run_query(query)

        if 'hits' not in query_results:
            logging.error(
                "CaseListMixin query error: %s, urlpath: %s, params: %s, user: %s yielded a result indicating a query error: %s, results: %s"
                % (self.__class__.__name__, self.request.path,
                   self.request.GET.urlencode(),
                   self.request.couch_user.username, simplejson.dumps(query),
                   simplejson.dumps(query_results)))
            raise RequestFailed
        return query_results
Ejemplo n.º 4
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()
        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 EMWF.show_all_data(mobile_user_and_group_slugs):
            pass
        elif EMWF.show_project_data(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 = 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
Ejemplo n.º 5
0
    def es_results(self):
        if not self.request.GET.has_key('patient_id'):
            return None

        full_query = {
            'query': {
                "filtered": {
                    "filter": {
                        "and": [
                            {"term": {"domain.exact": self.request.domain}},
                            {"term": {"doc_type": "xforminstance"}},
                            {
                                "nested": {
                                    "path": "form.case",
                                    "filter": {
                                        "or": [
                                            {
                                                "term": {
                                                    "@case_id": "%s" % self.request.GET[
                                                        'patient_id']
                                                }
                                            },
                                            {
                                                "term": {
                                                    "case_id": "%s" % self.request.GET['patient_id']
                                                }
                                            }
                                        ]
                                    }
                                }
                            }
                        ]
                    },
                    "query": {"match_all": {}}
                }
            },
            "sort": self.get_sorting_block(),
            "size": self.pagination.count,
            "from": self.pagination.start
        }

        form_name_group = self.request.GET.get('form_name_group', None)
        form_name_xmnls = self.request.GET.get('form_name_xmlns', None)
        search_string = SearchFilter.get_value(self.request, self.domain)

        if search_string:
            query_block = {"queryString": {"query": "*" + search_string + "*"}}
            full_query["query"]["filtered"]["query"] = query_block

        if form_name_group and form_name_xmnls == '':
            xmlns_terms = []
            forms = filter(lambda obj: obj['val'] == form_name_group, SUBMISSION_SELECT_FIELDS)[0]
            for form in forms['next']:
                xmlns_terms.append(form['val'])

            full_query['query']['filtered']['filter']['and'].append({"terms": {"xmlns.exact": xmlns_terms}})

        if form_name_xmnls:
            full_query['query']['filtered']['filter']['and'].append({"term": {"xmlns.exact": form_name_xmnls}})

        res = self.xform_es.run_query(full_query)
        return res
Ejemplo n.º 6
0
 def es_results(self):
     case_es = self.case_es
     query = self.build_query(case_type=self.case_type, filter=self.case_filter,
                              status=self.case_status, owner_ids=self.case_owners,
                              search_string=SearchFilter.get_value(self.request, self.domain))
     return case_es.run_query(query)
Ejemplo n.º 7
0
 def es_results(self):
     case_es = self.case_es
     query = self.build_query(case_type=self.case_type, filter=self.case_filter,
                              status=self.case_status, owner_ids=self.case_owners,
                              search_string=SearchFilter.get_value(self.request, self.domain))
     return case_es.run_query(query)
Ejemplo n.º 8
0
    def es_results(self):
        q = { "query": {
                "filtered": {
                    "query": {
                        "match_all": {}
                    },
                    "filter": {
                        "and": [
                            {"term": { "domain.exact": "succeed" }},
                        ]
                    }
                }
            },
            'sort': self.get_sorting_block(),
            'from': self.pagination.start if self.pagination else None,
            'size': self.pagination.count if self.pagination else None,
        }
        search_string = SearchFilter.get_value(self.request, self.domain)
        es_filters = q["query"]["filtered"]["filter"]

        responsible_party = self.request_params.get('responsible_party', '')
        if responsible_party != '':
            if responsible_party == 'Care Manager':
                es_filters["and"].append({"term": {"task_responsible.#value": "cm"}})
            else:
                es_filters["and"].append({"term": {"task_responsible.#value": "chw"}})


        task_status = self.request_params.get('task_status', '')
        if task_status != '':
            if task_status == 'closed':
                es_filters["and"].append({"term": {"closed": True}})
            else:
                es_filters["and"].append({"term": {"closed": False}})

        patient_id = self.request_params.get('patient_id', '')
        if patient_id != '':
            es_filters["and"].append({"term": {"indices.referenced_id": patient_id}})

        def _filter_gen(key, flist):
            return {"terms": {
                key: [item.lower() for item in flist if item]
            }}

        user = self.request.couch_user
        if not user.is_web_user():
            owner_ids = user.get_group_ids()
            user_ids = [user._id]
            owner_filters = _filter_gen('owner_id', owner_ids)
            user_filters = _filter_gen('user_id', user_ids)
            filters = filter(None, [owner_filters, user_filters])
            subterms = []
            subterms.append({'or': filters})
            es_filters["and"].append({'and': subterms} if subterms else {})

        if self.case_type:
            es_filters["and"].append({"term": {"type.exact": 'task'}})
        if search_string:
            query_block = {"queryString": {"query": "*" + search_string + "*"}}
            q["query"]["filtered"]["query"] = query_block

        sorting_block = self.get_sorting_block()[0].keys()[0] if len(self.get_sorting_block()) != 0 else None
        order = self.get_sorting_block()[0].values()[0] if len(self.get_sorting_block()) != 0 else None
        if sorting_block == 'task_risk_factor.#value':
            sort = {
                "_script": {
                    "script":
                        """
                            foreach(String key : task_risk_factor_list.keySet()) {
                                String value = _source.task_risk_factor.get('#value');
                                if (value == null) {
                                    return '';
                                } else {
                                    return task_risk_factor_list.get(value);
                                }
                            }
                            return ''
                        """,
                    "type": "string",
                    "params": {
                        "task_risk_factor_list": TASK_RISK_FACTOR
                    },
                    "order": order
                }
            }
            q['sort'] = sort

        if sorting_block == 'task_activity.#value':
            sort = {
                "_script": {
                    "script":
                        """
                            foreach(String key : task_activity_list.keySet()) {
                                String value = _source.task_activity.get('#value');
                                if (value == null) {
                                    return value;
                                } else {
                                    return task_activity_list.get(value);
                                }
                            }
                            return ''
                        """,
                    "type": "string",
                    "params": {
                        "task_activity_list": TASK_ACTIVITY
                    },
                    "order": order
                }
            }
            q['sort'] = sort

        logging.info("ESlog: [%s.%s] ESquery: %s" % (self.__class__.__name__, self.domain, json.dumps(q)))

        if self.pagination:
            return es_query(q=q, es_url=REPORT_CASE_INDEX + '/_search', dict_only=False, start_at=self.pagination.start)
        else:
            return es_query(q=q, es_url=REPORT_CASE_INDEX + '/_search', dict_only=False)
Ejemplo n.º 9
0
    def es_results(self):
        if not self.request.GET.has_key('patient_id'):
            return None

        full_query = {
            'query': {
                "filtered": {
                    "filter": {
                        "and": [{
                            "term": {
                                "domain.exact": self.request.domain
                            }
                        }, {
                            "term": {
                                "doc_type": "xforminstance"
                            }
                        }, {
                            "nested": {
                                "path": "form.case",
                                "filter": {
                                    "or": [{
                                        "term": {
                                            "@case_id":
                                            "%s" %
                                            self.request.GET['patient_id']
                                        }
                                    }, {
                                        "term": {
                                            "case_id":
                                            "%s" %
                                            self.request.GET['patient_id']
                                        }
                                    }]
                                }
                            }
                        }]
                    },
                    "query": {
                        "match_all": {}
                    }
                }
            },
            "sort": self.get_sorting_block(),
            "size": self.pagination.count,
            "from": self.pagination.start
        }

        form_name_group = self.request.GET.get('form_name_group', None)
        form_name_xmnls = self.request.GET.get('form_name_xmlns', None)
        search_string = SearchFilter.get_value(self.request, self.domain)

        if search_string:
            query_block = {"queryString": {"query": "*" + search_string + "*"}}
            full_query["query"]["filtered"]["query"] = query_block

        if form_name_group and form_name_xmnls == '':
            xmlns_terms = []
            forms = filter(lambda obj: obj['val'] == form_name_group,
                           SUBMISSION_SELECT_FIELDS)[0]
            for form in forms['next']:
                xmlns_terms.append(form['val'])

            full_query['query']['filtered']['filter']['and'].append(
                {"terms": {
                    "xmlns.exact": xmlns_terms
                }})

        if form_name_xmnls:
            full_query['query']['filtered']['filter']['and'].append(
                {"term": {
                    "xmlns.exact": form_name_xmnls
                }})

        res = self.xform_es.run_query(full_query)
        return res
Ejemplo n.º 10
0
    def es_results(self):
        q = { "query": {
                "filtered": {
                    "query": {
                    },
                    "filter": {
                        "bool": {
                            "must": [
                                {"term": {"domain.exact": self.domain}}
                            ],
                            "must_not": []
                        }
                    }
                }
            },
            'sort': self.get_sorting_block(),
            'from': self.pagination.start,
            'size': self.pagination.count,
        }
        sorting_block = self.get_sorting_block()[0].keys()[0] if len(self.get_sorting_block()) != 0 else None
        order = self.get_sorting_block()[0].values()[0] if len(self.get_sorting_block()) != 0 else None
        search_string = SearchFilter.get_value(self.request, self.domain)
        es_filters = q["query"]["filtered"]["filter"]
        if sorting_block == 'last_interaction':
            sort = {
                "_script": {
                    "script":
                        """
                            last=0;
                            break = true;
                            for (i = _source.actions.size(); (i > 0 && break); i--){
                                if (inter_list.contains(_source.actions[i-1].get('xform_xmlns'))) {
                                    last = _source.actions[i-1].get('date');
                                    break = false;
                                }
                            }
                            return last;
                        """,
                    "type": "string",
                    "params": {
                        "inter_list": LAST_INTERACTION_LIST
                    },
                    "order": order
                }
            }
            q['sort'] = sort
        elif sorting_block == 'target_date':
            sort = {
                "_script": {
                    "script":
                        """
                            next_visit=visits_list[0];
                            before_action=null;
                            count=0;
                            foreach(visit : visits_list) {
                                skip = false;
                                foreach(action : _source.actions) {
                                    if (!skip && visit.xmlns.equals(action.xform_xmlns) && !action.xform_id.equals(before_action)) {
                                        next_visit=visits_list[count+1];
                                        before_visit=action.xform_id;
                                        skip=true;
                                        count++;
                                    }
                                    before_visit=action.xform_id;
                                }
                            }
                            Calendar cal = Calendar.getInstance();

                            r = _source.randomization_date.get('#value').split('-');
                            int year = Integer.parseInt(r[0]);
                            int month = Integer.parseInt(r[1]);
                            int day = Integer.parseInt(r[2]);
                            cal.set(year, month-1, day);
                            nv=(cal.getTimeInMillis() + (next_visit.get('days') * 24 * 60 * 60 * 1000));
                            return Calendar.getInstance().getTimeInMillis() - nv;
                        """,
                    "type": "number",
                    "params": {
                        "visits_list": VISIT_SCHEDULE
                    },
                    "order": order
                }
            }
            q['sort'] = sort
        elif sorting_block == 'visit_name':
            sort = {
                "_script": {
                    "script":
                        """
                            next_visit=visits_list[0];
                            before_action=null;
                            count=0;
                            foreach(visit : visits_list) {
                                skip = false;
                                foreach(action : _source.actions) {
                                    if (!skip && visit.xmlns.equals(action.xform_xmlns) && !action.xform_id.equals(before_action)) {
                                        next_visit=visits_list[count+1];
                                        before_visit=action.xform_id;
                                        skip=true;
                                        count++;
                                    }
                                    before_visit=action.xform_id;
                                }
                            }
                            return next_visit.get('visit_name');
                        """,
                    "type": "string",
                    "params": {
                        "visits_list": VISIT_SCHEDULE
                    },
                    "order": order
                }
            }
            q['sort'] = sort

        care_site = self.request_params.get('care_site', '')
        if care_site != '':
            es_filters["bool"]["must"].append({"term": {"care_site.#value": care_site}})

        patient_status = self.request_params.get('patient_status', '')
        if patient_status != '':
            active_dict = {"nested": {
                "path": "actions",
                "query": {
                    "match": {
                        "actions.xform_xmlns": PM3}}}}
            if patient_status == "active":
                es_filters["bool"]["must_not"].append(active_dict)
            else:
                es_filters["bool"]["must"].append(active_dict)

        responsible_party = self.request_params.get('responsible_party', '')
        if responsible_party != '':
            users = [user.get_id for user in CommCareUser.by_domain(domain=self.domain) if 'role' in user.user_data and user.user_data['role'] == responsible_party.upper()]
            terms = {"terms": {"user_id": users, "minimum_should_match": 1}}
            es_filters["bool"]["must"].append(terms)

        if self.case_type:
            es_filters["bool"]["must"].append({"term": {"type.exact": 'participant'}})
        if search_string:
            query_block = {"queryString": {"default_field": "full_name.#value", "query": "*" + search_string + "*"}}
            q["query"]["filtered"]["query"] = query_block
        else:
            q["query"]["filtered"]["query"] = {"match_all": {}}

        logging.info("ESlog: [%s.%s] ESquery: %s" % (self.__class__.__name__, self.domain, simplejson.dumps(q)))
        return es_query(q=q, es_url=REPORT_CASE_INDEX + '/_search', dict_only=False)
Ejemplo n.º 11
0
    def es_results(self):
        q = {
            "query": {
                "filtered": {
                    "query": {
                        "match_all": {}
                    },
                    "filter": {
                        "and": [
                            {
                                "term": {
                                    "domain.exact": "succeed"
                                }
                            },
                        ]
                    }
                }
            },
            'sort': self.get_sorting_block(),
            'from': self.pagination.start if self.pagination else None,
            'size': self.pagination.count if self.pagination else None,
        }
        search_string = SearchFilter.get_value(self.request, self.domain)
        es_filters = q["query"]["filtered"]["filter"]

        responsible_party = self.request_params.get('responsible_party', '')
        if responsible_party != '':
            if responsible_party == 'Care Manager':
                es_filters["and"].append(
                    {"term": {
                        "task_responsible.#value": "cm"
                    }})
            else:
                es_filters["and"].append(
                    {"term": {
                        "task_responsible.#value": "chw"
                    }})

        task_status = self.request_params.get('task_status', '')
        if task_status != '':
            if task_status == 'closed':
                es_filters["and"].append({"term": {"closed": True}})
            else:
                es_filters["and"].append({"term": {"closed": False}})

        patient_id = self.request_params.get('patient_id', '')
        if patient_id != '':
            es_filters["and"].append(
                {"term": {
                    "indices.referenced_id": patient_id
                }})

        def _filter_gen(key, flist):
            return {"terms": {key: [item.lower() for item in flist if item]}}

        user = self.request.couch_user
        if not user.is_web_user():
            owner_ids = user.get_group_ids()
            user_ids = [user._id]
            owner_filters = _filter_gen('owner_id', owner_ids)
            user_filters = _filter_gen('user_id', user_ids)
            filters = filter(None, [owner_filters, user_filters])
            subterms = []
            subterms.append({'or': filters})
            es_filters["and"].append({'and': subterms} if subterms else {})

        if self.case_type:
            es_filters["and"].append({"term": {"type.exact": 'task'}})
        if search_string:
            query_block = {"queryString": {"query": "*" + search_string + "*"}}
            q["query"]["filtered"]["query"] = query_block

        sorting_block = self.get_sorting_block()[0].keys()[0] if len(
            self.get_sorting_block()) != 0 else None
        order = self.get_sorting_block()[0].values()[0] if len(
            self.get_sorting_block()) != 0 else None
        if sorting_block == 'task_risk_factor.#value':
            sort = {
                "_script": {
                    "script": """
                            foreach(String key : task_risk_factor_list.keySet()) {
                                String value = _source.task_risk_factor.get('#value');
                                if (value == null) {
                                    return '';
                                } else {
                                    return task_risk_factor_list.get(value);
                                }
                            }
                            return ''
                        """,
                    "type": "string",
                    "params": {
                        "task_risk_factor_list": TASK_RISK_FACTOR
                    },
                    "order": order
                }
            }
            q['sort'] = sort

        if sorting_block == 'task_activity.#value':
            sort = {
                "_script": {
                    "script": """
                            foreach(String key : task_activity_list.keySet()) {
                                String value = _source.task_activity.get('#value');
                                if (value == null) {
                                    return value;
                                } else {
                                    return task_activity_list.get(value);
                                }
                            }
                            return ''
                        """,
                    "type": "string",
                    "params": {
                        "task_activity_list": TASK_ACTIVITY
                    },
                    "order": order
                }
            }
            q['sort'] = sort

        logging.info(
            "ESlog: [%s.%s] ESquery: %s" %
            (self.__class__.__name__, self.domain, simplejson.dumps(q)))

        if self.pagination:
            return es_query(q=q,
                            es_url=REPORT_CASE_INDEX + '/_search',
                            dict_only=False,
                            start_at=self.pagination.start)
        else:
            return es_query(q=q,
                            es_url=REPORT_CASE_INDEX + '/_search',
                            dict_only=False)
Ejemplo n.º 12
0
    def es_results(self):
        q = { "query": {
                "filtered": {
                    "query": {
                        "match_all": {}
                    },
                    "filter": {
                        "and": [
                            {"term": { "domain.exact": "succeed" }},
                        ]
                    }
                }
            },
            'sort': self.get_sorting_block(),
            'from': self.pagination.start if self.pagination else None,
            'size': self.pagination.count if self.pagination else None,
        }
        sorting_block = self.get_sorting_block()[0].keys()[0] if len(self.get_sorting_block()) != 0 else None
        order = self.get_sorting_block()[0].values()[0] if len(self.get_sorting_block()) != 0 else None
        search_string = SearchFilter.get_value(self.request, self.domain)
        es_filters = q["query"]["filtered"]["filter"]
        if sorting_block == 'last_interaction':
            sort = {
                "_script": {
                    "script":
                        """
                            last=0;
                            break = true;
                            for (i = _source.actions.size(); (i > 0 && break); i--){
                                if (inter_list.contains(_source.actions[i-1].get('xform_xmlns'))) {
                                    last = _source.actions[i-1].get('date');
                                    break = false;
                                }
                            }
                            return last;
                        """,
                    "type": "string",
                    "params": {
                        "inter_list": LAST_INTERACTION_LIST
                    },
                    "order": order
                }
            }
            q['sort'] = sort
        elif sorting_block == 'target_date':
            sort = {
                "_script": {
                    "script":
                        """
                            next_visit=visits_list[0];
                            before_action=null;
                            count=0;
                            foreach(visit : visits_list) {
                                skip = false;
                                foreach(action : _source.actions) {
                                    if (!skip && visit.xmlns.equals(action.xform_xmlns) && !action.xform_id.equals(before_action)) {
                                        next_visit=visits_list[count+1];
                                        before_visit=action.xform_id;
                                        skip=true;
                                        count++;
                                    }
                                    before_visit=action.xform_id;
                                }
                            }
                            Calendar cal = Calendar.getInstance();

                            r = _source.randomization_date.get('#value').split('-');
                            int year = Integer.parseInt(r[0]);
                            int month = Integer.parseInt(r[1]);
                            int day = Integer.parseInt(r[2]);
                            cal.set(year, month-1, day);
                            nv=(cal.getTimeInMillis() + (next_visit.get('days') * 24 * 60 * 60 * 1000));
                            return Calendar.getInstance().getTimeInMillis() - nv;
                        """,
                    "type": "number",
                    "params": {
                        "visits_list": VISIT_SCHEDULE
                    },
                    "order": order
                }
            }
            q['sort'] = sort
        elif sorting_block == 'visit_name':
            sort = {
                "_script": {
                    "script":
                        """
                            next_visit=visits_list[0];
                            before_action=null;
                            count=0;
                            foreach(visit : visits_list) {
                                skip = false;
                                foreach(action : _source.actions) {
                                    if (!skip && visit.xmlns.equals(action.xform_xmlns) && !action.xform_id.equals(before_action)) {
                                        next_visit=visits_list[count+1];
                                        before_visit=action.xform_id;
                                        skip=true;
                                        count++;
                                    }
                                    before_visit=action.xform_id;
                                }
                            }
                            return next_visit.get('visit_name');
                        """,
                    "type": "string",
                    "params": {
                        "visits_list": VISIT_SCHEDULE
                    },
                    "order": order
                }
            }
            q['sort'] = sort

        care_site = self.request_params.get('care_site_display', '')
        if care_site != '':
            query_block = {"queryString": {"default_field": "care_site_display.#value", "query": "*" + care_site + "*"}}
            q["query"]["filtered"]["query"] = query_block

        patient_status = self.request_params.get('patient_status', '')
        if patient_status != '':
            active_dict = {
                "nested": {
                    "path": "actions",
                    "filter": {
                        "bool" : {
                            "must_not": [],
                            "must": []

                        }
                    }
                }
            }
            if patient_status == 'active':
                active_dict['nested']['filter']['bool']['must_not'] = {"term": {"actions.xform_xmlns": PM3}}
            else:
                active_dict['nested']['filter']['bool']['must'] = {"term": {"actions.xform_xmlns": PM3}}
            es_filters["and"].append(active_dict)

        def _filter_gen(key, flist):
            return {"terms": {
                key: [item.lower() for item in flist if item]
            }}

        user = self.request.couch_user
        if not user.is_web_user():
            owner_ids = user.get_group_ids()
            user_ids = [user._id]
            owner_filters = _filter_gen('owner_id', owner_ids)
            user_filters = _filter_gen('user_id', user_ids)
            filters = filter(None, [owner_filters, user_filters])
            subterms = []
            subterms.append({'or': filters})
            es_filters["and"].append({'and': subterms} if subterms else {})

        if self.case_type:
            es_filters["and"].append({"term": {"type.exact": 'participant'}})
        if search_string:
            query_block = {"queryString": {"default_field": "full_name.#value", "query": "*" + search_string + "*"}}
            q["query"]["filtered"]["query"] = query_block

        logging.info("ESlog: [%s.%s] ESquery: %s" % (self.__class__.__name__, self.domain, simplejson.dumps(q)))
        if self.pagination:
            return es_query(q=q, es_url=REPORT_CASE_INDEX + '/_search', dict_only=False, start_at=self.pagination.start)
        else:
            return es_query(q=q, es_url=REPORT_CASE_INDEX + '/_search', dict_only=False)
Ejemplo n.º 13
0
    def es_results(self):
        q = {
            "query": {
                "filtered": {
                    "query": {},
                    "filter": {
                        "bool": {
                            "must": [{
                                "term": {
                                    "domain.exact": self.domain
                                }
                            }],
                            "must_not": []
                        }
                    }
                }
            },
            'sort': self.get_sorting_block(),
            'from': self.pagination.start,
            'size': self.pagination.count,
        }
        sorting_block = self.get_sorting_block()[0].keys()[0] if len(
            self.get_sorting_block()) != 0 else None
        order = self.get_sorting_block()[0].values()[0] if len(
            self.get_sorting_block()) != 0 else None
        search_string = SearchFilter.get_value(self.request, self.domain)
        es_filters = q["query"]["filtered"]["filter"]
        if sorting_block == 'last_interaction':
            sort = {
                "_script": {
                    "script": """
                            last=0;
                            break = true;
                            for (i = _source.actions.size(); (i > 0 && break); i--){
                                if (inter_list.contains(_source.actions[i-1].get('xform_xmlns'))) {
                                    last = _source.actions[i-1].get('date');
                                    break = false;
                                }
                            }
                            return last;
                        """,
                    "type": "string",
                    "params": {
                        "inter_list": LAST_INTERACTION_LIST
                    },
                    "order": order
                }
            }
            q['sort'] = sort
        elif sorting_block == 'target_date':
            sort = {
                "_script": {
                    "script": """
                            next_visit=visits_list[0];
                            before_action=null;
                            count=0;
                            foreach(visit : visits_list) {
                                skip = false;
                                foreach(action : _source.actions) {
                                    if (!skip && visit.xmlns.equals(action.xform_xmlns) && !action.xform_id.equals(before_action)) {
                                        next_visit=visits_list[count+1];
                                        before_visit=action.xform_id;
                                        skip=true;
                                        count++;
                                    }
                                    before_visit=action.xform_id;
                                }
                            }
                            Calendar cal = Calendar.getInstance();

                            r = _source.randomization_date.get('#value').split('-');
                            int year = Integer.parseInt(r[0]);
                            int month = Integer.parseInt(r[1]);
                            int day = Integer.parseInt(r[2]);
                            cal.set(year, month-1, day);
                            nv=(cal.getTimeInMillis() + (next_visit.get('days') * 24 * 60 * 60 * 1000));
                            return Calendar.getInstance().getTimeInMillis() - nv;
                        """,
                    "type": "number",
                    "params": {
                        "visits_list": VISIT_SCHEDULE
                    },
                    "order": order
                }
            }
            q['sort'] = sort
        elif sorting_block == 'visit_name':
            sort = {
                "_script": {
                    "script": """
                            next_visit=visits_list[0];
                            before_action=null;
                            count=0;
                            foreach(visit : visits_list) {
                                skip = false;
                                foreach(action : _source.actions) {
                                    if (!skip && visit.xmlns.equals(action.xform_xmlns) && !action.xform_id.equals(before_action)) {
                                        next_visit=visits_list[count+1];
                                        before_visit=action.xform_id;
                                        skip=true;
                                        count++;
                                    }
                                    before_visit=action.xform_id;
                                }
                            }
                            return next_visit.get('visit_name');
                        """,
                    "type": "string",
                    "params": {
                        "visits_list": VISIT_SCHEDULE
                    },
                    "order": order
                }
            }
            q['sort'] = sort

        care_site = self.request_params.get('care_site', '')
        if care_site != '':
            es_filters["bool"]["must"].append(
                {"term": {
                    "care_site.#value": care_site
                }})

        patient_status = self.request_params.get('patient_status', '')
        if patient_status != '':
            active_dict = {
                "nested": {
                    "path": "actions",
                    "query": {
                        "match": {
                            "actions.xform_xmlns": PM3
                        }
                    }
                }
            }
            if patient_status == "active":
                es_filters["bool"]["must_not"].append(active_dict)
            else:
                es_filters["bool"]["must"].append(active_dict)

        responsible_party = self.request_params.get('responsible_party', '')
        if responsible_party != '':
            users = [
                user.get_id
                for user in CommCareUser.by_domain(domain=self.domain)
                if 'role' in user.user_data
                and user.user_data['role'] == responsible_party.upper()
            ]
            terms = {"terms": {"user_id": users}}
            es_filters["bool"]["must"].append(terms)
        else:
            user = self.request.couch_user
            if not user.is_web_user():
                groups = user.get_group_ids()
                terms = {"terms": {"owner_id": groups}}
                es_filters["bool"]["must"].append(terms)

        if self.case_type:
            es_filters["bool"]["must"].append(
                {"term": {
                    "type.exact": 'participant'
                }})
        if search_string:
            query_block = {
                "queryString": {
                    "default_field": "full_name.#value",
                    "query": "*" + search_string + "*"
                }
            }
            q["query"]["filtered"]["query"] = query_block
        else:
            q["query"]["filtered"]["query"] = {"match_all": {}}

        logging.info(
            "ESlog: [%s.%s] ESquery: %s" %
            (self.__class__.__name__, self.domain, simplejson.dumps(q)))
        return es_query(q=q,
                        es_url=REPORT_CASE_INDEX + '/_search',
                        dict_only=False)