def read_workbook(wb): ''' Parse the Screen Result load file into valid API input format ''' try: logger.info('read screen result file sheets...') sheets = workbook_sheets(wb) sheet = sheets.next() logger.info('read Screen Info sheet: %r', sheet.name) meta_cols = sheet_cols(sheet) meta_raw = dict(zip(meta_cols.next(),meta_cols.next())) meta = { META_MAP.get(key, key):val for key,val in meta_raw.items() } logger.info('meta: %r', meta) sheet = sheets.next() logger.info('read Data Columns sheet: %r...', sheet.name) columns = parse_columns(data_column_generator(sheet_cols(sheet))) result_values = parse_result_values(columns,sheets) return OrderedDict(( ('meta', meta), ('fields', columns), ('objects', result_values), )) except ValidationError,e: logger.exception('parse error: %r', e) raise
def parse_columns(columns_sheet): logger.info('parsing columns sheet: %r', columns_sheet.name) columns = data_column_generator(sheet_cols(columns_sheet)) parsed_cols = OrderedDict() errors = {} for i,column in enumerate(columns): parsed_col = { 'is_derived': False, 'is_follow_up_data': False, 'ordinal': i } logger.debug('parsing column: %r', column['data_worksheet_column']) parsed_cols[column['data_worksheet_column']] = parsed_col for key,val in column.items(): if key == 'is_follow_up_data': parsed_col[key] = ( val and val.lower() == 'follow up') elif key == 'data_type': val = default_converter(val) # handle validation errors in the api if val not in DATA_TYPES: key = '%s:%s' % (column['data_worksheet_column'],'data_type') errors[key] = 'val: %r must be one of %r' % (val,DATA_TYPES) parsed_col[key] = val elif key == 'assay_readout_type': parsed_col[key] = default_converter(val) else: if key == 'how_derived': parsed_col['is_derived'] = ( val is not None and val.strip() is not '' ) parsed_col[key] = val if parsed_col.get('decimal_places', None): try: key = '%s:%s' % (column['data_worksheet_column'],'data_type') column['decimal_places'] = parse_val( column['decimal_places'],key,'integer') except ValidationError, e: errors.update(e.errors) logger.debug('parsed_col: %r', parsed_col)