@classmethod
    def from_row(cls, row_dict):
        tag = row_dict.get('table_id') or row_dict.get('tag')
        if tag is None:
            raise ExcelMalformatException(_(FAILURE_MESSAGES['has_no_column']).format(column_name='table_id'))

        field_names = row_dict.get('field')
        item_attributes = row_dict.get('property')

        if field_names is None and item_attributes is None:
            raise ExcelMalformatException(_(FAILURE_MESSAGES['neither_fields_nor_attributes']).format(tag=tag))

        field_names = [] if field_names is None else field_names
        item_attributes = [] if item_attributes is None else item_attributes

        def _get_field_properties(prop_key):
            if row_dict.has_key(prop_key):
                try:
                    properties = row_dict[prop_key]["property"]
                    assert isinstance(properties, list)
                except (__HOLE__, AssertionError):
                    error_message = _(FAILURE_MESSAGES["wrong_property_syntax"]).format(
                        prop_key=prop_key,
                    )
                    raise ExcelMalformatException(error_message)
                else:
                    return properties
            else:
                return []

        fields = [
            FixtureTypeField(
                field_name=field,
                properties=_get_field_properties('field {count}'.format(count=i + 1))
            ) for i, field in enumerate(field_names)
        ]

        return FixtureTableDefinition(
            table_id=tag,
            fields=fields,
            item_attributes=item_attributes,
            is_global=row_dict.get('is_global', False),
            uid=row_dict.get('UID'),
            delete=(row_dict.get(DELETE_HEADER) or '').lower() == 'y',
        )
dataset/ETHPy150Open dimagi/commcare-hq/corehq/apps/fixtures/upload.py/FixtureTableDefinition.from_row