Beispiel #1
0
def _get_user_case_fields(commcare_user):
    def valid_element_name(name):
        try:
            ElementTree.fromstring('<{}/>'.format(name))
            return True
        except ElementTree.ParseError:
            return False

    # remove any keys that aren't valid XML element names
    fields = {
        k: v
        for k, v in commcare_user.user_data.items() if valid_element_name(k)
    }
    # language or phone_number can be null and will break
    # case submission
    fields.update({
        'name': commcare_user.name or commcare_user.raw_username,
        'username': commcare_user.raw_username,
        'email': commcare_user.email,
        'language': commcare_user.language or '',
        'phone_number': commcare_user.phone_number or ''
    })

    add_inferred_export_properties.delay(
        'UserSave',
        commcare_user.domain,
        USERCASE_TYPE,
        fields.keys(),
    )
    return fields
Beispiel #2
0
    def _submit_caseblocks(domain, case_type, caseblocks):
        err = False
        if caseblocks:
            try:
                form, cases = submit_case_blocks(
                    [cb.as_string() for cb in caseblocks],
                    domain,
                    username,
                    user_id,
                )

                if form.is_error:
                    errors.add(error=ImportErrors.ImportErrorMessage,
                               row_number=form.problem)
            except Exception:
                err = True
                errors.add(error=ImportErrors.ImportErrorMessage,
                           row_number=caseblocks[0]._id)
            else:
                properties = set().union(*map(
                    lambda c: set(c.dynamic_case_properties().keys()), cases))
                add_inferred_export_properties.delay(
                    'CaseImporter',
                    domain,
                    case_type,
                    properties,
                )
        return err
 def submit_and_process_caseblocks(self, caseblocks):
     if not caseblocks:
         return
     self.pre_submit_hook()
     try:
         form, cases = self.submit_case_blocks(caseblocks)
         if form.is_error:
             raise Exception("Form error during case import: {}".format(
                 form.problem))
     except Exception:
         notify_exception(
             None, "Case Importer: Uncaught failure submitting caseblocks")
         for row_number, case in caseblocks:
             self.results.add_error(row_number,
                                    exceptions.ImportErrorMessage())
     else:
         if self.record_form_callback:
             self.record_form_callback(form.form_id)
         properties = {
             p
             for c in cases for p in c.dynamic_case_properties().keys()
         }
         if self.config.case_type and len(properties):
             add_inferred_export_properties.delay(
                 'CaseImporter',
                 self.domain,
                 self.config.case_type,
                 properties,
             )
         else:
             _soft_assert = soft_assert(notify_admins=True)
             _soft_assert(
                 len(properties) == 0,
                 'error adding inferred export properties in domain '
                 '({}): {}'.format(self.domain, ", ".join(properties)))
Beispiel #4
0
 def _user_case_changed(self, fields):
     field_names = list(fields)
     if _domain_has_new_fields(self.domain, field_names):
         add_inferred_export_properties.delay(
             'UserSave',
             self.domain,
             USERCASE_TYPE,
             field_names,
         )
Beispiel #5
0
 def _user_case_changed(self, fields):
     field_names = list(fields)
     if _domain_has_new_fields(self.domain, field_names):
         add_inferred_export_properties.delay(
             'UserSave',
             self.domain,
             USERCASE_TYPE,
             field_names,
         )
Beispiel #6
0
    def _submit_caseblocks(domain, case_type, caseblocks):
        err = False
        if caseblocks:
            try:
                form, cases = submit_case_blocks(
                    [cb.case.as_string().decode('utf-8') for cb in caseblocks],
                    domain,
                    username,
                    user_id,
                    device_id=__name__ + ".do_import",
                )

                if form.is_error:
                    errors.add(
                        error=ImportErrors.ImportErrorMessage,
                        row_number=form.problem
                    )
            except Exception:
                err = True
                for row_number, case in caseblocks:
                    errors.add(
                        error=ImportErrors.ImportErrorMessage,
                        row_number=row_number
                    )
            else:
                if record_form_callback:
                    record_form_callback(form.form_id)
                properties = set().union(*[set(c.dynamic_case_properties().keys()) for c in cases])
                if case_type and len(properties):
                    add_inferred_export_properties.delay(
                        'CaseImporter',
                        domain,
                        case_type,
                        properties,
                    )
                else:
                    _soft_assert = soft_assert(notify_admins=True)
                    _soft_assert(
                        len(properties) == 0,
                        'error adding inferred export properties in domain '
                        '({}): {}'.format(domain, ", ".join(properties))
                    )
        return err
Beispiel #7
0
    def _submit_caseblocks(domain, case_type, caseblocks):
        err = False
        if caseblocks:
            try:
                form, cases = submit_case_blocks(
                    [cb.case.as_string() for cb in caseblocks],
                    domain,
                    username,
                    user_id,
                )

                if form.is_error:
                    errors.add(
                        error=ImportErrors.ImportErrorMessage,
                        row_number=form.problem
                    )
            except Exception:
                err = True
                for row_number, case in caseblocks:
                    errors.add(
                        error=ImportErrors.ImportErrorMessage,
                        row_number=row_number
                    )
            else:
                if record_form_callback:
                    record_form_callback(form.form_id)
                properties = set().union(*map(lambda c: set(c.dynamic_case_properties().keys()), cases))
                if case_type and len(properties):
                    add_inferred_export_properties.delay(
                        'CaseImporter',
                        domain,
                        case_type,
                        properties,
                    )
                else:
                    _soft_assert = soft_assert(notify_admins=True)
                    _soft_assert(
                        len(properties) == 0,
                        'error adding inferred export properties in domain '
                        '({}): {}'.format(domain, ", ".join(properties))
                    )
        return err
Beispiel #8
0
    def _submit_caseblocks(domain, case_type, caseblocks):
        err = False
        if caseblocks:
            try:
                form, cases = submit_case_blocks(
                    [cb.as_string() for cb in caseblocks],
                    domain,
                    username,
                    user_id,
                )

                if form.is_error:
                    errors.add(
                        error=ImportErrors.ImportErrorMessage,
                        row_number=form.problem
                    )
            except Exception:
                err = True
                errors.add(
                    error=ImportErrors.ImportErrorMessage,
                    row_number=caseblocks[0].case_id
                )
            else:
                properties = set().union(*map(lambda c: set(c.dynamic_case_properties().keys()), cases))
                if case_type and len(properties):
                    add_inferred_export_properties.delay(
                        'CaseImporter',
                        domain,
                        case_type,
                        properties,
                    )
                else:
                    _soft_assert = soft_assert(notify_admins=True)
                    _soft_assert(
                        len(properties) == 0,
                        'error adding inferred export properties in domain '
                        '({}): {}'.format(domain, ", ".join(properties))
                    )
        return err
Beispiel #9
0
def _get_user_case_fields(commcare_user):
    def valid_element_name(name):
        try:
            ElementTree.fromstring("<{}/>".format(name))
            return True
        except ElementTree.ParseError:
            return False

    # remove any keys that aren't valid XML element names
    fields = {k: v for k, v in commcare_user.user_data.items() if valid_element_name(k)}
    # language or phone_number can be null and will break
    # case submission
    fields.update(
        {
            "name": commcare_user.name or commcare_user.raw_username,
            "username": commcare_user.raw_username,
            "email": commcare_user.email,
            "language": commcare_user.language or "",
            "phone_number": commcare_user.phone_number or "",
        }
    )

    add_inferred_export_properties.delay("UserSave", commcare_user.domain, USERCASE_TYPE, fields.keys())
    return fields