Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
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])
        },
    })
Ejemplo n.º 7
0
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),
        },
    )
Ejemplo n.º 8
0

@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: