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)
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, )