Beispiel #1
0
def _get_summary_details(config, domain, module, new_mobile_ucr_restore=False):
    def _get_graph_fields():
        from corehq.apps.userreports.reports.specs import MultibarChartSpec
        from corehq.apps.app_manager.models import GraphConfiguration, GraphSeries

        def _locale_config(key):
            return id_strings.mobile_ucr_configuration(
                module,
                config.uuid,
                key
            )

        def _locale_series_config(index, key):
            return id_strings.mobile_ucr_series_configuration(
                module,
                config.uuid,
                index,
                key
            )

        def _locale_annotation(index):
            return id_strings.mobile_ucr_annotation(
                module,
                config.uuid,
                index
            )


        for chart_config in config.report(domain).charts:
            if isinstance(chart_config, MultibarChartSpec):
                graph_config = config.complete_graph_configs.get(chart_config.chart_id, GraphConfiguration(
                    series=[GraphSeries() for c in chart_config.y_axis_columns],
                ))

                # Reconcile graph_config.series with any additions/deletions in chart_config.y_axis_columns
                while len(chart_config.y_axis_columns) > len(graph_config.series):
                    graph_config.series.append(GraphSeries())
                if len(chart_config.y_axis_columns) < len(graph_config.series):
                    graph_config.series = graph_config.series[:len(chart_config.y_axis_columns)]

                for index, column in enumerate(chart_config.y_axis_columns):
                    graph_config.series[index].data_path = (
                        graph_config.series[index].data_path or
                        get_data_path(config, domain, new_mobile_ucr_restore)
                    )
                    graph_config.series[index].x_function = (
                        graph_config.series[index].x_function
                        or _get_column_xpath_template(new_mobile_ucr_restore).format(chart_config.x_axis_column)
                    )
                    graph_config.series[index].y_function = (
                        graph_config.series[index].y_function
                        or _get_column_xpath_template(new_mobile_ucr_restore).format(column.column_id)
                    )
                yield Field(
                    header=Header(text=Text()),
                    template=GraphTemplate.build('graph', graph_config,
                                                 locale_config=_locale_config,
                                                 locale_series_config=_locale_series_config,
                                                 locale_annotation=_locale_annotation)
                )

    def _get_last_sync(report_config):
        if new_mobile_ucr_restore:
            last_sync_string = "format-date(date(instance('commcare-reports:{}')/@last_sync), '%Y-%m-%d %H:%M')"
            last_sync_string = last_sync_string.format(report_config.instance_id)
        else:
            last_sync_string = "format-date(date(instance('reports')/reports/@last_sync), '%Y-%m-%d %H:%M')"

        return Text(
            xpath=Xpath(
                function=last_sync_string
            )
        )

    def _get_description_text(report_config):
        if report_config.use_xpath_description:
            return Text(
                xpath=Xpath(function=config.xpath_description)
            )
        else:
            return Text(
                locale=Locale(id=id_strings.report_description(report_config.uuid))
            )

    detail_id = 'reports.{}.summary'.format(config.uuid)
    detail = Detail(
        title=Text(
            locale=Locale(id=id_strings.report_menu()),
        ),
        fields=[
            Field(
                header=Header(
                    text=Text(
                        locale=Locale(id=id_strings.report_name_header())
                    )
                ),
                template=Template(
                    text=Text(
                        locale=Locale(id=id_strings.report_name(config.uuid))
                    )
                ),
            ),
            Field(
                header=Header(
                    text=Text(
                        locale=Locale(id=id_strings.report_description_header()),
                    )
                ),
                template=Template(
                    text=_get_description_text(config)
                ),
            ),
        ] + [
            Field(
                header=Header(
                    text=Text(
                        locale=Locale(id=id_strings.report_last_sync())
                    )
                ),
                template=Template(text=_get_last_sync(config))
            ),
        ] + list(_get_graph_fields()),
    )
    if config.show_data_table:
        return models.Detail(custom_xml=Detail(
            id=detail_id,
            title=Text(
                locale=Locale(id=id_strings.report_menu()),
            ),
            details=[detail, _get_data_detail(config, domain, new_mobile_ucr_restore)]
        ).serialize().decode('utf-8'))
    else:
        detail.id = detail_id
        return models.Detail(custom_xml=detail.serialize().decode('utf-8'))
Beispiel #2
0
def _get_summary_details(config, domain, module):
    def _get_graph_fields():
        from corehq.apps.userreports.reports.specs import MultibarChartSpec
        from corehq.apps.app_manager.models import GraphConfiguration, GraphSeries

        def _locale_config(key):
            return id_strings.mobile_ucr_configuration(module, config.uuid,
                                                       key)

        def _locale_series_config(index, key):
            return id_strings.mobile_ucr_series_configuration(
                module, config.uuid, index, key)

        def _locale_annotation(index):
            return id_strings.mobile_ucr_annotation(module, config.uuid, index)

        for chart_config in config.report(domain).charts:
            if isinstance(chart_config, MultibarChartSpec):
                graph_config = config.complete_graph_configs.get(
                    chart_config.chart_id,
                    GraphConfiguration(series=[
                        GraphSeries() for c in chart_config.y_axis_columns
                    ], ))
                for index, column in enumerate(chart_config.y_axis_columns):
                    graph_config.series[index].data_path = (
                        graph_config.series[index].data_path
                        or get_data_path(config, domain))
                    graph_config.series[index].x_function = (
                        graph_config.series[index].x_function
                        or COLUMN_XPATH_TEMPLATE.format(
                            chart_config.x_axis_column))
                    graph_config.series[index].y_function = (
                        graph_config.series[index].y_function
                        or COLUMN_XPATH_TEMPLATE.format(column.column_id))
                yield Field(header=Header(text=Text()),
                            template=GraphTemplate.build(
                                'graph',
                                graph_config,
                                locale_config=_locale_config,
                                locale_series_config=_locale_series_config,
                                locale_annotation=_locale_annotation))

    def _get_description_text(report_config):
        if report_config.use_xpath_description:
            return Text(xpath=Xpath(function=config.xpath_description))
        else:
            return Text(locale=Locale(
                id=id_strings.report_description(report_config.uuid)))

    detail_id = 'reports.{}.summary'.format(config.uuid)
    detail = Detail(
        title=Text(locale=Locale(id=id_strings.report_menu()), ),
        fields=[
            Field(
                header=Header(text=Text(locale=Locale(
                    id=id_strings.report_name_header()))),
                template=Template(text=Text(locale=Locale(
                    id=id_strings.report_name(config.uuid)))),
            ),
            Field(
                header=Header(text=Text(locale=Locale(
                    id=id_strings.report_description_header()), )),
                template=Template(text=_get_description_text(config)),
            ),
        ] + [
            Field(
                header=Header(text=Text(locale=Locale(
                    id=id_strings.report_last_sync()))),
                template=Template(text=Text(xpath=Xpath(
                    function=
                    "format-date(date(instance('reports')/reports/@last_sync), '%Y-%m-%d %H:%M')"
                )))),
        ] + list(_get_graph_fields()),
    )
    if config.show_data_table:
        return models.Detail(custom_xml=Detail(
            id=detail_id,
            title=Text(locale=Locale(id=id_strings.report_menu()), ),
            details=[detail, _get_data_detail(config, domain)
                     ]).serialize().decode('utf-8'))
    else:
        detail.id = detail_id
        return models.Detail(custom_xml=detail.serialize().decode('utf-8'))
Beispiel #3
0
def _get_summary_details(config, domain, module, new_mobile_ucr_restore=False):
    def _get_graph_fields():
        from corehq.apps.userreports.reports.specs import MultibarChartSpec
        from corehq.apps.app_manager.models import GraphConfiguration, GraphSeries

        def _locale_config(key):
            return id_strings.mobile_ucr_configuration(module, config.uuid,
                                                       key)

        def _locale_series_config(index, key):
            return id_strings.mobile_ucr_series_configuration(
                module, config.uuid, index, key)

        def _locale_annotation(index):
            return id_strings.mobile_ucr_annotation(module, config.uuid, index)

        for chart_config in config.report(domain).charts:
            if isinstance(chart_config, MultibarChartSpec):
                graph_config = config.complete_graph_configs.get(
                    chart_config.chart_id,
                    GraphConfiguration(series=[
                        GraphSeries() for c in chart_config.y_axis_columns
                    ], ))

                # Reconcile graph_config.series with any additions/deletions in chart_config.y_axis_columns
                while len(chart_config.y_axis_columns) > len(
                        graph_config.series):
                    graph_config.series.append(GraphSeries())
                if len(chart_config.y_axis_columns) < len(graph_config.series):
                    graph_config.series = graph_config.series[:len(
                        chart_config.y_axis_columns)]

                for index, column in enumerate(chart_config.y_axis_columns):
                    graph_config.series[index].data_path = (
                        graph_config.series[index].data_path or get_data_path(
                            config, domain, new_mobile_ucr_restore))
                    graph_config.series[index].x_function = (
                        graph_config.series[index].x_function
                        or _get_column_xpath_template(new_mobile_ucr_restore).
                        format(chart_config.x_axis_column))
                    graph_config.series[index].y_function = (
                        graph_config.series[index].y_function
                        or _get_column_xpath_template(
                            new_mobile_ucr_restore).format(column.column_id))
                yield Field(header=Header(text=Text()),
                            template=GraphTemplate.build(
                                'graph',
                                graph_config,
                                locale_config=_locale_config,
                                locale_series_config=_locale_series_config,
                                locale_annotation=_locale_annotation))

    def _get_last_sync(report_config):
        if new_mobile_ucr_restore:
            last_sync_string = "format-date(date(instance('commcare-reports:{}')/@last_sync), '%Y-%m-%d %H:%M')"
            last_sync_string = last_sync_string.format(
                report_config.instance_id)
        else:
            last_sync_string = "format-date(date(instance('reports')/reports/@last_sync), '%Y-%m-%d %H:%M')"

        return Text(xpath=TextXPath(function=last_sync_string))

    def _get_description_text(report_config):
        if report_config.use_xpath_description:
            return Text(xpath=TextXPath(function=config.xpath_description))
        else:
            return Text(locale=Locale(
                id=id_strings.report_description(report_config.uuid)))

    detail_id = 'reports.{}.summary'.format(config.uuid)
    fields = [
        Field(
            header=Header(text=Text(locale=Locale(
                id=id_strings.report_name_header()))),
            template=Template(text=Text(locale=Locale(
                id=id_strings.report_name(config.uuid)))),
        ),
        Field(
            header=Header(text=Text(locale=Locale(
                id=id_strings.report_description_header()), )),
            template=Template(text=_get_description_text(config)),
        ),
    ]

    if not getattr(module, 'report_context_tile', False):
        # Don't add "Last Sync" if the module already contains the similar-looking
        # "Reports last updated on" tile
        fields.append(
            Field(header=Header(text=Text(locale=Locale(
                id=id_strings.report_last_sync()))),
                  template=Template(text=_get_last_sync(config))))
    fields += list(_get_graph_fields())

    detail = Detail(
        title=Text(locale=Locale(id=id_strings.report_menu()), ),
        fields=fields,
    )
    if config.show_data_table:
        return models.Detail(custom_xml=Detail(
            id=detail_id,
            title=Text(locale=Locale(id=id_strings.report_menu()), ),
            details=[
                detail,
                _get_data_detail(config, domain, new_mobile_ucr_restore)
            ]).serialize().decode('utf-8'))
    else:
        detail.id = detail_id
        return models.Detail(custom_xml=detail.serialize().decode('utf-8'))