from lofardata.models import DataProduct def retrieve_combined_information(sas_id): # Per SAS ID, the retrieved data products should have these unique values data_products = DataProduct.objects.filter(obs_id=sas_id).values('dataproduct_source', 'dataproduct_type', 'project', 'location', 'activity', 'antenna_set', 'instrument_filter', 'dysco_compression').distinct() if len(data_products) == 0: return {} combined_data_products_on_key = combine_dataproducts_on_key(data_products) dysco_compressions = combined_data_products_on_key['dysco_compression'] if len(dysco_compressions) == 0: # the dysco_compression is unknown i.e. None combined_data_products_on_key['dysco_compression'] = [0] else: true_count = len([dysco_compression for dysco_compression in dysco_compressions if dysco_compression]) dysco_compression_true_percentage = true_count / len(combined_data_products_on_key['dysco_compression']) # put in a list for template convenience combined_data_products_on_key['dysco_compression'] = [dysco_compression_true_percentage] return combined_data_products_on_key def combine_dataproducts_on_key(data_products): combined_data_products = {} for data_product in data_products: combined_data_products = fill_unique_nested_dict(data_product, combined_data_products) return combined_data_products def fill_unique_nested_dict(data_product, combined_data_products_on_key): for key, value in data_product.items(): if combined_data_products_on_key.get(key) and value not in combined_data_products_on_key.get(key): combined_data_products_on_key[key].append(value) else: combined_data_products_on_key[key] = [value] if value is not None and value != '' else [] return combined_data_products_on_key