diff --git a/.gitattributes b/.gitattributes index 3d847740f0aee742b18ba8c2e26ab4a699072366..4f4e4ad170fd7f74280945e9e41088a541d7d6ce 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 76e3ae2945f9f5a275134363a4bf863c62c44600..2c04f26e11aa074d51131e618d85604b6310dc6d 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 9bf4885359607da477e2a051b2b5e7e5175137a2..9915ff16653ede067d6287801550c2cf957a78a8 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 5226ccbad1cbed1895e1d6c2f4816ccf7631b121..58cff4769455abeb99d784e78be8629939a6bb10 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 9b41f2ef56c9c445d7a4afc19c6f268013443bfd..9b70a05d1b004a7a08724f19c54df16d6b741b94 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 5bd60cf33a23bb46e51b74e8dc3a57578814cd36..ce4aff6ec8c51d277246783ecfe2efc21a3bf23d 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 3f13789718c8aeabc620568567240db0dbebf8ae..0522c96bdf3b3ef9b89f1d244b662d62c9cbf914 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 dac0f08415a53231f9812d3a4bb6465b02c410c8..f90acd53fb36631b1abd7e7067b4e9c7e9cd5f7e 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.