Return the dictionary of **kwargs with the correct datums attribute
        names and data types for the top level of the report, and return the
        nested levels separately.

def _report(self, action, key_mapper=mappers._report_key_mapper):
        '''Return the dictionary of **kwargs with the correct datums attribute
        names and data types for the top level of the report, and return the
        nested levels separately.
        '''
        _top_level = [
            k for k, v in self.report.items() if not isinstance(v, dict)]
        _nested_level = [
            k for k, v in self.report.items() if isinstance(v, dict)]
        top_level_dict = {}
        nested_levels_dict = {}
        for key in _top_level:
            try:
                if key == 'date' or key == 'timestamp':
                    item = mappers._key_type_mapper[key](
                        str(self.report[key]), **{'ignoretz': True})
                else:
                    item = mappers._key_type_mapper[key](str(
                        self.report[key]) if key != 'draft' else self.report[key])
            except KeyError:
                item = self.report[key]
            finally:
                try:
                    top_level_dict[key_mapper[key]] = item
                except KeyError:
                    warnings.warn('''
                        {0} is not currently supported by datums and will be ignored.
                        Would you consider submitting an issue to add support?
                        https://www.github.com/thejunglejane/datums/issues
                        '''.format(key))
        for key in _nested_level:
            nested_levels_dict[key] = self.report[key]
            # Add the parent report ID
            nested_levels_dict[key][
                'reportUniqueIdentifier'] = mappers._key_type_mapper[
                    'uniqueIdentifier'](str(self.report['uniqueIdentifier']))
            if key == 'placemark':
                # Add the parent location report UUID
                nested_levels_dict[key][
                    'locationUniqueIdentifier'] = nested_levels_dict[key].pop(
                        'reportUniqueIdentifier')
            # Create UUID for altitude report if there is not one and the action
            # is get_or_create, else delete the altitude report from the nested
            # levels and warn that it will not be updated
            if 'uniqueIdentifier' not in nested_levels_dict[key]:
                if action.__func__.func_name == 'get_or_create':
                    nested_levels_dict[key]['uniqueIdentifier'] = uuid.uuid4()
                else:
                    del nested_levels_dict[key]
                    warnings.warn('''
                        No uniqueIdentifier found for AltitudeReport in {0}.
                        Existing altitude report will not be updated.
                        '''.format(self.report['uniqueIdentifier']))
        return top_level_dict, nested_levels_dict