Beispiel #1
0
        def check_node_count_rebuild(flow, assert_count):
            node_counts = FlowNodeCount.get_totals(flow)

            call_command("recalc_node_counts", flow_id=flow.id)

            new_counts = FlowNodeCount.get_totals(flow)
            self.assertEqual(new_counts, node_counts)
            self.assertEqual(sum(new_counts.values()), assert_count)
Beispiel #2
0
        def check_node_count_rebuild(flow, assert_count):
            node_counts = FlowNodeCount.get_totals(flow)

            call_command("recalc_node_counts", flow_id=flow.id)

            new_counts = FlowNodeCount.get_totals(flow)
            self.assertEqual(new_counts, node_counts)
            self.assertEqual(sum(new_counts.values()), assert_count)
def do_populate(FlowStep, FlowNodeCount):
    nodes = list(
        FlowStep.objects.filter(
            left_on=None,
            run__is_active=True).distinct('step_uuid').values_list(
                'run__flow_id', 'step_uuid'))

    if nodes:
        print("Fetched %d node UUIDs with active contacts" % len(nodes))

    counts = []
    for flow_id, node_uuid in nodes:
        contact_count = FlowStep.objects.filter(
            step_uuid=node_uuid,
            left_on=None,
            run__is_active=True,
            contact__is_test=False).count()

        FlowNodeCount.objects.filter(flow_id=flow_id,
                                     node_uuid=node_uuid).delete()
        counts.append(
            FlowNodeCount(flow_id=flow_id,
                          node_uuid=node_uuid,
                          count=contact_count))

    FlowNodeCount.objects.bulk_create(counts, batch_size=5000)
def recalc_node_counts(flow):
    node_counts = defaultdict(int)

    all_runs = (flow.runs.filter(
        status__in=(FlowRun.STATUS_ACTIVE, FlowRun.STATUS_WAITING)).exclude(
            current_node_uuid=None).only("id",
                                         "current_node_uuid").order_by("id"))
    max_id = 0

    while True:
        batch = list(all_runs.filter(id__gt=max_id)[:1000])
        if not batch:
            break
        max_id = batch[-1].id

        for run in batch:
            node_counts[run.current_node_uuid] += 1

    records = []
    for node_uuid, count in node_counts.items():
        records.append(
            FlowNodeCount(flow=flow, node_uuid=node_uuid, count=count))

    with transaction.atomic():
        FlowNodeCount.objects.filter(flow=flow).delete()
        FlowNodeCount.objects.bulk_create(records)