예제 #1
0
def search(request, domain):
    """
    Accepts search criteria as GET params, e.g. "https://www.commcarehq.org/a/domain/phone/search/?a=b&c=d"
    Returns results as a fixture with the same structure as a casedb instance.
    """
    criteria = request.GET.dict()
    try:
        case_type = criteria.pop('case_type')
    except KeyError:
        return HttpResponse('Search request must specify case type',
                            status=400)
    try:
        case_search_criteria = CaseSearchCriteria(domain, case_type, criteria)
        search_es = case_search_criteria.search_es
    except QueryMergeException as e:
        return _handle_query_merge_exception(request, e)
    try:
        hits = search_es.run().raw_hits
    except Exception as e:
        return _handle_es_exception(
            request, e, case_search_criteria.query_addition_debug_details)

    # Even if it's a SQL domain, we just need to render the hits as cases, so CommCareCase.wrap will be fine
    cases = [
        CommCareCase.wrap(flatten_result(result, include_score=True))
        for result in hits
    ]
    fixtures = CaseDBFixture(cases).fixture
    return HttpResponse(fixtures, content_type="text/xml; charset=utf-8")
예제 #2
0
def app_aware_search(request, domain, app_id):
    """
    Accepts search criteria as GET params, e.g. "https://www.commcarehq.org/a/domain/phone/search/?a=b&c=d"
    Returns results as a fixture with the same structure as a casedb instance.
    """
    criteria = request.GET.dict()
    try:
        case_type = criteria.pop('case_type')
    except KeyError:
        return HttpResponse('Search request must specify case type', status=400)

    try:
        case_search_criteria = CaseSearchCriteria(domain, case_type, criteria)
    except TooManyRelatedCasesError:
        return HttpResponse(_('Search has too many results. Please try a more specific search.'), status=400)
    search_es = case_search_criteria.search_es

    try:
        hits = search_es.run().raw_hits
    except Exception as e:
        notify_exception(request, str(e), details=dict(
            exception_type=type(e),
        ))
        return HttpResponse(status=500)

    # Even if it's a SQL domain, we just need to render the hits as cases, so CommCareCase.wrap will be fine
    cases = [CommCareCase.wrap(flatten_result(result, include_score=True)) for result in hits]
    if app_id:
        cases.extend(get_related_cases(domain, app_id, case_type, cases))

    fixtures = CaseDBFixture(cases).fixture
    return HttpResponse(fixtures, content_type="text/xml; charset=utf-8")
예제 #3
0
def search(request, domain):
    """
    Accepts search criteria as GET params, e.g. "https://www.commcarehq.org/a/domain/phone/search/?a=b&c=d"
    Returns results as a fixture with the same structure as a casedb instance.
    """
    criteria = request.GET.dict()
    try:
        case_type = criteria.pop('case_type')
    except KeyError:
        return HttpResponse('Search request must specify case type',
                            status=400)
    try:
        include_closed = criteria.pop('include_closed')
    except KeyError:
        include_closed = False

    search_es = (CaseSearchES().domain(domain).case_type(case_type).size(
        CASE_SEARCH_MAX_RESULTS))

    if include_closed != 'True':
        search_es = search_es.is_closed(False)

    try:
        config = CaseSearchConfig.objects.get(domain=domain)
    except CaseSearchConfig.DoesNotExist as e:
        from corehq.util.soft_assert import soft_assert
        _soft_assert = soft_assert(to="{}@{}.com".format('frener', 'dimagi'),
                                   notify_admins=False,
                                   send_to_ops=False)
        _soft_assert(
            False,
            u"Someone in domain: {} tried accessing case search without a config"
            .format(domain), e)
        config = CaseSearchConfig(domain=domain)

    query_addition_id = criteria.pop(SEARCH_QUERY_ADDITION_KEY, None)

    fuzzies = config.config.get_fuzzy_properties_for_case_type(case_type)
    for key, value in criteria.items():
        search_es = search_es.case_property_query(key,
                                                  value,
                                                  fuzzy=(key in fuzzies))

    query_addition_debug_details = {}
    try:
        search_es = _add_case_search_addition(request, domain, search_es,
                                              query_addition_id,
                                              query_addition_debug_details)
    except QueryMergeException as e:
        return _handle_query_merge_exception(request, e)
    try:
        results = search_es.values()
    except Exception as e:
        return _handle_es_exception(request, e, query_addition_debug_details)

    # Even if it's a SQL domain, we just need to render the results as cases, so CommCareCase.wrap will be fine
    cases = [CommCareCase.wrap(flatten_result(result)) for result in results]
    fixtures = CaseDBFixture(cases).fixture
    return HttpResponse(fixtures, content_type="text/xml")
예제 #4
0
def app_aware_search(request, domain, app_id):
    """
    Accepts search criteria as GET params, e.g. "https://www.commcarehq.org/a/domain/phone/search/?a=b&c=d"
        Daterange can be specified in the format __range__YYYY-MM-DD__YYYY-MM-DD
        Multiple values can be specified for a param, which will be searched with OR operator

    Returns results as a fixture with the same structure as a casedb instance.
    """
    request_dict = request.GET if request.method == 'GET' else request.POST
    try:
        cases = get_case_search_results_from_request(domain, app_id,
                                                     request.couch_user,
                                                     request_dict)
    except CaseSearchUserError as e:
        return HttpResponse(str(e), status=400)
    fixtures = CaseDBFixture(cases).fixture
    return HttpResponse(fixtures, content_type="text/xml; charset=utf-8")
예제 #5
0
            for case_id in case_ids
        ]
    except RegistryNotFound:
        return HttpResponseNotFound(f"Registry '{registry}' not found")
    except CaseNotFound as e:
        return HttpResponseNotFound(f"Case '{str(e)}' not found")
    except RegistryAccessException as e:
        return HttpResponseBadRequest(str(e))

    for case in cases:
        if case.type not in case_types:
            return HttpResponseNotFound(f"Case '{case.case_id}' not found")

    all_cases = helper.get_multi_domain_case_hierarchy(request.couch_user,
                                                       cases)
    for case in all_cases:
        case.case_json[COMMCARE_PROJECT] = case.domain
    return HttpResponse(CaseDBFixture(all_cases).fixture,
                        content_type="text/xml; charset=utf-8")


@formplayer_auth
def case_restore(request, domain, case_id):
    """Restore endpoint used for SMS forms where the 'user' is a case.

    Accepts the provided case_id and returns a restore for the user containing:
    * Registration block
    * The passed in case and its full network of cases
    """
    return get_case_restore_response(domain, case_id)