Exemplo n.º 1
0
def run_case_update_rules_for_domain_and_db(domain,
                                            now,
                                            run_id,
                                            case_type,
                                            db=None):
    domain_obj = Domain.get_by_name(domain)
    max_allowed_updates = domain_obj.auto_case_update_limit or settings.MAX_RULE_UPDATES_IN_ONE_RUN
    start_run = datetime.utcnow()

    last_migration_check_time = None
    cases_checked = 0
    case_update_result = CaseRuleActionResult()

    all_rules = AutomaticUpdateRule.by_domain(
        domain, AutomaticUpdateRule.WORKFLOW_CASE_UPDATE)
    rules = list(all_rules.filter(case_type=case_type))

    boundary_date = AutomaticUpdateRule.get_boundary_date(rules, now)
    for case in AutomaticUpdateRule.iter_cases(domain,
                                               case_type,
                                               boundary_date,
                                               db=db):
        migration_in_progress, last_migration_check_time = check_data_migration_in_progress(
            domain, last_migration_check_time)

        time_elapsed = datetime.utcnow() - start_run
        if (time_elapsed.seconds > HALT_AFTER
                or case_update_result.total_updates >= max_allowed_updates
                or migration_in_progress):
            DomainCaseRuleRun.done(run_id,
                                   DomainCaseRuleRun.STATUS_HALTED,
                                   cases_checked,
                                   case_update_result,
                                   db=db)
            notify_error("Halting rule run for domain %s and case type %s." %
                         (domain, case_type))
            return

        case_update_result.add_result(run_rules_for_case(case, rules, now))
        cases_checked += 1

    run = DomainCaseRuleRun.done(run_id,
                                 DomainCaseRuleRun.STATUS_FINISHED,
                                 cases_checked,
                                 case_update_result,
                                 db=db)

    if run.status == DomainCaseRuleRun.STATUS_FINISHED:
        for rule in rules:
            AutomaticUpdateRule.objects.filter(pk=rule.pk).update(last_run=now)
Exemplo n.º 2
0
def backfill_deduplicate_rule(domain, rule):
    from corehq.apps.data_interfaces.models import (
        AutomaticUpdateRule,
        CaseDeduplicationActionDefinition,
        DomainCaseRuleRun,
    )

    progress_helper = MessagingRuleProgressHelper(rule.pk)
    total_cases_count = CaseSearchES().domain(domain).case_type(
        rule.case_type).count()
    progress_helper.set_total_cases_to_be_processed(total_cases_count)
    now = datetime.utcnow()
    try:
        run_record = DomainCaseRuleRun.objects.create(
            domain=domain,
            started_on=now,
            status=DomainCaseRuleRun.STATUS_RUNNING,
            case_type=rule.case_type,
        )
        action = CaseDeduplicationActionDefinition.from_rule(rule)
        case_iterator = AutomaticUpdateRule.iter_cases(
            domain, rule.case_type, include_closed=action.include_closed)
        iter_cases_and_run_rules(
            domain,
            case_iterator,
            [rule],
            now,
            run_record.id,
            rule.case_type,
            progress_helper=progress_helper,
        )
    finally:
        progress_helper.set_rule_complete()
        AutomaticUpdateRule.objects.filter(pk=rule.pk).update(
            locked_for_editing=False,
            last_run=now,
        )