Skip to content

page_views

django_spire.metric.report.views.page_views

report_view

Source code in django_spire/metric/report/views/page_views.py
@permission_required('django_spire_metric_report.view_reportrun')
def report_view(request: WSGIRequest) -> TemplateResponse:
    nav = DomainNavigation()
    nav.page_title = 'Reports'
    nav.page_description = 'More Reporting Info'

    nav.breadcrumbs.add('Reports', 'django_spire:metric:report:page:report')

    page_report_registry = ReportRegistry()

    for report_registry in settings.DJANGO_SPIRE_REPORT_REGISTRIES:
        report_registry_class = get_object_from_module_string(report_registry)

        page_report_registry.add_registry(report_registry_class())

    context: dict[str, Any] = {}

    context['registry'] = page_report_registry

    if request.GET:
        report_key_stack = request.GET.get('report_key_stack', None)

        if report_key_stack:
            report = page_report_registry.get_report_from_key_stack(report_key_stack)

            if report:
                for key in report_key_stack.split('|'):
                    nav.breadcrumbs.add(name=key)

                context['report_run_arguments'] = report.run_arguments

                context['report_run_arguments_values'] = {}

                for argument, run_argument in context['report_run_arguments'].items():
                    get_request_value = _report_argument_value(request, argument, run_argument)

                    if get_request_value is _UNSET:
                        context.setdefault('report_invalid_arguments', []).append(argument)
                        get_request_value = None

                    context['report_run_arguments_values'][argument] = get_request_value

                if request.GET.get('report_should_run', 'false').lower() == 'true':
                    missing_arguments = [
                        argument
                        for argument, value in context['report_run_arguments_values'].items()
                        if value is None and context['report_run_arguments'][argument]['required']
                    ]

                    if not missing_arguments:
                        ReportRun.objects.create(report_key_stack=report_key_stack)
                        report.run(**context['report_run_arguments_values'])
                    else:
                        context['report_missing_arguments'] = missing_arguments

                context['report'] = report
                context['report_run_count'] = ReportRun.objects.run_count(report_key_stack)

    else:
        top_ten_report_runs = [
            {
                **report_run,
                'report_key_stack_verbose': report_run['report_key_stack'].replace('|', ' > '),
            }
            for report_run in ReportRun.objects.by_top_ten()
        ]

        context['top_ten_report_runs'] = top_ten_report_runs

    context.update(nav.as_context())

    return TemplateResponse(
        request, 'django_spire/metric/report/page/report_page.html', context=context
    )