def get_item_properties(item, fields, mixed_case_fields=(), formatters=None):
if formatters is None:<EOL><INDENT>formatters = {}<EOL><DEDENT>row = []<EOL>for field in fields:<EOL><INDENT>if field in formatters:<EOL><INDENT>row.append(formatters[field](item))<EOL><DEDENT>else:<EOL><INDENT>if field in mixed_case_fields:<EOL><INDENT>field_name = field.replace('<STR_LIT:U+0020>', '<STR_LIT:_>')<EOL><DEDENT>else:<EOL><INDENT>field_name = field.lower().replace('<STR_LIT:U+0020>', '<STR_LIT:_>')<EOL><DEDENT>if not hasattr(item, field_name) and isinstance(item, dict):<EOL><INDENT>data = item[field_name]<EOL><DEDENT>else:<EOL><INDENT>data = getattr(item, field_name, '<STR_LIT>')<EOL><DEDENT>if data is None:<EOL><INDENT>data = '<STR_LIT>'<EOL><DEDENT>row.append(data)<EOL><DEDENT><DEDENT>return tuple(row)<EOL>
Return a tuple containing the item properties.

    :param item: a single item resource (e.g. Server, Tenant, etc)
    :param fields: tuple of strings with the desired field names
    :param mixed_case_fields: tuple of field names to preserve case
    :param formatters: dictionary mapping field names to callables
       to format the values