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")
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")
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")
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")
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)