From 13b2aa25b8de74b83c72cdd4b8a481ec3ddb7930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20K=C3=BCnsem=C3=B6ller?= <jkuensem@physik.uni-bielefeld.de> Date: Wed, 4 Jul 2018 16:37:51 +0000 Subject: [PATCH] Task LSMR-13: fixed work io roles and added test coverage, renamed request relation template according to input by JDM --- .gitattributes | 2 +- ...template.py => 0002_auto_20180704_1623.py} | 22 +++-- .../lsmr/lsmrapp/migrations/CMakeLists.txt | 7 +- SAS/LSMR/src/lsmr/lsmrapp/models.py | 14 ++-- SAS/LSMR/src/lsmr/lsmrapp/serializers.py | 8 +- SAS/LSMR/src/lsmr/lsmrapp/viewsets.py | 11 ++- SAS/LSMR/src/lsmr/urls.py | 4 +- SAS/LSMR/test/t_lsmrapp_models.py | 80 ++++++++++++++++--- 8 files changed, 110 insertions(+), 38 deletions(-) rename SAS/LSMR/src/lsmr/lsmrapp/migrations/{0002_generatortemplate_runtemplate_tags_workioroles_workrelationtemplate_workrequesttemplate.py => 0002_auto_20180704_1623.py} (78%) diff --git a/.gitattributes b/.gitattributes index 3d847740f0a..4f4e4ad170f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4245,7 +4245,7 @@ SAS/LSMR/src/lsmr/lsmrapp/__init__.py -text SAS/LSMR/src/lsmr/lsmrapp/admin.py -text SAS/LSMR/src/lsmr/lsmrapp/apps.py -text SAS/LSMR/src/lsmr/lsmrapp/migrations/0001_initial.py -text -SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_generatortemplate_runtemplate_tags_workioroles_workrelationtemplate_workrequesttemplate.py -text +SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180704_1623.py -text SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt -text SAS/LSMR/src/lsmr/lsmrapp/migrations/__init__.py -text SAS/LSMR/src/lsmr/lsmrapp/models.py -text diff --git a/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_generatortemplate_runtemplate_tags_workioroles_workrelationtemplate_workrequesttemplate.py b/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180704_1623.py similarity index 78% rename from SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_generatortemplate_runtemplate_tags_workioroles_workrelationtemplate_workrequesttemplate.py rename to SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180704_1623.py index 76e3ae2945f..2c04f26e11a 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_generatortemplate_runtemplate_tags_workioroles_workrelationtemplate_workrequesttemplate.py +++ b/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180704_1623.py @@ -1,9 +1,9 @@ -# Generated by Django 2.0.6 on 2018-07-03 17:01 +# Generated by Django 2.0.6 on 2018-07-04 16:23 import django.contrib.postgres.fields import django.contrib.postgres.fields.jsonb from django.db import migrations, models -import lsmr.lsmrapp.models +import django.db.models.deletion class Migration(migrations.Migration): @@ -62,13 +62,13 @@ class Migration(migrations.Migration): name='WorkIORoles', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('role', models.CharField(choices=[(lsmr.lsmrapp.models.RoleChoice('correlator'), 'correlator'), (lsmr.lsmrapp.models.RoleChoice('beamformer'), 'beamformer'), (lsmr.lsmrapp.models.RoleChoice('inspection plots'), 'inspection plots'), (lsmr.lsmrapp.models.RoleChoice('calibrator'), 'calibrator'), (lsmr.lsmrapp.models.RoleChoice('target'), 'target'), (lsmr.lsmrapp.models.RoleChoice('input, output'), 'input, output')], max_length=30)), - ('datatype', models.CharField(choices=[(lsmr.lsmrapp.models.DatatypeChoice('visibilities'), 'visibilities'), (lsmr.lsmrapp.models.DatatypeChoice('time series'), 'time series'), (lsmr.lsmrapp.models.DatatypeChoice('instrument model'), 'instrument model'), (lsmr.lsmrapp.models.DatatypeChoice('image'), 'image'), (lsmr.lsmrapp.models.DatatypeChoice('quality'), 'quality')], max_length=30)), - ('dataformat', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[(lsmr.lsmrapp.models.DataformatChoice('MeasurementSet'), 'MeasurementSet'), (lsmr.lsmrapp.models.DataformatChoice('HDF5'), 'HDF5')], max_length=30), blank=True, null=True, size=8)), + ('role', models.CharField(choices=[('CORRELATOR', 'correlator'), ('BEAMFORMER', 'beamformer'), ('INSPECTION_PLOTS', 'inspection plots'), ('CALIBRATOR', 'calibrator'), ('TARGET', 'target'), ('INPUT_OUTPUT', 'input, output')], max_length=30)), + ('datatype', models.CharField(choices=[('VISIBILITIES', 'visibilities'), ('TIME_SERIES', 'time series'), ('INSTRUMENT_MODEL', 'instrument model'), ('IMAGE', 'image'), ('QUALITY', 'quality')], max_length=30)), + ('dataformat', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('MEASUREMENTSET', 'MeasurementSet'), ('HDF5', 'HDF5')], max_length=30), blank=True, null=True, size=8)), ], ), migrations.CreateModel( - name='WorkRelationTemplate', + name='WorkRelationSelectionTemplate', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('tags', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=30), blank=True, null=True, size=8)), @@ -102,4 +102,14 @@ class Migration(migrations.Migration): 'abstract': False, }, ), + migrations.AddField( + model_name='workioroles', + name='inputs', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='role_input', to='lsmrapp.WorkRequestTemplate'), + ), + migrations.AddField( + model_name='workioroles', + name='outputs', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='role_output', to='lsmrapp.WorkRequestTemplate'), + ), ] diff --git a/SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt b/SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt index 9bf48853596..9915ff16653 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt +++ b/SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt @@ -1,11 +1,8 @@ include(PythonInstall) -set(_py_files - __init__.py - 0001_initial.py - 0002_generatortemplate_runtemplate_tags_workioroles_workrelationtemplate_workrequesttemplate.py - ) + +FILE(GLOB _py_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.py) python_install(${_py_files} DESTINATION lofar/sas/lsmr/lsmr/lsmrapp/migrations) \ No newline at end of file diff --git a/SAS/LSMR/src/lsmr/lsmrapp/models.py b/SAS/LSMR/src/lsmr/lsmrapp/models.py index 5226ccbad1c..58cff476945 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/models.py +++ b/SAS/LSMR/src/lsmr/lsmrapp/models.py @@ -84,16 +84,18 @@ class WorkIORoles(Model): # todo: 2. Do that in raw SQL outside Django role = CharField( max_length=30, - choices=[(item, item.value) for item in RoleChoice] + choices=[(item.name, item.value) for item in RoleChoice] ) datatype = CharField( max_length=30, - choices=[(item, item.value) for item in DatatypeChoice] + choices=[(item.name, item.value) for item in DatatypeChoice] ) dataformat = ArrayField(CharField( max_length=30, - choices=[(item, item.value) for item in DataformatChoice] + choices=[(item.name, item.value) for item in DataformatChoice] ), size=8, blank=True, null=True) + outputs = ForeignKey("WorkRequestTemplate", related_name='role_output', on_delete=CASCADE, null=True) + inputs = ForeignKey("WorkRequestTemplate", related_name='role_input', on_delete=CASCADE, null=True) # @@ -126,11 +128,11 @@ class RunTemplate(Template): class WorkRequestTemplate(Template): validation_code_js = CharField(max_length=30) - #outputs = ForeignKey("WorkIORoles", related_name='role_output', on_delete=CASCADE) # todo: removed in latest draft, delete? - #inputs = ForeignKey("WorkIORoles", related_name='role_input', on_delete=CASCADE) # todo: removed in latest draft, delete? + # outputs = ForeignKey("WorkIORoles", related_name='role_output', on_delete=CASCADE) # todo: removed in latest draft, delete? + # inputs = ForeignKey("WorkIORoles", related_name='role_input', on_delete=CASCADE) # todo: removed in latest draft, delete? -class WorkRelationTemplate(Template): +class WorkRelationSelectionTemplate(Template): pass diff --git a/SAS/LSMR/src/lsmr/lsmrapp/serializers.py b/SAS/LSMR/src/lsmr/lsmrapp/serializers.py index 9b41f2ef56c..9b70a05d1b0 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/serializers.py +++ b/SAS/LSMR/src/lsmr/lsmrapp/serializers.py @@ -30,10 +30,14 @@ class WorkRequestTemplateSerializer(serializers.HyperlinkedModelSerializer): fields = '__all__' -class WorkRelationTemplateSerializer(serializers.HyperlinkedModelSerializer): +class WorkRelationSelectionTemplateSerializer(serializers.HyperlinkedModelSerializer): class Meta: - model = models.WorkRelationTemplate + model = models.WorkRelationSelectionTemplate fields = '__all__' +class WorkIORolesSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = models.WorkIORoles + fields = '__all__' diff --git a/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py b/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py index 5bd60cf33a2..ce4aff6ec8c 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py +++ b/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py @@ -26,6 +26,11 @@ class WorkRequestTemplateViewSet(viewsets.ModelViewSet): serializer_class = serializers.WorkRequestTemplateSerializer -class WorkRelationTemplateViewSet(viewsets.ModelViewSet): - queryset = models.WorkRelationTemplate.objects.all() - serializer_class = serializers.WorkRelationTemplateSerializer +class WorkRelationSelectionTemplateViewSet(viewsets.ModelViewSet): + queryset = models.WorkRelationSelectionTemplate.objects.all() + serializer_class = serializers.WorkRelationSelectionTemplateSerializer + + +class WorkIORolesViewSet(viewsets.ModelViewSet): + queryset = models.WorkIORoles.objects.all() + serializer_class = serializers.WorkIORolesSerializer diff --git a/SAS/LSMR/src/lsmr/urls.py b/SAS/LSMR/src/lsmr/urls.py index 3f13789718c..0522c96bdf3 100644 --- a/SAS/LSMR/src/lsmr/urls.py +++ b/SAS/LSMR/src/lsmr/urls.py @@ -40,7 +40,7 @@ router.register(r'tags', viewsets.TagsViewSet) router.register(r'generator_template', viewsets.GeneratorTemplateViewSet) router.register(r'run_template', viewsets.RunTemplateViewSet) router.register(r'work_request_template', viewsets.WorkRequestTemplateViewSet) -router.register(r'work_relation_template', viewsets.WorkRelationTemplateViewSet) - +router.register(r'work_relation_selection_template', viewsets.WorkRelationSelectionTemplateViewSet) +router.register(r'work_io_roles', viewsets.WorkIORolesViewSet) urlpatterns.extend(router.urls) diff --git a/SAS/LSMR/test/t_lsmrapp_models.py b/SAS/LSMR/test/t_lsmrapp_models.py index dac0f08415a..f90acd53fb3 100755 --- a/SAS/LSMR/test/t_lsmrapp_models.py +++ b/SAS/LSMR/test/t_lsmrapp_models.py @@ -279,7 +279,7 @@ class WorkRequestTemplateTest(rest_framework.test.APITransactionTestCase): -class WorkRelationTemplateTest(rest_framework.test.APITransactionTestCase): +class WorkRelationSelectionTemplateTest(rest_framework.test.APITransactionTestCase): reset_sequences = True @@ -302,11 +302,11 @@ class WorkRelationTemplateTest(rest_framework.test.APITransactionTestCase): pass - def test_WorkRelationTemplate_gets_created_with_correct_creation_timestamp(self): + def test_WorkRelationSelectionTemplate_gets_created_with_correct_creation_timestamp(self): # setup before = timezone.now() - entry = models.WorkRelationTemplate.objects.create(**self.test_data_1) + entry = models.WorkRelationSelectionTemplate.objects.create(**self.test_data_1) after = timezone.now() @@ -314,10 +314,10 @@ class WorkRelationTemplateTest(rest_framework.test.APITransactionTestCase): self.assertLess(before, entry.creation) self.assertGreater(after, entry.creation) - def test_WorkRelationTemplate_update_timestamp_gets_changed_correctly(self): + def test_WorkRelationSelectionTemplate_update_timestamp_gets_changed_correctly(self): # setup - entry = models.WorkRelationTemplate.objects.create(**self.test_data_1) + entry = models.WorkRelationSelectionTemplate.objects.create(**self.test_data_1) before = timezone.now() entry.version = "0.42" entry.save() @@ -327,29 +327,83 @@ class WorkRelationTemplateTest(rest_framework.test.APITransactionTestCase): self.assertLess(before, entry.update) self.assertGreater(after, entry.update) - def test_GET_WorkRelationTemplate_list_view_shows_entry(self): + def test_GET_WorkRelationSelectionTemplate_list_view_shows_entry(self): # setup - entry = models.WorkRelationTemplate.objects.create(**self.test_data_1) + entry = models.WorkRelationSelectionTemplate.objects.create(**self.test_data_1) # assert - response = client.get('/work_relation_template/', format='json', follow=True) + response = client.get('/work_relation_selection_template/', format='json', follow=True) self.assertEqual(response.status_code, 200) for item in self.test_data_1.items(): self.assertIn(item, response.data[0].items()) - def test_GET_WorkRelationTemplate_view_returns_correct_entry(self): + def test_GET_WorkRelationSelectionTemplate_view_returns_correct_entry(self): # setup - id1 = models.WorkRelationTemplate.objects.create(**self.test_data_1).id - id2 = models.WorkRelationTemplate.objects.create(**self.test_data_2).id + id1 = models.WorkRelationSelectionTemplate.objects.create(**self.test_data_1).id + id2 = models.WorkRelationSelectionTemplate.objects.create(**self.test_data_2).id # assert - response1 = client.get('/work_relation_template/%s/' % id1, format='json', follow=True) - response2 = client.get('/work_relation_template/%s/' % id2, format='json', follow=True) + response1 = client.get('/work_relation_selection_template/%s/' % id1, format='json', follow=True) + response2 = client.get('/work_relation_selection_template/%s/' % id2, format='json', follow=True) self.assertEqual(response1.status_code, 200) self.assertEqual(response2.status_code, 200) for item in self.test_data_1.items(): self.assertIn(item, response1.data.items()) for item in self.test_data_2.items(): self.assertIn(item, response2.data.items()) + + +class WorkIORolesTest(rest_framework.test.APITransactionTestCase): + + reset_sequences = True + + # test data + test_data_1 = {"role": "", + "datatype": "", + "dataformat": [], + "outputs": None, + "inputs": None, + } + + test_data_2 = {"role": "", + "datatype": "", + "dataformat": [], + "outputs": None, + "inputs": None, + } + + def setUp(self): + pass + + + def test_GET_WorkIORoles_list_view_shows_entry(self): + + # setup + entry = models.WorkIORoles.objects.create(**self.test_data_1) + + # assert + response = client.get('/work_io_roles/', format='json', follow=True) + self.assertEqual(response.status_code, 200) + for item in self.test_data_1.items(): + self.assertIn(item, response.data[0].items()) + + def test_GET_WorkIORoles_view_returns_correct_entry(self): + + # setup + id1 = models.WorkIORoles.objects.create(**self.test_data_1).id + id2 = models.WorkIORoles.objects.create(**self.test_data_2).id + + # assert + response1 = client.get('/work_io_roles/%s/' % id1, format='json', follow=True) + response2 = client.get('/work_io_roles/%s/' % id2, format='json', follow=True) + self.assertEqual(response1.status_code, 200) + self.assertEqual(response2.status_code, 200) + for item in self.test_data_1.items(): + self.assertIn(item, response1.data.items()) + for item in self.test_data_2.items(): + self.assertIn(item, response2.data.items()) + + +# todo: Tags? -> Decide how to deal with them first. -- GitLab