Ejemplo n.º 1
0
def sum_orm_queries(plans: SmartDjangoQuery, cases: SmartDjangoQuery,
                    runs: SmartDjangoQuery, target: str) -> QuerySet:
    """Search target objects together with selected relatives

    :return: a QuerySet object representing queried target objects.
    :rtype: QuerySet
    """
    plans = plans.evaluate()
    cases = cases.evaluate()
    runs = runs.evaluate()

    if target == 'run':
        if plans is None and cases is None:
            if runs is None:
                runs = TestRun.objects.none()
        if runs is None:
            runs = TestRun.objects.all()
        if cases is not None:
            runs = runs.filter(case_run__case__in=cases).distinct()
        if plans is not None:
            runs = runs.filter(plan__in=plans).distinct()
        runs = runs.extra(select={'cases_count': RawSQL.total_num_caseruns})
        return (runs.select_related('manager', 'default_tester',
                                    'build__product', 'product_version').only(
                                        'pk', 'summary', 'stop_date',
                                        'manager__username',
                                        'default_tester__username',
                                        'build__product__name',
                                        'product_version__value'))

    if target == 'plan':
        if cases is None and runs is None:
            if plans is None:
                plans = TestPlan.objects.none()
        if plans is None:
            plans = TestPlan.objects.all()
        if cases is not None:
            plans = plans.filter(case__in=cases).distinct()
        if runs is not None:
            plans = plans.filter(run__in=runs).distinct()
        return (TestPlan.apply_subtotal(
            plans, cases_count=True, runs_count=True).select_related(
                'author', 'owner', 'type',
                'product').only('pk', 'name', 'is_active', 'author__username',
                                'owner__username', 'product__name',
                                'type__name'))

    if target == 'case':
        if plans is None and runs is None:
            if cases is None:
                cases = TestCase.objects.none()
        if cases is None:
            cases = TestCase.objects.all()
        if runs is not None:
            cases = cases.filter(case_run__run__in=runs).distinct()
        if plans is not None:
            cases = cases.filter(plan__in=plans).distinct()
        return (cases.select_related(
            'author', 'default_tester', 'case_status', 'category',
            'priority').only('pk', 'summary', 'create_date', 'is_automated',
                             'is_automated_proposed', 'author__username',
                             'default_tester__username', 'case_status__name',
                             'category__name', 'priority__value'))