def audit_item_status(value, system): if 'status' not in value: return level = STATUS_LEVEL.get(value['status'], 50) if level == 0: return context = system['context'] request = system['request'] linked = set() for schema_path in context.type_info.schema_links: if schema_path in ['supercedes', 'step_run']: continue linked.update(simple_path_ids(value, schema_path)) for path in linked: linked_value = request.embed(path + '@@object') if 'status' not in linked_value: continue if linked_value['status'] == 'disabled': continue if ( # Special case: A revoked file can have a deleted replicate ticket #2938 'file' in value['@type'] and value['status'] == 'revoked' and 'replicate' in linked_value['@type'] and linked_value['status'] == 'deleted' ): continue linked_level = STATUS_LEVEL.get(linked_value['status'], 50) if linked_level == 0: detail = '{} {} has {} subobject {}'.format( value['status'], value['@id'], linked_value['status'], linked_value['@id']) yield AuditFailure('mismatched status', detail, level='ERROR') elif linked_level < level: detail = '{} {} has {} subobject {}'.format( value['status'], value['@id'], linked_value['status'], linked_value['@id']) yield AuditFailure('mismatched status', detail, level='DCC_ACTION')
def metadata_tsv(context, request): param_list = parse_qs(request.matchdict['search_params']) param_list['field'] = [] header = [] file_attributes = [] for prop in _tsv_mapping: header.append(prop) param_list['field'] = param_list['field'] + _tsv_mapping[prop] if _tsv_mapping[prop][0].startswith('files'): file_attributes = file_attributes + [_tsv_mapping[prop][0]] param_list['limit'] = ['all'] path = '/search/?%s' % urlencode(param_list, True) results = request.embed(path, as_user=True) rows = [] for row in results['@graph']: if row['files']: exp_data_row = [] for column in header: if not _tsv_mapping[column][0].startswith('files'): temp = [] for c in _tsv_mapping[column]: c_value = [] for value in simple_path_ids(row, c): if str(value) not in c_value: c_value.append(str(value)) if c == 'replicates.library.biosample.post_synchronization_time' and len(temp): if len(c_value): temp[0] = temp[0] + ' + ' + c_value[0] elif len(temp): if len(c_value): temp = [x + ' ' + c_value[0] for x in temp] else: temp = c_value exp_data_row.append(', '.join(list(set(temp)))) f_attributes = ['files.title', 'files.file_type', 'files.output_type'] for f in row['files']: if 'files.file_type' in param_list: if f['file_type'] not in param_list['files.file_type']: continue f['href'] = request.host_url + f['href'] f_row = [] for attr in f_attributes: f_row.append(f[attr[6:]]) data_row = f_row + exp_data_row internal_prop = True for prop in file_attributes: if prop in f_attributes: continue if prop == 'files.replicate.library': if not internal_prop: continue internal_prop = False libraries = [] for l in simple_path_ids(f, prop[6:]): libraries.append(l) if len(libraries): library = request.embed(libraries[0]) data_row.append(library.get('fragmentation_method', '')) data_row.append(library.get('size_range', '')) if 'biosample' in library: data_row.append(library['biosample'].get('age_display', '')) else: data_row.append('') continue else: data_row = data_row + [''] * 3 continue path = prop[6:] temp = [] for value in simple_path_ids(f, path): temp.append(str(value)) if prop == 'files.replicate.rbns_protein_concentration': if 'replicate' in f and 'rbns_protein_concentration_units' in f['replicate']: temp[0] = temp[0] + ' ' + f['replicate']['rbns_protein_concentration_units'] data_row.append(', '.join(list(set(temp)))) rows.append(data_row) fout = io.StringIO() writer = csv.writer(fout, delimiter='\t') writer.writerow(header) writer.writerows(rows) return Response( content_type='text/tsv', body=fout.getvalue(), content_disposition='attachment;filename="%s"' % 'metadata.tsv' )