def _get_data_case(self, params, filters): MAX_RESULTS = 200 # TODO vary by domain (cc-plus gets a higher limit?) # bleh _get = self.request.GET.copy() _get['iDisplayStart'] = '0' _get['iDisplayLength'] = str(MAX_RESULTS) self.request.GET = _get source = CaseListReport(self.request, domain=self.domain) total_count = source.es_results['hits']['total'] if total_count > MAX_RESULTS: # can't really think of a better way to return out-of-band # metadata from a generator yield {'_meta': { 'total_rows': total_count, 'capped_rows': MAX_RESULTS, }} # TODO ideally we'd want access to all the data shown on the # case detail report. certain case types can override this via # case.to_full_dict(). however, there is currently no efficient # way to call this over a large block of cases. so now we (via the # CaseListReport/DataSource) limit ourselves only to that which # can be queried in bulk for data in source.get_data(): case = CommCareCase.wrap(data['_case']).get_json() del data['_case'] data['num_forms'] = len(case['xform_ids']) standard_props = ( 'case_name', 'case_type', 'date_opened', 'external_id', 'owner_id', ) data.update(('prop_%s' % k, v) for k, v in case['properties'].iteritems() if k not in standard_props) GEO_DEFAULT = 'gps' # case property geo = None geo_directive = params['geo_fetch'].get(data['case_type'], GEO_DEFAULT) if geo_directive.startswith('link:'): # TODO use linked case pass elif geo_directive == '_random': # for testing -- just map the case to a random point import random import math geo = '%s %s' % (math.degrees(math.asin(random.uniform(-1, 1))), random.uniform(-180, 180)) elif geo_directive: # case property geo = data.get('prop_%s' % geo_directive) if geo: data['geo'] = geo yield data
def _get_data_case(self, params, filters): MAX_RESULTS = 200 # TODO vary by domain (cc-plus gets a higher limit?) # bleh _get = self.request.GET.copy() _get['iDisplayStart'] = '0' _get['iDisplayLength'] = str(MAX_RESULTS) self.request.GET = _get source = CaseListReport(self.request, domain=self.domain) total_count = source.es_results['hits']['total'] if total_count > MAX_RESULTS: # can't really think of a better way to return out-of-band # metadata from a generator yield {'_meta': { 'total_rows': total_count, 'capped_rows': MAX_RESULTS, }} # TODO ideally we'd want access to all the data shown on the # case detail report. certain case types can override this via # case.to_full_dict(). however, there is currently no efficient # way to call this over a large block of cases. so now we (via the # CaseListReport/DataSource) limit ourselves only to that which # can be queried in bulk for data in source.get_data(): case = CommCareCase.wrap(data['_case']).get_json() del data['_case'] data['num_forms'] = len(case['xform_ids']) standard_props = ( 'case_name', 'case_type', 'date_opened', 'external_id', 'owner_id', ) data.update(('prop_%s' % k, v) for k, v in case['properties'].iteritems() if k not in standard_props) GEO_DEFAULT = 'gps' # case property geo = None geo_directive = params['geo_fetch'].get(data['case_type'], GEO_DEFAULT) if geo_directive.startswith('link:'): # TODO use linked case pass elif geo_directive == '_random': # for testing -- just map the case to a random point import random import math geo = '%s %s' % (math.degrees(math.asin(random.uniform(-1, 1))), random.uniform(-180, 180)) elif geo_directive: # case property geo = data.get('prop_%s' % geo_directive) if geo: data['geo'] = geo yield data
def _get_data_case(self, params, filters): MAX_RESULTS = 200 # TODO vary by domain (cc-plus gets a higher limit?) # bleh _get = self.request.GET.copy() _get["iDisplayStart"] = "0" _get["iDisplayLength"] = str(MAX_RESULTS) self.request.GET = _get source = CaseListReport(self.request, domain=self.domain) total_count = source.es_results["hits"]["total"] if total_count > MAX_RESULTS: # can't really think of a better way to return out-of-band # metadata from a generator yield {"_meta": {"total_rows": total_count, "capped_rows": MAX_RESULTS}} # TODO ideally we'd want access to all the data shown on the # case detail report. certain case types can override this via # case.to_full_dict(). however, there is currently no efficient # way to call this over a large block of cases. so now we (via the # CaseListReport/DataSource) limit ourselves only to that which # can be queried in bulk for data in source.get_data(): case = CommCareCase.wrap(data["_case"]).get_json() del data["_case"] data["num_forms"] = len(case["xform_ids"]) standard_props = ("case_name", "case_type", "date_opened", "external_id", "owner_id") data.update(("prop_%s" % k, v) for k, v in case["properties"].iteritems() if k not in standard_props) GEO_DEFAULT = "gps" # case property geo = None geo_directive = params["geo_fetch"].get(data["case_type"], GEO_DEFAULT) if geo_directive.startswith("link:"): # TODO use linked case pass elif geo_directive == "_random": # for testing -- just map the case to a random point import random import math geo = "%s %s" % (math.degrees(math.asin(random.uniform(-1, 1))), random.uniform(-180, 180)) elif geo_directive: # case property geo = data.get("prop_%s" % geo_directive) if geo: data["geo"] = geo yield data
def get_user_link(self, user): from corehq.apps.reports.standard.cases.basic import CaseListReport user_link_template = '<a href="%(link)s?individual=%(user_id)s">%(username)s</a>' user_link = user_link_template % {"link": "%s%s" % (get_url_base(), CaseListReport.get_url(domain=self.domain)), "user_id": user.get('user_id'), "username": user.get('username_in_report')} return self.table_cell(user.get('raw_username'), user_link)
def test_with_project_data_slug(self): report_slugs = ['project_data'] q_dict_get = QueryDict('', mutable=True) q_dict_get.setlist('case_list_filter', report_slugs) self.request.GET = q_dict_get data = CaseListReport(self.request, domain=self.domain).es_results['hits'].get( 'hits', []) expected_case_ids = ['id-1', 'id-2', 'id-3', 'id-5'] queried_case_ids = [case['_id'] for case in data] self.assertCountEqual(expected_case_ids, queried_case_ids)
def case_details(request, domain, case_id): timezone = util.get_timezone(request.couch_user.user_id, domain) try: case = CommCareCase.get(case_id) except ResourceNotFound: case = None if case is None or case.doc_type != "CommCareCase" or case.domain != domain: messages.info(request, "Sorry, we couldn't find that case. If you think this is a mistake please report an issue.") return HttpResponseRedirect(CaseListReport.get_url(domain=domain)) try: owner_name = CommCareUser.get_by_user_id(case.owner_id, domain).raw_username except Exception: try: owning_group = Group.get(case.owner_id) owner_name = owning_group.display_name if owning_group.domain == domain else '' except Exception: owner_name = None try: username = CommCareUser.get_by_user_id(case.user_id, domain).raw_username except Exception: username = None return render(request, "reports/reportdata/case_details.html", { "domain": domain, "case_id": case_id, "case": case, "username": username, "owner_name": owner_name, "slug": CaseListReport.slug, "report": dict( name=case_inline_display(case), slug=CaseListReport.slug, is_async=False, ), "layout_flush_content": True, "timezone": timezone, "case_display_options": { "display": request.project.get_case_display(case), "timezone": timezone, "get_case_url": lambda case_id: reverse( case_details, args=[domain, case_id]) }, })
def case_details(request, domain, case_id): timezone = util.get_timezone(request.couch_user, domain) try: case = _get_case_or_404(domain, case_id) except Http404: messages.info( request, "Sorry, we couldn't find that case. If you think this is a mistake please report an issue." ) return HttpResponseRedirect(CaseListReport.get_url(domain=domain)) try: owner_name = CommCareUser.get_by_user_id(case.owner_id, domain).raw_username except Exception: try: owning_group = Group.get(case.owner_id) owner_name = owning_group.display_name if owning_group.domain == domain else "" except Exception: owner_name = None try: username = CommCareUser.get_by_user_id(case.user_id, domain).raw_username except Exception: username = None return render( request, "reports/reportdata/case_details.html", { "domain": domain, "case_id": case_id, "case": case, "username": username, "owner_name": owner_name, "slug": CaseListReport.slug, "report": dict(name=case_inline_display(case), slug=CaseListReport.slug, is_async=False), "layout_flush_content": True, "timezone": timezone, "case_display_options": { "display": request.project.get_case_display(case), "timezone": timezone, "get_case_url": lambda case_id: reverse(case_details, args=[domain, case_id]), }, "show_case_rebuild": toggles.CASE_REBUILD.enabled(request.user.username), }, )
@require_case_view_permission @login_and_domain_required @require_GET def case_details(request, domain, case_id): timezone = util.get_timezone(request.couch_user, domain) try: case = _get_case_or_404(domain, case_id) except Http404: messages.info( request, "Sorry, we couldn't find that case. If you think this is a mistake please report an issue." ) return HttpResponseRedirect(CaseListReport.get_url(domain=domain)) try: owner_name = CommCareUser.get_by_user_id(case.owner_id, domain).raw_username except Exception: try: owning_group = Group.get(case.owner_id) owner_name = owning_group.display_name if owning_group.domain == domain else '' except Exception: owner_name = None try: username = CommCareUser.get_by_user_id(case.user_id, domain).raw_username except Exception: