示例#1
0
def create_case_repeater_register(repeater, domain, payload):
    """
    Only useful in a very specific edge case for CreateCaseRepeater
    If a CreateCaseRepeater has a missing repeat record, but the case now contains update transactions
    This can be used to properly trigger the missing repeat record.
    """
    if not isinstance(repeater, CreateCaseRepeater):
        logger.error(
            f"Error - cannot call create_case_repeater_register on repeater type f{type(repeater)}"
        )
        return

    if not create_case_repeater_allowed_to_forward(repeater, payload):
        return

    now = datetime.utcnow()
    repeat_record = RepeatRecord(repeater_id=repeater.get_id,
                                 repeater_type=repeater.doc_type,
                                 domain=domain,
                                 registered_on=now,
                                 next_check=now,
                                 payload_id=payload.get_id)
    metrics_counter('commcare.repeaters.new_record',
                    tags={
                        'domain': domain,
                        'doc_type': repeater.doc_type
                    })
    repeat_record.save()
    repeat_record.attempt_forward_now()
    return repeat_record
    def create_repeat_records_on_dest_repeater(self, source_repeater_id,
                                               dest_repeater_id, state):
        dest_repeater = Repeater.get(dest_repeater_id)
        retriggered = set()

        records = iter_repeat_records_by_domain(domain,
                                                repeater_id=source_repeater_id,
                                                state=state)
        record_count = get_repeat_record_count(domain,
                                               repeater_id=source_repeater_id,
                                               state=state)
        accessor = CaseAccessors(domain)
        print("Iterating over records and adding new record for them")
        for record in with_progress_bar(records, length=record_count):
            if record.payload_id in retriggered:
                self.record_failure(record.get_id,
                                    record.payload_id,
                                    error_message="Already triggered")
                continue
            try:
                episode = accessor.get_case(record.payload_id)
                episode_case_properties = episode.dynamic_case_properties()
                if (episode_case_properties.get('nikshay_registered', 'false')
                        == 'false' and episode_case_properties.get(
                            'private_nikshay_registered', 'false') == 'false'
                        and not episode_case_properties.get('nikshay_id')
                        and episode_case_properties.get('episode_type')
                        == 'confirmed_tb'
                        and is_valid_episode_submission(episode)):
                    new_record = RepeatRecord(
                        domain=domain,
                        next_check=datetime.utcnow(),
                        repeater_id=dest_repeater_id,
                        repeater_type=dest_repeater.doc_type,
                        payload_id=record.payload_id,
                    )
                    if not self.dry_run:
                        new_record.save()
                    retriggered.add(record.payload_id)
                    self.add_row(
                        record,
                        episode_case_properties.get('migration_created_case'),
                        new_record.get_id)
                else:
                    self.record_failure(record.get_id,
                                        record.payload_id,
                                        error_message="Not to be re-triggered")
            except Exception as e:
                self.record_failure(record.get_id,
                                    record.payload_id,
                                    error_message="{error}: {message}".format(
                                        error=e.__name__, message=e.message))
示例#3
0
    def create_repeat_records(cls):
        now = datetime.now()
        cls.couch_records = []
        cls.sql_records = []
        for __ in range(3):
            couch_record = RepeatRecord(
                domain=DOMAIN,
                repeater_id=cls.repeater._id,
                repeater_type='FormRepeater',
                payload_id=cls.instance_id,
                registered_on=now,
            )
            couch_record.save()
            cls.couch_records.append(couch_record)

            cls.sql_records.append(
                SQLRepeatRecord.objects.create(
                    domain=DOMAIN,
                    couch_id=couch_record._id,
                    payload_id=cls.instance_id,
                    repeater=cls.sql_repeater,
                    registered_at=now,
                ))