diff --git a/ldvspec/lofardata/templates/lofardata/workspecification/dataproducts.html b/ldvspec/lofardata/templates/lofardata/workspecification/dataproducts.html index 845f2e5bfb1d1369cb2a0d246701a0232bb4df9c..8f6db708c27abb0d3ca80f85a21bf621ad5a2b50 100644 --- a/ldvspec/lofardata/templates/lofardata/workspecification/dataproducts.html +++ b/ldvspec/lofardata/templates/lofardata/workspecification/dataproducts.html @@ -3,6 +3,7 @@ {% load crispy_forms_tags %} {% load define_action %} {% load widget_tweaks %} +{% load format_to_percentage %} {% block myBlock %} <div class="overlay"> @@ -25,15 +26,21 @@ </div> <div class="table__content"> {% for key, value in dataproduct_info.items %} - <div class="table__row table__row--dark table__row--padding"> - <div class="table__cell table__cell--title">{{ key }}</div> - <div class="table__cell"> - {% for item in value %} - {{ item }} - {% if not forloop.last %}&{% endif %} - {% endfor %} + {% if value|length > 0 %} + <div class="table__row table__row--dark table__row--padding"> + <div class="table__cell table__cell--title">{{ key }}</div> + <div class="table__cell"> + {% for item in value %} + {% if key == 'dysco_compression' %} + {% format_to_percentage item %} + {% else %} + {{ item }} + {% endif %} + {% if not forloop.last %}&{% endif %} + {% endfor %} + </div> </div> - </div> + {% endif %} {% endfor %} </div> </div> diff --git a/ldvspec/lofardata/templatetags/format_to_percentage.py b/ldvspec/lofardata/templatetags/format_to_percentage.py new file mode 100644 index 0000000000000000000000000000000000000000..2e0fe3c103913962ca8ada2d1b63ae6095d5679e --- /dev/null +++ b/ldvspec/lofardata/templatetags/format_to_percentage.py @@ -0,0 +1,8 @@ +from django import template + +register = template.Library() + + +@register.simple_tag +def format_to_percentage(val): + return '{:.0%}'.format(val) diff --git a/ldvspec/lofardata/tests/test_dataproductinfo.py b/ldvspec/lofardata/tests/test_dataproductinfo.py new file mode 100644 index 0000000000000000000000000000000000000000..7f2d39a8f5a6bded103cc3daf5db8ca2b52c36fb --- /dev/null +++ b/ldvspec/lofardata/tests/test_dataproductinfo.py @@ -0,0 +1,113 @@ +import unittest + +from lofardata.models import DataProduct +from lofardata.views import retrieve_general_dataproduct_information + +test_object_value_one = dict(obs_id='12345', oid_source='SAS', dataproduct_source='lofar', + dataproduct_type='observation', + project='LT10_10', + location='lta-head.lofar.psnc.pl', + activity='secret stuff', + surl='srm://lta-head.lofar.psnc.pl:4884/subfolder/some_nice.tar', + filesize=40, + antenna_set='HBA Dual Inner', + instrument_filter='110-190 MHz', + dysco_compression=True) + +test_object_value_two = dict(obs_id='123789', oid_source='SAS', dataproduct_source='lofar', + dataproduct_type='observation', + project='LT10_10', + location='lta-head.lofar.psnc.pl', + activity='secret stuff', + surl='srm://lta-head.lofar.psnc.pl:4884/subfolder/some_very_nice.tar', + filesize=40, + antenna_set='HBA Dual Inner', + instrument_filter='110-190 MHz', + dysco_compression=True) + +test_object_value_three = dict(obs_id='123789', oid_source='SAS', dataproduct_source='lofar', + dataproduct_type='observation', + project='LT10_10_Classified', + location='lta-head.lofar.psnc.pl', + activity='secret stuff', + surl='srm://lta-head.lofar.psnc.pl:4884/subfolder/some_not_nice.tar', + filesize=40, + antenna_set='HBA Dual Inner', + instrument_filter='110-190 MHz', + dysco_compression=False) + +test_object_value_four = dict(obs_id='1337', oid_source='SAS', dataproduct_source='lofar', + dataproduct_type='observation', + project='LT10_10_Classified', + location='lta-head.lofar.psnc.pl', + activity='secret stuff', + surl='srm://lta-head.lofar.psnc.pl:4884/subfolder/some_not_very_nice.tar', + filesize=40, + antenna_set='HBA Dual Inner', + instrument_filter='110-190 MHz', + dysco_compression=False) + +test_object_value_five = dict(obs_id='3773', oid_source='SAS', dataproduct_source='lofar', + dataproduct_type='observation', + project='LT10_10_Classified', + location='lta-head.lofar.psnc.pl', + activity='secret stuff', + surl='srm://lta-head.lofar.psnc.pl:4884/subfolder/some_not_very_super_nice.tar', + filesize=40, + antenna_set=None, + instrument_filter='110-190 MHz', + dysco_compression=False) + +test_object_value_six = dict(obs_id='0987', oid_source='SAS', dataproduct_source='lofar', + dataproduct_type='observation', + project='LT10_10_Classified', + location='lta-head.lofar.psnc.pl', + activity='secret stuff', + surl='srm://lta-head.lofar.psnc.pl:4884/subfolder/some_very_super_nice.tar', + filesize=40, + antenna_set='', + instrument_filter='', + dysco_compression=False) + +class RetrieveDataProductInformation(unittest.TestCase): + + def setUp(self): + DataProduct.objects.create(**test_object_value_one) + DataProduct.objects.create(**test_object_value_two) + DataProduct.objects.create(**test_object_value_three) + DataProduct.objects.create(**test_object_value_four) + DataProduct.objects.create(**test_object_value_five) + DataProduct.objects.create(**test_object_value_six) + + def test_single_database_entry(self): + actual = retrieve_general_dataproduct_information('12345') + self.assertEqual(actual['dataproduct_source'], ['lofar']) + self.assertEqual(actual['dataproduct_type'], ['observation']) + self.assertEqual(actual['project'], ['LT10_10']) + self.assertEqual(actual['activity'], ['secret stuff']) + self.assertEqual(actual['antenna_set'], ['HBA Dual Inner']) + self.assertEqual(actual['instrument_filter'], ['110-190 MHz']) + + def test_combined_database_entries(self): + actual = retrieve_general_dataproduct_information('123789') + self.assertEqual(actual['project'], ['LT10_10', 'LT10_10_Classified']) + + def test_single_with_none_value(self): + actual = retrieve_general_dataproduct_information('3773') + self.assertEqual(actual['antenna_set'], []) + + def test_single_with_default_values(self): + actual = retrieve_general_dataproduct_information('0987') + self.assertEqual(actual['antenna_set'], []) + + def test_dysco_compression_true_and_false(self): + actual = retrieve_general_dataproduct_information('123789') + self.assertEqual(actual['dysco_compression'], [0.5]) + + def test_dysco_compression_true(self): + actual = retrieve_general_dataproduct_information('12345') + self.assertEqual(actual['dysco_compression'], [1]) + + def test_dysco_compression_false(self): + actual = retrieve_general_dataproduct_information('1337') + self.assertEqual(actual['dysco_compression'], [0]) diff --git a/ldvspec/lofardata/views.py b/ldvspec/lofardata/views.py index 16c2ae34fb461a9e4ab97de42dbd7e4759b46ecf..abe6854b49f2c54086d0ea9c6beadb1092a9d23b 100644 --- a/ldvspec/lofardata/views.py +++ b/ldvspec/lofardata/views.py @@ -147,14 +147,21 @@ def preprocess_filters_specification_view(specification): def retrieve_general_dataproduct_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", - "additional_meta").distinct() + data_products = DataProduct.objects.filter(obs_id=sas_id).values('dataproduct_source', + 'dataproduct_type', + 'project', + 'location', + 'activity', + 'antenna_set', + 'instrument_filter', + 'dysco_compression').distinct() combined_data_products_on_key = combine_dataproducts_on_key(data_products, {}) + dysco_compressions = combined_data_products_on_key['dysco_compression'] + 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 @@ -166,12 +173,12 @@ def combine_dataproducts_on_key(data_products, combined_data_products): def fill_unique_nested_dict(data_product, combined_data_products_on_key): for key, value in data_product.items(): - if isinstance(value, dict): - combined_data_products_on_key = fill_unique_nested_dict(value, combined_data_products_on_key) - elif combined_data_products_on_key.get(key) and value not in combined_data_products_on_key.get(key): + if combined_data_products_on_key.get(key) and \ + value not in combined_data_products_on_key.get(key) and \ + value is not None and value is not '': combined_data_products_on_key[key].append(value) else: - combined_data_products_on_key[key] = [value] + combined_data_products_on_key[key] = [value] if value is not None and value is not '' else [] return combined_data_products_on_key